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

146 lines
No EOL
3.3 KiB
Python
Executable file

import enums
class Vertex(object):
__slots__ = [
'v', # vertex coordinates
'n', # normal
't', # texture coordinates
'c', # color
]
class Model_Manager(object):
def __init__(self):
self.load_textypes()
self.load_textures()
self.load_materials()
self.load_models()
def load_textypes():
self.textypes = {}
self.textypes[enums.tt.diffuse] = TextureType(GL_TEXTURE0, GL_TEXTURE_2D, GL_CLAMP, GL_CLAMP, GL_NEAREST, GL_NEAREST)
self.textypes[enums.tt.dark] = TextureType(GL_TEXTURE1, GL_TEXTURE_2D)
self.textypes[enums.tt.specular] = TextureType(GL_TEXTURE2, GL_TEXTURE_2D)
self.textypes[enums.tt.normal] = TextureType(GL_TEXTURE3, GL_TEXTURE_2D)
def get_textype(self, textype):
if isinstance(textype, TextureType):
return textype
return self.textypes[textype]
def load_textures(self):
gamedata.get('textures')
def load_textures(self):
gamedata.get('materials')
def load_textures(self):
gamedata.get('models')
mgr = Model_Manager()
class TextureType(object):
def __init__(self, texunit, texdim, wrap_s=GL_CLAMP, wrap_t=GL_CLAMP, mag=GL_LINEAR, min=GL_LINEAR)
self.texunit = texunit
self.texdim = texdim
self.wrap_s = wrap_s
self.wrap_t = wrap_t
self.mag = mag
self.min = min
def initialize(self):
glActiveTexture(self.texunit)
glTexParameterf(self.texdim, GL_TEXTURE_WRAP_S, self.wrap_s)
glTexParameterf(self.texdim, GL_TEXTURE_WRAP_T, self.wrap_t)
glTexParameterf(self.texdim, GL_TEXTURE_MAG_FILTER, self.mag)
glTexParameterf(self.texdim, GL_TEXTURE_MIN_FILTER, self.min)
def get_dimension(self):
return self.texdim
def activate(self):
glActiveTexture(self.texunit)
class Material(object):
def __init__(self):
pass
def attach_texture(self, textype, texid):
textype = mgr.get_textype(textype)
textype.activate()
self.texid
class Texture(object):
def __init__(self):
pass
def load(self, file):
img = files.mgr.png(file)
texid, = glGenTextures(1)
self.id = texid
imgdata = pygame.image.tostring(img, "RGBA")
imgr = img.get_rect()
glBindTexture(textype.get_dimension(), texid)
glTexImage2D(textype.get_dimension(), 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata)
glBindTexture(textype.get_dimension(), 0)
class Model(object):
def __init__(self):
self.vertexes = []
def set_rotation(self):
glPushMatrix()
glMultMatrixf(self.rot.get_matrix())
def unset_rotation(self):
glPopMatrix()
def bind_textures(self):
glBindTexture(GL_TEXTURE_2D
def unbind_textures(self):
def draw(self):
self.bind_textures()
glBegin(GL_TRIANGLES)
for v in self.vertexes:
self.draw_vertex(v)
glEnd(GL_TRIANGLES)
self.unbind_textures()
def draw_vertex(self, v):
glColor3f(v.c[0], v.c[1], v.c[2])
glNormal3f(v.n.x, v.n.y, v.n.z)
glTexCoord2f(v.t[0], v.t[1])
glVertex3f(v.v.x, v.v.y, v.v.z)
class Sprite(object):
def __init__(self):
Model.__init__(self)
vl = [Vertex() for x in xrange(4)]
normal = vect(0.0, 0.0, 1.0)
white = (1.0, 1.0, 1.0)
for v in vl:
v.n = normal
v.c = white
tl, bl, tr, br = vl
tl.v = vect(-0.5, -0.5, 0.0); tl.t = (0.0, 0.0)
bl.v = vect(-0.5, 0.5, 0.0); bl.t = (0.0, 1.0)
tr.v = vect( 0.5, -0.5, 0.0); tr.t = (1.0, 0.0)
br.v = vect( 0.5, 0.5, 0.0); br.t = (1.0, 1.0)
self.corners = vl
self.vertexes = [tl, bl, tr, bl, tr, br]
def set_texture(