Added VBOs support (vertices and normals)
This commit is contained in:
parent
1b769e05d3
commit
8f7274f525
|
@ -92,7 +92,9 @@ class ModelParser:
|
|||
self.faces = []
|
||||
self.bounding_box = BoundingBox()
|
||||
self.center_and_scale = True
|
||||
self.vbo = None
|
||||
self.vertex_vbo = None
|
||||
self.tex_coord_vbo = None
|
||||
self.normal_vbo = None
|
||||
|
||||
def add_vertex(self, vertex):
|
||||
self.vertices.append(vertex)
|
||||
|
@ -129,13 +131,19 @@ class ModelParser:
|
|||
gl.glScalef(1/scale, 1/scale, 1/scale)
|
||||
gl.glTranslatef(-center.x, -center.y, -center.z)
|
||||
|
||||
if self.vbo is not None:
|
||||
if self.vertex_vbo is not None:
|
||||
|
||||
self.vbo.bind()
|
||||
self.vertex_vbo.bind()
|
||||
gl.glEnableClientState(gl.GL_VERTEX_ARRAY);
|
||||
gl.glVertexPointerf(self.vbo)
|
||||
gl.glDrawArrays(gl.GL_TRIANGLES, 0, len(self.vbo.data) * 9)
|
||||
self.vbo.unbind()
|
||||
gl.glVertexPointerf(self.vertex_vbo)
|
||||
self.vertex_vbo.unbind()
|
||||
|
||||
self.normal_vbo.bind()
|
||||
gl.glEnableClientState(gl.GL_NORMAL_ARRAY);
|
||||
gl.glNormalPointerf(self.normal_vbo)
|
||||
self.normal_vbo.unbind()
|
||||
|
||||
gl.glDrawArrays(gl.GL_TRIANGLES, 0, len(self.vertex_vbo.data) * 9)
|
||||
|
||||
else:
|
||||
|
||||
|
@ -167,21 +175,28 @@ class ModelParser:
|
|||
if self.center_and_scale:
|
||||
gl.glPopMatrix()
|
||||
|
||||
def generate_vbo(self):
|
||||
def generate_vbos(self):
|
||||
from OpenGL.arrays import vbo
|
||||
from numpy import array
|
||||
# Build VBO
|
||||
l = []
|
||||
v = []
|
||||
n = []
|
||||
|
||||
for face in self.faces:
|
||||
v1 = self.vertices[face.a.vertex]
|
||||
v2 = self.vertices[face.b.vertex]
|
||||
v3 = self.vertices[face.c.vertex]
|
||||
l += [[v1.x, v1.y, v1.z], [v2.x, v2.y, v2.z], [v3.x, v3.y, v3.z]]
|
||||
v += [[v1.x, v1.y, v1.z], [v2.x, v2.y, v2.z], [v3.x, v3.y, v3.z]]
|
||||
|
||||
self.vbo = vbo.VBO(array(l, 'f'))
|
||||
n1 = self.normals[face.a.normal]
|
||||
n2 = self.normals[face.b.normal]
|
||||
n3 = self.normals[face.c.normal]
|
||||
n += [[n1.x, n1.y, n1.z], [n2.x, n2.y, n2.z], [n3.x, n3.y, n3.z]]
|
||||
|
||||
|
||||
self.vertex_vbo = vbo.VBO(array(v, 'f'))
|
||||
self.normal_vbo = vbo.VBO(array(n, 'f'))
|
||||
|
||||
def generate_vertex_normals(self):
|
||||
self.normals = [Normal() for i in self.vertices]
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -42,7 +42,6 @@ class TrackBallControls:
|
|||
|
||||
dV = Vertex(move[1] * time * coeff, move[0] * time * coeff, 0)
|
||||
dTheta = dV.norm2()
|
||||
print(dTheta)
|
||||
|
||||
if abs(dTheta) < 0.00001:
|
||||
return
|
||||
|
@ -96,7 +95,7 @@ def main(args):
|
|||
running = True
|
||||
|
||||
model = load_model(args.input)
|
||||
# model.generate_vbo()
|
||||
model.generate_vbos()
|
||||
|
||||
while running:
|
||||
for event in pygame.event.get():
|
||||
|
|
Loading…
Reference in New Issue