roc/sprite.py
2011-06-15 19:21:13 -06:00

69 lines
No EOL
1.8 KiB
Python
Executable file

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()