texture rendering fixes

font rendering fixes
FPS counter added
particle demo added
This commit is contained in:
cecilkorik 2011-12-12 09:42:12 -07:00
parent ab901dc58f
commit 5f3e46d7bb
15 changed files with 447 additions and 73 deletions

View file

@ -11,4 +11,30 @@
<material><ref>mat_test</ref></material> <material><ref>mat_test</ref></material>
</render> </render>
</model> </model>
<model id="m_star">
<render layer="0">
<mesh><ref>mesh_sprite</ref><scale x="200" y="200"/></mesh>
<material><ref>mat_star</ref></material>
</render>
</model>
<model id="m_star_tiny">
<render layer="0">
<mesh><ref>mesh_centered_sprite</ref><scale x="40" y="40"/></mesh>
<material><ref>mat_star</ref></material>
</render>
</model>
<model id="m_particle">
<render layer="0">
<mesh><ref>mesh_centered_sprite</ref><scale x="16" y="16"/></mesh>
<material><ref>mat_particle</ref></material>
</render>
</model>
<model id="m_dralthi">
<render layer="0">
<mesh><ref>mesh_centered_sprite</ref><scale x="50" y="50"/></mesh>
<material><ref>mat_dralthi</ref></material>
</render>
</model>
</models> </models>

View file

@ -19,6 +19,16 @@
<texture id="t_test"> <texture id="t_test">
<file>tex/test1.png</file> <file>tex/test1.png</file>
</texture> </texture>
<texture id="t_particle">
<file>tex/whitelight_static.png</file>
</texture>
<texture id="t_star">
<file>tex/star_sprite_main.png</file>
</texture>
<texture id="t_dralthi">
<file>tex/dralthi.png</file>
</texture>
<texture id="t_test_plasma"> <texture id="t_test_plasma">
<file>tex/plasma1.png</file> <file>tex/plasma1.png</file>
</texture> </texture>
@ -28,4 +38,13 @@
<material id="mat_test"> <material id="mat_test">
<texture ref="t_test"/> <texture ref="t_test"/>
</material> </material>
<material id="mat_star">
<texture ref="t_star"/>
</material>
<material id="mat_particle">
<texture ref="t_particle"/>
</material>
<material id="mat_dralthi">
<texture ref="t_dralthi"/>
</material>
</textures> </textures>

View file

