import files import os from OpenGL.GL import * from py3ds.example.gltexture import Texture class renderable_sprite(object): """ Internal class to create a textured quad for a sprite to live on. Multiple sprites can use the same sprite_tex if the graphic they want to display is the same. """ def __init__(self): self.gltex = None self.gllist = None self.texfile = None self.scale = 1.0 def load_name(self, name): self.texfile = files.mgr.open(os.path.join('sprite', name + '.png')) def set_file(self, fileobj): self.texfile = fileobj def update(self): pass def render(self): if self.gltex == None: self.gltex = Texture(self.texfile) self.texfile.close() self.texfile = None if self.gllist == None: glPushMatrix() #glLoadIdentity() dl = glGenLists(1) if dl == 0: raise GLError, "cannot allocate display list" glNewList(dl, GL_COMPILE) glEnable(GL_BLEND) glEnable(GL_DEPTH_TEST) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) self.gltex.enable() self.gltex.bind() glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) glBegin(GL_TRIANGLE_STRIP) glNormal3f(1.0, 0.0, 0.0) glTexCoord2f(1.0, 1.0); glVertex3f( 0.0, 1.0, 1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 0.0, 1.0, -1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-0.0, -1.0, 1.0) glTexCoord2f(0.0, 0.0); glVertex3f(-0.0, -1.0, -1.0) glEnd() self.gltex.disable() glDisable(GL_BLEND) glEndList() self.gllist = dl glPopMatrix() glCallList(self.gllist) class sprite_manager(object): def __init__(self): self.sprite_cache = {} def get(self, name): if name in self.sprite_cache: return self.sprite_cache[name] s = renderable_sprite() s.load_name(name) self.sprite_cache[name] = s return s mgr = sprite_manager()