glBindTexture() problems in Python

Member
Posts: 100
Joined: 2006.05
Post: #1
I'm having some trouble switching textures with glBindTexture() in PyOpenGL. When I load the texture image, I bind it there and only there. If I do it anywhere else, I have problems. This would work fine if I only needed one texture, but, of course, I need more. Whenever I put glBindTexture() in my render loop (even if it's just one), the program locks up before even swapping the first buffer. I really don't know why it's doing this. Could someone help me out?

Code:
import os, sys
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

import pygame
from pygame.locals import *

import GLTexture

# The lower right corners of every tile

TILE_POS = (
    # Bottom Row
    (-2.0, 0.0, 2.0), (-1.0, 0.0, 2.0), (0.0, 0.0, 2.0), (1.0, 0.0, 2.0),
    # Bottom Middle Row
    (-2.0, 0.0, 1.0), (-1.0, -1.0, 1.0), (0.0, -1.0, 1.0), (1.0, 0.0, 1.0),
    # Top Middle Row
    (-2.0, 0.0, 0.0), (-1.0, -1.0, 0.0), (0.0, -1.0, 0.0), (1.0, 0.0, 0.0),
    # Top Row
    (-2.0, 0.0, -1.0), (-1.0, 0.0, -1.0), (0.0, 0.0, -1.0), (1.0, 0.0, -1.0),
    # Bottom Panels
    (-1.0, 0.0, 2.0), (0.0, 0.0, 2.0),
    # Left Panels
    (-1.0, 0.0, 1.0), (-1.0, 0.0, 0.0),
    # Top Panels
    (-1.0, -1.0, 0.0), (0.0, -1.0, 0.0),
    # Right Panels
    (1.0, -1.0, 0.0), (1.0, -1.0, 1.0)
)

# These points tell the tile which direction to "step" in when rendering the tile.
# It can be used to find the normal and it's used to orient the tile.

TILE_EDGES = (
    # Bottom Row
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    # Bottom Middle Row
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    # Top Middle Row
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    # Top Row
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0)),
    # Bottom Panels
    ((0.0, -1.0, 0.0), (1.0, 0.0, 0.0)),
    ((0.0, -1.0, 0.0), (1.0, 0.0, 0.0)),
    # Left Panels
    ((0.0, 0.0, 1.0), (0.0, -1.0, 0.0)),
    ((0.0, 0.0, 1.0), (0.0, -1.0, 0.0)),
    # Top Panels
    ((0.0, 1.0, 0.0), (1.0, 0.0, 0.0)),
    ((0.0, 1.0, 0.0), (1.0, 0.0, 0.0)),
    # Right Panels
    ((0.0, 0.0, 1.0), (0.0, 1.0, 0.0)),
    ((0.0, 0.0, 1.0), (0.0, 1.0, 0.0))
)
    
# The app
class Table:
    def init(self):
        self.camerax_rot = 45.0
        self.cameray_rot = 0.0
        self.cameraz_rot = 0.0
        
        self.camerax = 0.0
        self.cameray = 0.0
        self.cameraz = -10.0
        
        self.texture1 = 0
        self.texture2 = 0
        
        self.panelList = 0
        self.pixelList = 0
    
    def loadTextures(self):
        # Load Textures
        self.texture2 = GLTexture.loadTexture("pixel.tga", 8, 8)
        self.texture1 = GLTexture.loadTexture("texture.tga", 256, 256)
        
        # Here is where it actually works
        #glBindTexture( GL_TEXTURE_2D, self.texture1 )
            
    def update(self):
        # Rotate the Camera
        self.cameray_rot = self.cameray_rot + .1
    
    def render(self):
        a = 1.0
        s = .05
        tiles = zip(TILE_POS, TILE_EDGES)
        
        # Clear the screen
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glMatrixMode(GL_MODELVIEW)
        
        # Orient the camera
        glLoadIdentity()
        glTranslatef(self.camerax, self.cameray, self.cameraz)
        glRotatef(self.camerax_rot, 1, 0, 0)
        glRotatef(self.cameray_rot, 0, 1, 0)
        glRotatef(self.cameraz_rot, 0, 0, 1)
        
        # The first culprit
        glBindTexture( GL_TEXTURE_2D, self.texture1 )
        
        # Draw the tiles
        glBegin(GL_QUADS)        
        
        # Render all the tiles
        
        for tile in tiles:
            pos, edges = tile
            step1, step2 = edges
            x, y, z = pos
            x1, y1, z1 = step1
            x2, y2, z2 = step2
            
            glColor3f(1.0, 1.0, 1.0)
            glTexCoord2d(0.0, 0.0)
            glVertex3f(x, y, z)
            glTexCoord2d(0.0, 1.0)
            glVertex3f(x + x1, y + y1, z + z1)
            glTexCoord2d(1.0, 1.0)
            glVertex3f(x + x1 + x2, y + y1 + y2, z + z1 + z2)
            glTexCoord2d(1.0, 0.0)
            glVertex3f(x + x2, y + y2, z + z2)
        
        # The program never even reaches here
        glBindTexture( GL_TEXTURE_2D, self.texture2 )
        for tile in tiles:
            pos, edges = tile
            step1, step2 = edges
            x, y, z = pos
            x1, y1, z1 = step1
            x2, y2, z2 = step2
            
            glColor3f(0.0, 0.0, 1.0)
            glVertex3f(x, y+.01, z)
            glVertex3f(x + s*x1, y + s*y1+.01, z + s*z1)
            glVertex3f(x + s*x1 + s*x2, y + s*y1 + s*y2+.01, z + s*z1 + s*z2)
            glVertex3f(x + s*x2, y + s*y2+.01, z + s*z2)

            a = a - 0.75/24
        
        glEnd()
        
def main():

    app = Table()
    app.init()
    
    # Initialize PyGame and OpenGL stuff
    pygame.init()
    pygame.display.set_mode((800, 600), OPENGL | DOUBLEBUF)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_TEXTURE_2D)
    
    glMatrixMode(GL_PROJECTION)
    gluPerspective(43.0, 800/600, 0.1, 100.0)
    
    app.loadTextures()
    
    # The event loop
    while True:
        event = pygame.event.poll()
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            break
        
        app.update()
        app.render()
        pygame.display.flip()
        pygame.time.wait(1)
        
if __name__ == '__main__': main()
Quote this message in a reply
Moderator
Posts: 133
Joined: 2008.05
Post: #2
You can't bind a texture in a Begin/End block. Check your man pages.
Quote this message in a reply
Luminary
Posts: 5,143
Joined: 2002.04
Post: #3
... and your GL errors Wink
Quote this message in a reply
Member
Posts: 100
Joined: 2006.05
Post: #4
Wow. That's so simple, and yet it gave me about half an hour of frustration. Thanks again.
Quote this message in a reply
Post Reply 

Possibly Related Threads...
Thread: Author Replies: Views: Last Post
  Python for games? DEV_JS 2 2,452 Apr 12, 2013 05:15 PM
Last Post: Evan Stallings
  Python Compiler wyrmmage 3 3,994 Jul 30, 2009 10:14 PM
Last Post: wyrmmage
  Very stupid question about Python on OS X Durandal 10 8,335 Dec 17, 2008 09:33 AM
Last Post: Duane
  Text based RPG in Python pipposanta 7 8,193 Feb 27, 2008 09:10 AM
Last Post: pipposanta
  So... anyone doing any stuff in Python/Pygame...? Malarkey 12 6,542 Aug 23, 2007 12:09 PM
Last Post: Malarkey