69 lines
No EOL
1.8 KiB
Python
Executable file
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() |