@ -11,9 +11,11 @@ class TextureFile(object):
def load(self, filename): def load(self, filename):
self.filename = filename self.filename = filename
img = files.mgr.png(filename) img = pygame.image.load(filename)
img.convert_alpha()
glActiveTexture(GL_TEXTURE0)
texid = glGenTextures(1) texid = glGenTextures(1)
print "Generated texture id %s" % (texid,) #print "Generated font texture id %s" % (texid,)
self.id = texid self.id = texid
@ -25,8 +27,11 @@ class TextureFile(object):
dimension = GL_TEXTURE_2D dimension = GL_TEXTURE_2D
glBindTexture(dimension, texid) glBindTexture(dimension, texid)
glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata) glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata)
glBindTexture(dimension, 0) glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
class TexFont(object): class TexFont(object):
def __init__(self): def __init__(self):
self.image = None self.image = None
@ -41,6 +46,7 @@ class TexFont(object):
self.gltex = None self.gltex = None
self.monospace = False self.monospace = False
self.charsizes = [] self.charsizes = []
self.colors = (1.0, 1.0, 1.0, 1.0)
@staticmethod @staticmethod
def new(fontdir, fontname): def new(fontdir, fontname):
@ -49,7 +55,52 @@ class TexFont(object):
tf.load_texture(os.path.join(fontdir, "%s.png" % (fontname,))) tf.load_texture(os.path.join(fontdir, "%s.png" % (fontname,)))
return tf return tf
def render def render(self, text, color=None):
if color is None:
color = self.colors
#print "Binding texture %s" % (self.gltex.id,)
glActiveTexture(GL_TEXTURE0)
dimension = GL_TEXTURE_2D
glBindTexture(GL_TEXTURE_2D, self.gltex.id)
glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glBegin(GL_TRIANGLES)
glNormal3f(0.0, 0.0, 1.0)
glColor4f(*color)
#print "Rendering font"
offset = 0.0
for i, letter in enumerate(text):
offset = self.render_letter(letter, offset)
glEnd()
def render_letter(self, letter, offset):
charidx = self.mapchar(letter)
x1, y1, x2, y2 = self.get_coordinates(charidx)
cx, cy = self.charsize(charidx)
#print "Printing letter %s(%s) from %s, %s to %s, %s using texcoords %s, %s, %s, %s" % (letter, charidx, offset, 0.0, offset + cx, cy, x1*128.0, y1*128.0, x2*128.0, y2*128.0)
glTexCoord2f(x1, y1); glVertex3f( offset + 0.0, 0.0, 0.0)
glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0)
glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0)
glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0)
glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0)
glTexCoord2f(x2, y2); glVertex3f( offset + cx, cy, 0.0)
glTexCoord2f(0.0, 0.0)
return offset + cx
def charsize(self, idx):
if self.monospace:
return (self.charwidth, self.charheight)
else:
return self.charsizes[idx]
def mapchar(self, char): def mapchar(self, char):
""" """
@ -67,9 +118,9 @@ class TexFont(object):
char = ord(char) char = ord(char)
if char >= self.start and char < self.end: if char >= self.start and char < self.end:
return self.end - self.start - 1
else:
return char - self.start return char - self.start
else:
return self.end - self.start - 1
def get_coordinates(self, idx): def get_coordinates(self, idx):
@ -81,15 +132,15 @@ class TexFont(object):
if idx < 0 or idx >= (self.end - self.start): if idx < 0 or idx >= (self.end - self.start):
idx = (self.end - self.start - 1) idx = (self.end - self.start - 1)
xp1 = (idx % self.cols) * self.charwidth xp1 = (idx % self.cols) * (self.charwidth + 1)
yp1 = (idx // self.cols) * self.charheight yp1 = (idx // self.cols) * (self.charheight + 1)
if self.monospace: if self.monospace:
xp2 = xp + self.charwidth xp2 = xp1 + self.charwidth + 1
yp2 = yp + self.charheight yp2 = yp1 + self.charheight + 1
else: else:
xp2 = xp + self.charsizes[idx][0] xp2 = xp1 + self.charsizes[idx][0] + 1
yp2 = yp + self.charsizes[idx][1] yp2 = yp1 + self.charsizes[idx][1] + 1
xtc1 = (float(xp1) + 0.0) / self.texwidth xtc1 = (float(xp1) + 0.0) / self.texwidth
ytc1 = (float(yp1) + 0.0) / self.texheight ytc1 = (float(yp1) + 0.0) / self.texheight
@ -120,6 +171,9 @@ class TexFont(object):
self.cols, self.rows = nextline(dd) self.cols, self.rows = nextline(dd)
self.texwidth, self.texheight = nextline(dd) self.texwidth, self.texheight = nextline(dd)
self.charwidth -= 1
self.charheight -= 1
assert dd.readline() == "charsizes\n" assert dd.readline() == "charsizes\n"
self.charsizes = [None] * (self.end - self.start) self.charsizes = [None] * (self.end - self.start)

View file

@ -1,10 +1,12 @@
import pygame import pygame
import collections
def start_loop(): def start_loop():
global g_timer, g_elapsed global g_timer, g_elapsed
g_elapsed = 0 g_elapsed = 0
g_elapsed_sec = 0.0 g_elapsed_sec = 0.0
g_timer = pygame.time.get_ticks() g_timer = pygame.time.get_ticks()
reset_fps_count()
def next_frame(skipping=False): def next_frame(skipping=False):
global g_timer, g_elapsed, g_elapsed_sec global g_timer, g_elapsed, g_elapsed_sec
@ -16,6 +18,30 @@ def next_frame(skipping=False):
g_elapsed = newticks - g_timer g_elapsed = newticks - g_timer
g_timer = newticks g_timer = newticks
g_elapsed_sec = float(g_elapsed) / 1000.0 g_elapsed_sec = float(g_elapsed) / 1000.0
if g_elapsed != 0:
update_fps_count(g_elapsed)
def reset_fps_count():
global g_framelist, update_fps_count
g_framelist = collections.deque()
update_fps_count = update_fps_count_empty
def update_fps_count_empty(elapsed):
global g_framelist, update_fps_count
g_framelist.append(elapsed)
if len(g_framelist) >= 25:
update_fps_count = update_fps_count_full
def update_fps_count_full(elapsed):
global g_framelist
g_framelist.popleft()
g_framelist.append(elapsed)
def update_fps_count(elapsed):
"this is replaced with either the _empty or _full variant, depending on the situation"
pass
def elapsed(): def elapsed():
""" """
@ -33,9 +59,61 @@ def num_frames(delay, offset=0):
""" """
if you want something to occur every "delay" milliseconds, if you want something to occur every "delay" milliseconds,
this will return the number of times you should make it happen this will return the number of times you should make it happen
in this particular frame (can be 0)
""" """
global g_elapsed, g_timer global g_elapsed, g_timer
return int((g_timer - offset) / delay) - int((g_timer - g_elapsed - offset) / delay) return int((g_timer - offset) / delay) - int((g_timer - g_elapsed - offset) / delay)
def loop_frames(delay, offset=0):
return xrange(num_frames(delay, offset))
def get_timer(): def get_timer():
return g_timer return g_timer
def average(d):
#spf = (float(sum(g_framelist)) / (len(g_framelist) * 1000.0))
if len(d) == 0:
return 0.0
smooth = 0.85
#v2 = float(d[-1])
#for i in xrange(len(d) - 2, 0, -1):
# pass
v2 = float(d[0])
for i in xrange(1, len(d)):
v1 = float(d[i])
v2 = (smooth * v2) + ((1.0 - smooth) * v1)
return v2
def get_fps():
global g_framelist
#return ",".join([str(x) for x in sorted(g_framelist)])
if len(g_framelist) == 0.0:
return 0.0
spf = average(g_framelist) / 1000.0
if spf == 0.0:
return 0.0
#print "%s < %s" % (1.0 / spf, g_framelist)
return 1.0 / spf

148
models.py
View file

@ -1,9 +1,13 @@
import os
import glob
import enums import enums
import files import files
import gamedata import gamedata
import pygame import pygame
from OpenGL.GL import * from OpenGL.GL import *
from py3dutil import vect from py3dutil import vect
import fonts
import collections
class Vertex(object): class Vertex(object):
__slots__ = [ __slots__ = [
@ -21,7 +25,8 @@ class Vertex(object):
class Model_Manager(object): class Model_Manager(object):
def __init__(self): def __init__(self):
pass self.centered_sprite_mesh = None
self.sprite_mesh = None
def create(self, mname): def create(self, mname):
return self.models[mname].instance() return self.models[mname].instance()
@ -37,10 +42,11 @@ class Model_Manager(object):
self.load_textures() self.load_textures()
self.load_materials() self.load_materials()
self.load_models() self.load_models()
self.load_fonts()
def load_textypes(self): def load_textypes(self):
self.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.diffuse] = TextureType(GL_TEXTURE0, GL_TEXTURE_2D, GL_CLAMP, GL_CLAMP, GL_LINEAR, GL_LINEAR)
self.textypes[enums.tt.emissive] = TextureType(GL_TEXTURE1, GL_TEXTURE_2D) self.textypes[enums.tt.emissive] = TextureType(GL_TEXTURE1, GL_TEXTURE_2D)
self.textypes[enums.tt.specular] = TextureType(GL_TEXTURE2, 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) self.textypes[enums.tt.normal] = TextureType(GL_TEXTURE3, GL_TEXTURE_2D)
@ -91,9 +97,12 @@ class Model_Manager(object):
self.models = {} self.models = {}
for meshdata in mdldata.mesh: for meshdata in mdldata.mesh:
if meshdata['sprite']: if meshdata['sprite']:
mesh = SpriteMesh.singleton() self.sprite_mesh = SpriteMesh()
mesh = self.sprite_mesh
elif meshdata['centered_sprite']: elif meshdata['centered_sprite']:
mesh = SpriteMeshCentered.singleton() if self.centered_sprite_mesh == None:
self.centered_sprite_mesh = SpriteMeshCentered()
mesh = self.centered_sprite_mesh
else: else:
mesh = Mesh.factory(meshdata) mesh = Mesh.factory(meshdata)
mgr.meshes[meshdata['id']] = mesh mgr.meshes[meshdata['id']] = mesh
@ -102,6 +111,18 @@ class Model_Manager(object):
model = Model() model = Model()
model.load(modeldata) model.load(modeldata)
mgr.models[modeldata['id']] = model mgr.models[modeldata['id']] = model
def load_fonts(self):
self.fontlib = {}
fontdir = os.path.join(files.get_basedir(), 'data', 'font')
for fontfile in glob.glob(os.path.join(fontdir, '*.tfd')):
fontname = os.path.splitext(os.path.split(fontfile)[1])[0]
fontobj = fonts.TexFont.new(fontdir, fontname)
self.fontlib[fontname] = fontobj
print "Loaded font %s" % (fontname,)
def get_font(self, name):
return self.fontlib[name]
class TextureType(object): class TextureType(object):
def __init__(self, texunit, texdim, wrap_s=GL_CLAMP, wrap_t=GL_CLAMP, mag=GL_LINEAR, min=GL_LINEAR): def __init__(self, texunit, texdim, wrap_s=GL_CLAMP, wrap_t=GL_CLAMP, mag=GL_LINEAR, min=GL_LINEAR):
@ -113,11 +134,13 @@ class TextureType(object):
self.min = min self.min = min
def initialize(self): def initialize(self):
glActiveTexture(self.texunit) return
glTexParameterf(self.texdim, GL_TEXTURE_WRAP_S, self.wrap_s)
glTexParameterf(self.texdim, GL_TEXTURE_WRAP_T, self.wrap_t) def apply_parameters(self):
glTexParameterf(self.texdim, GL_TEXTURE_MAG_FILTER, self.mag) glTexParameteri(self.texdim, GL_TEXTURE_WRAP_S, self.wrap_s)
glTexParameterf(self.texdim, GL_TEXTURE_MIN_FILTER, self.min) glTexParameteri(self.texdim, GL_TEXTURE_WRAP_T, self.wrap_t)
glTexParameteri(self.texdim, GL_TEXTURE_MAG_FILTER, self.mag)
glTexParameteri(self.texdim, GL_TEXTURE_MIN_FILTER, self.min)
def get_dimension(self): def get_dimension(self):
return self.texdim return self.texdim
@ -175,8 +198,10 @@ class Texture(object):
self.texcoords = self.texcoords_direct self.texcoords = self.texcoords_direct
#self.texcoords = self.texcoords_subset #self.texcoords = self.texcoords_subset
def bind(self): def bind(self, textype):
textype.activate()
glBindTexture(GL_TEXTURE_2D, self.texid) glBindTexture(GL_TEXTURE_2D, self.texid)
textype.apply_parameters()
class TextureFile(object): class TextureFile(object):
def __init__(self): def __init__(self):
@ -189,7 +214,7 @@ class TextureFile(object):
self.filename = filename self.filename = filename
img = files.mgr.png(filename) img = files.mgr.png(filename)
texid = glGenTextures(1) texid = glGenTextures(1)
print "Generated texture id %s" % (texid,) print "Generated texture id %s from %s" % (texid, self.filename)
self.id = texid self.id = texid
@ -201,7 +226,9 @@ class TextureFile(object):
dimension = GL_TEXTURE_2D dimension = GL_TEXTURE_2D
glBindTexture(dimension, texid) glBindTexture(dimension, texid)
glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata) glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata)
glBindTexture(dimension, 0)
#glBindTexture(dimension, 0)
@ -219,9 +246,10 @@ class Material(object):
for tt in enums.tt: for tt in enums.tt:
if tt in self.textures: if tt in self.textures:
tto = mgr.get_textype(tt) tto = mgr.get_textype(tt)
tto.initialize() tto.activate()
tex = self.textures[tt] tex = self.textures[tt]
tex.bind() #print "Binding texture %s" % (tex.texid,)
tex.bind(tto)
def load(self, data): def load(self, data):
self.id = data['id'] self.id = data['id']
@ -245,8 +273,7 @@ class Material(object):
self.texcoords = texobj.texcoords self.texcoords = texobj.texcoords
prevtex = texobj prevtex = texobj
print self.textures
class Mesh(object): class Mesh(object):
@ -267,7 +294,8 @@ class Mesh(object):
glEnd() glEnd()
def draw_vertex(self, v, texcoord): def draw_vertex(self, v, texcoord):
glColor3f(v.c[0], v.c[1], v.c[2]) if v.c != None:
glColor3f(v.c[0], v.c[1], v.c[2])
glNormal3f(v.n.x, v.n.y, v.n.z) glNormal3f(v.n.x, v.n.y, v.n.z)
glTexCoord2f(*texcoord(v.t[0], v.t[1])) glTexCoord2f(*texcoord(v.t[0], v.t[1]))
glVertex3f(v.v.x, v.v.y, v.v.z) glVertex3f(v.v.x, v.v.y, v.v.z)
@ -275,40 +303,35 @@ class Mesh(object):
class SpriteMesh(Mesh): class SpriteMesh(Mesh):
_SINGLETON = None
def __init__(self): def __init__(self):
Mesh.__init__(self) Mesh.__init__(self)
self.vertexes = [ self.vertexes = [
Vertex(vect(0.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect(0.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 0.0), None),
Vertex(vect(0.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect(0.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
Vertex(vect(1.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect(1.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), None),
Vertex(vect(1.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect(1.0, 0.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), None),
Vertex(vect(0.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect(0.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
Vertex(vect(1.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect(1.0, 1.0, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), None),
] ]
@classmethod
def return_singleton(cls):
return cls._SINGLETON
@classmethod @classmethod
def singleton(cls): def singleton(cls):
cls._SINGLETON = cls() if cls.__SINGLETON == None:
cls.singleton = cls.return_singleton cls.__SINGLETON = cls()
return cls._SINGLETON
return cls.__SINGLETON
class SpriteMeshCentered(SpriteMesh): class SpriteMeshCentered(SpriteMesh):
def __init__(self): def __init__(self):
SpriteMesh.__init__(self) SpriteMesh.__init__(self)
self.vertexes = [ self.vertexes = [
Vertex(vect(-0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect(-0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 0.0), None),
Vertex(vect( 0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect( 0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), None),
Vertex(vect( 0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), (1.0, 1.0, 1.0)), Vertex(vect( 0.5, -0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 0.0), None),
Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect(-0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (0.0, 1.0), None),
Vertex(vect( 0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), (1.0, 1.0, 1.0)), Vertex(vect( 0.5, 0.5, 0.0), vect(0.0, 0.0, 1.0), (1.0, 1.0), None),
] ]
class RenderLayer(object): class RenderLayer(object):
@ -316,7 +339,7 @@ class RenderLayer(object):
self.id = layernum self.id = layernum
self.mesh = None self.mesh = None
self.material = None self.material = None
self.color = [1.0, 1.0, 1.0, 1.0] self.color = None
self.scale = [1.0, 1.0, 1.0] self.scale = [1.0, 1.0, 1.0]
self.displaylist = None self.displaylist = None
self.anim = "idle" self.anim = "idle"
@ -334,6 +357,8 @@ class RenderLayer(object):
self.material.bind() self.material.bind()
glPushMatrix() glPushMatrix()
glScalef(*self.scale) glScalef(*self.scale)
if self.color != None:
glColor4f(*self.color)
if self.displaylist == None: if self.displaylist == None:
self.displaylist = glGenLists(1) self.displaylist = glGenLists(1)
@ -341,10 +366,18 @@ class RenderLayer(object):
self.mesh.draw(self.material.texcoords) self.mesh.draw(self.material.texcoords)
glEndList() glEndList()
#print "Drawing mesh %s" % ( self.displaylist, )
glCallList(self.displaylist) glCallList(self.displaylist)
glPopMatrix() glPopMatrix()
class ParticleLayer(RenderLayer):
def __init__(self, layernum):
RenderLayer.__init__(self, layernum)
self.particles = collections.deque()
def render(self):
pass
class Model(object): class Model(object):
def __init__(self): def __init__(self):
@ -368,6 +401,41 @@ class Model(object):
for layer in self.layers: for layer in self.layers:
layer.render() layer.render()
class TextModel(Model):
def __init__(self, fontname, text, color=None, scale=None):
self.displaylist = None
self.fontname = fontname
self.text = text
self.color = color
self.scale = scale
if self.scale == None:
self.scale = (1.0, 1.0, 1.0)
def load(self, data):
pass
def instance(self):
return self
def render(self):
glPushMatrix()
glScalef(*self.scale)
if self.color != None:
glColor4f(*self.color)
if self.displaylist == None:
self.displaylist = glGenLists(1)
glNewList(self.displaylist, GL_COMPILE)
font = mgr.get_font(self.fontname)
font.render(self.text, self.color)
glEndList()
#print "Drawing mesh %s" % ( self.displaylist, )
glCallList(self.displaylist)
glPopMatrix()
def init(): def init():
global mgr global mgr
mgr = Model_Manager() mgr = Model_Manager()

View file

@ -3,14 +3,80 @@ import pygame
from OpenGL.GL import * from OpenGL.GL import *
from py3dutil import vect, quat from py3dutil import vect, quat
import models import models
from platform_win32 import * import fonts
import gametimer
from platform import *
import pipeline
import time
import collections
import random
import math
class partycle(object):
def __init__(self, x, y, xd, yd, rot, rotd, color):
self.x = x
self.y = y
self.xd = xd
self.yd = yd
self.rot = rot
self.rotd = rotd
self.color = color
@classmethod
def random(cls):
x, y = [((random.random() * 2.0) - 1.0) * 10.0 for _ in xrange(2)]
xd, yd = [((random.random() * 2.0) - 1.0) * 4.0 for _ in xrange(2)]
hue = random.random()
m1 = 1.0
h1 = hue * 6.0
s1 = 1.0 - abs((h1 % 2.0) - 1.0)
if h1 < 1.0:
r, g, b = 1.0, s1, 0.0
elif h1 < 2.0:
r, g, b = s1, 1.0, 0.0
elif h1 < 3.0:
r, g, b = 0.0, 1.0, s1
elif h1 < 4.0:
r, g, b = 0.0, s1, 1.0
elif h1 < 5.0:
r, g, b = s1, 0.0, 1.0
elif h1 < 6.0:
r, g, b = 1.0, 0.0, s1
rot = random.random() * 90.0
rotd = ((random.random() * 2.0) - 1.0) * 3.0
rv = cls(x, y, xd, yd, rot, rotd, (r, g, b, 1.0))
return rv
def movestep(self):
self.x += self.xd
self.y += self.yd
self.xd *= 0.985
self.yd *= 0.985
self.rot += self.rotd
class test_universe(roc.base_universe): class test_universe(roc.base_universe):
def __init__(self):
self.font = models.mgr.fontlib["micross20"]
self.text1 = models.TextModel("micross20", "#$% 0123 ,,,, Hello world!\xa8\xa8\xa8F", (1.0, 1.0, 0.5, 1.0))
self.string = ""
self.move = 199.0
self.moveinc = 1.0
self.particles = collections.deque()
self.particles.append(partycle.random())
def frame(self, events): def frame(self, events):
#print "*** Starting frame"
# pink triangle # pink triangle
glDisable(GL_BLEND)
glDisable(GL_TEXTURE_2D)
glBegin(GL_TRIANGLE_STRIP) glBegin(GL_TRIANGLE_STRIP)
glNormal3f(0.0, 0.0, 1.0) glNormal3f(0.0, 0.0, 1.0)
glColor4f(1.0, 0.0, 0.5, 1.0) glTexCoord2f(0.0, 0.0)
glColor4f(1.0, 0.0, 0.5, 0.0)
glVertex3f( 20.0, 50.0, 1.0) glVertex3f( 20.0, 50.0, 1.0)
glVertex3f( 20.0, 600.0, 1.0) glVertex3f( 20.0, 600.0, 1.0)
glVertex3f( 400.0, 50.0, 1.0) glVertex3f( 400.0, 50.0, 1.0)
@ -19,12 +85,16 @@ class test_universe(roc.base_universe):
# yellow square # yellow square
glBegin(GL_TRIANGLE_STRIP) glBegin(GL_TRIANGLE_STRIP)
glNormal3f(0.0, 0.0, 1.0) glNormal3f(0.0, 0.0, 1.0)
glColor4f(0.0, 0.2, 0.5, 1.0) glTexCoord2f(0.0, 0.0)
glColor4f(0.0, 0.2, 0.5, 0.8)
glVertex3f( 150.0, 20.0, -50.0) glVertex3f( 150.0, 20.0, -50.0)
glVertex3f( 150.0, 400.0, -50.0) glVertex3f( 150.0, 400.0, -50.0)
glVertex3f( 360.0, 20.0, -50.0) glVertex3f( 360.0, 20.0, -50.0)
glVertex3f( 360.0, 400.0, -50.0) glVertex3f( 360.0, 400.0, -50.0)
glEnd() glEnd()
glEnable(GL_BLEND)
glEnable(GL_TEXTURE_2D)
glColor4f(1.0, 1.0, 1.0, 1.0)
# texture test # texture test
mdl = models.mgr.create("m_test") mdl = models.mgr.create("m_test")
@ -33,6 +103,63 @@ class test_universe(roc.base_universe):
mdl.render() mdl.render()
glPopMatrix() glPopMatrix()
# font test
glPushMatrix()
glTranslate(200.0, 200.0, 5.0)
self.text1.render()
glPopMatrix()
for x in xrange(gametimer.num_frames(10)):
self.move = self.move + self.moveinc
if self.move > 300.0:
self.moveinc = -1.0
elif self.move < 200.0:
self.moveinc = 1.0
for party in self.particles:
party.movestep()
if self.moveinc > 0.0:
party = partycle.random()
self.particles.append(party)
#print party.color
else:
self.particles.popleft()
glPushMatrix()
glTranslate(self.move, 250.0, 5.0)
"""
if len(self.string) > 61:
self.string = ""
for x in xrange(gametimer.num_frames(1000)):
self.string = self.string + str(len(self.string) % 10)
"""
for x in xrange(gametimer.num_frames(100)):
self.string = str(round(gametimer.get_fps(), 1))
#print len(gametimer.g_framelist)
self.font.render(self.string)
glPopMatrix()
# texture test
mdl2 = models.mgr.create("m_dralthi")
mdl2.layers[0].color = None
#print mdl2.layers[0].mesh
for party in self.particles:
glPushMatrix()
glTranslate(600.0 + party.x, 350.0 + party.y, 6.0)
glRotate(party.rot, 0.0, 0.0, 1.0)
#glColor4f(*party.color)
mdl2.render()
glPopMatrix()
roc.init2d() roc.init2d()

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
14,9 9,14
8,13 13,8
128,128 128,128
charsizes charsizes
8,13 8,13

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
25,21 21,25
9,11 11,9
256,256 256,256
charsizes charsizes
5,24 5,24

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
49,43 43,49
10,11 11,10
512,512 512,512
charsizes charsizes
11,48 11,48

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
11,7 7,11
8,13 13,8
128,128 128,128
charsizes charsizes
6,10 6,10

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
12,8
8,12 8,12
12,8
128,128 128,128
charsizes charsizes
7,11 7,11

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
11,7 7,11
8,13 13,8
128,128 128,128
charsizes charsizes
6,10 6,10

View file

@ -1,7 +1,7 @@
fontheader fontheader
32,128 32,128
16,9 9,16
8,14 14,8
128,128 128,128
charsizes charsizes
8,15 8,15

View file

@ -81,8 +81,8 @@ pygame.image.save(tex, "%s.png" % (fontname,))
datf = open("%s.tfd" % (fontname,), "w") datf = open("%s.tfd" % (fontname,), "w")
datf.write("fontheader\n") datf.write("fontheader\n")
datf.write("%s,%s\n" % (start, end)) datf.write("%s,%s\n" % (start, end))
datf.write("%s,%s\n" % (maxheight, maxwidth)) datf.write("%s,%s\n" % (maxwidth, maxheight))
datf.write("%s,%s\n" % (ratioheight, ratiowidth)) datf.write("%s,%s\n" % (ratiowidth, ratioheight))
datf.write("%s,%s\n" % (texsize, texsize)) datf.write("%s,%s\n" % (texsize, texsize))
datf.write("charsizes\n") datf.write("charsizes\n")
for i, sz in enumerate(imsizes): for i, sz in enumerate(imsizes):

View file

@ -72,7 +72,7 @@ def init2d():
#glRotatef(120.0, 1.0, 0.0, 0.0) #glRotatef(120.0, 1.0, 0.0, 0.0)
glClearColor(0.0, 0.0, 0.0, 0.0) glClearColor(0.0, 0.0, 0.0, 0.5)
glClearDepth(-256.0) glClearDepth(-256.0)
glShadeModel(GL_SMOOTH) glShadeModel(GL_SMOOTH)
@ -81,6 +81,8 @@ def init2d():
glEnable(GL_TEXTURE_2D) glEnable(GL_TEXTURE_2D)
glDepthFunc(GL_GEQUAL) glDepthFunc(GL_GEQUAL)
glEnable(GL_BLEND) glEnable(GL_BLEND)
glDisable(GL_ALPHA_TEST)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (0.3, 0.3, 0.3, 1.0)) glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (0.3, 0.3, 0.3, 1.0))
@ -100,7 +102,7 @@ def init3d():
glLoadIdentity() glLoadIdentity()
glShadeModel(GL_SMOOTH) glShadeModel(GL_SMOOTH)
glClearColor(0.0, 0.0, 0.0, 0.0) glClearColor(0.0, 0.0, 0.0, 1.0)
glClearDepth(1.0) glClearDepth(1.0)
glEnable(GL_DEPTH_TEST) glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE) glEnable(GL_CULL_FACE)