Skip to content

Commit 5d0df07

Browse files
committed
Wavefront properly array and cached loader
1 parent 6cdabe6 commit 5d0df07

File tree

2 files changed

+39
-14
lines changed

2 files changed

+39
-14
lines changed

demosys/opengl/vao.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def __init__(self, name, mode=moderngl.TRIANGLES):
8787
:param name: The name for debug purposes
8888
:param mode: Default draw mode for this VAO
8989
"""
90+
self.ctx = context.ctx()
9091
self.name = name
9192
self.mode = mode
9293

@@ -156,11 +157,14 @@ def buffer(self, buffer, buffer_format: str, attribute_names, per_instance=False
156157
if not isinstance(attribute_names, list):
157158
attribute_names = [attribute_names, ]
158159

159-
if not isinstance(buffer, moderngl.Buffer) and not isinstance(buffer, numpy.ndarray):
160-
raise VAOError("buffer parameter must be a moderngl.Buffer or numpy.ndarray instance")
160+
if not type(buffer) in [moderngl.Buffer, numpy.ndarray, bytes]:
161+
raise VAOError("buffer parameter must be a moderngl.Buffer, numpy.ndarray or bytes instance")
161162

162163
if isinstance(buffer, numpy.ndarray):
163-
buffer = context.ctx().buffer(buffer.tobytes())
164+
buffer = self.ctx.buffer(buffer.tobytes())
165+
166+
if isinstance(buffer, bytes):
167+
buffer = self.ctx.buffer(data=buffer)
164168

165169
formats = buffer_format.split()
166170
if len(formats) != len(attribute_names):
@@ -178,11 +182,14 @@ def index_buffer(self, buffer, index_element_size=4):
178182
:param buffer: Buffer object or ndarray
179183
:param index_element_size: Byte size of each element. 1, 2 or 4
180184
"""
181-
if not isinstance(buffer, moderngl.Buffer) and not isinstance(buffer, numpy.ndarray):
182-
raise VAOError("buffer parameter must be a moderngl.Buffer or numpy.ndarray instance")
185+
if not type(buffer) in [moderngl.Buffer, numpy.ndarray, bytes]:
186+
raise VAOError("buffer parameter must be a moderngl.Buffer, numpy.ndarray or bytes instance")
183187

184188
if isinstance(buffer, numpy.ndarray):
185-
buffer = context.ctx().buffer(buffer.tobytes())
189+
buffer = self.ctx.buffer(buffer.tobytes())
190+
191+
if isinstance(buffer, bytes):
192+
buffer = self.ctx.buffer(data=buffer)
186193

187194
self._index_buffer = buffer
188195
self._index_element_size = index_element_size

demosys/scene/loaders/wavefront.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import numpy
2+
13
import moderngl
24
import pywavefront
35
from pywavefront import cache
@@ -46,8 +48,8 @@ def load_vertex_buffer(self, fd, material, length):
4648
buffer_format, attributes, mesh_attributes = translate_buffer_format(material.vertex_format)
4749

4850
vao = VAO(material.name, mode=moderngl.TRIANGLES)
49-
buffer = context.ctx().buffer(fd.read(length))
50-
vao.buffer(buffer, buffer_format, attributes)
51+
# buffer = context.ctx().buffer(fd.read(length))
52+
vao.buffer(fd.read(length), buffer_format, attributes)
5153

5254
setattr(material, 'vao', vao)
5355
setattr(material, 'buffer_format', buffer_format)
@@ -74,13 +76,29 @@ def load(self, scene, file=None):
7476

7577
for _, mat in data.materials.items():
7678

77-
if not hasattr(mat, 'vao'):
78-
continue
79-
8079
mesh = Mesh(mat.name)
81-
mesh.vao = mat.vao
82-
for attrs in mat.mesh_attributes:
83-
mesh.add_attribute(*attrs)
80+
81+
# Traditional loader
82+
if mat.vertices:
83+
buffer_format, attributes, mesh_attributes = translate_buffer_format(mat.vertex_format)
84+
vbo = numpy.array(mat.vertices, dtype='f4')
85+
86+
vao = VAO(mat.name, mode=moderngl.TRIANGLES)
87+
vao.buffer(vbo, buffer_format, attributes)
88+
mesh.vao = vao
89+
90+
for attrs in mesh_attributes:
91+
mesh.add_attribute(*attrs)
92+
93+
# Binary cache loader
94+
elif hasattr(mat, 'vao'):
95+
mesh = Mesh(mat.name)
96+
mesh.vao = mat.vao
97+
for attrs in mat.mesh_attributes:
98+
mesh.add_attribute(*attrs)
99+
else:
100+
# Empty
101+
continue
84102

85103
scene.meshes.append(mesh)
86104

0 commit comments

Comments
 (0)