Skip to content

Commit dbd7eec

Browse files
committed
Clean up scene loaders
1 parent 4310e92 commit dbd7eec

File tree

4 files changed

+58
-64
lines changed

4 files changed

+58
-64
lines changed

.pylintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,8 @@ good-names=i,
409409
k,
410410
ex,
411411
Run,
412-
_
412+
_,
413+
fd
413414

414415
# Include a hint for the correct naming format with invalid-name
415416
include-naming-hint=no

demosys/opengl/samplers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from OpenGL.GL.EXT import texture_filter_anisotropic as tfa
66

77

8-
def create_sampler(mipmap=None, anisotropy=None,
9-
min_filter=None, mag_filter=None,
10-
wrap_s=None, wrap_t=None, wrap_r=None):
8+
def create(mipmap=None, anisotropy=None,
9+
min_filter=None, mag_filter=None,
10+
wrap_s=None, wrap_t=None, wrap_r=None):
1111
"""Create sampler or get from cache"""
1212
return Sampler(
1313
mipmap=mipmap,
@@ -36,8 +36,8 @@ def __init__(self, mipmap=None, anisotropy=None,
3636
self.wrap_r = wrap_r
3737
self.states()
3838

39-
def bind(self, unit):
40-
GL.glBindSampler(unit, self.sid)
39+
def use(self, location=0):
40+
GL.glBindSampler(location, self.sid)
4141

4242
def states(self):
4343
self.sid = GL.glGenSamplers(1)

demosys/scene/loaders/gltf.py

Lines changed: 50 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@
33
import base64
44
import io
55
import json
6-
import numpy
76
import os
87
import struct
8+
import numpy
99

10-
import moderngl as mgl
11-
from OpenGL import GL
1210
from PIL import Image
13-
11+
import moderngl as mgl
1412
from pyrr import matrix44, Matrix44, quaternion
1513

1614
from demosys import context
@@ -28,12 +26,6 @@
2826

2927
GLTF_MAGIC_HEADER = b'glTF'
3028

31-
# Supported buffer targets
32-
BUFFER_TARGETS = {
33-
34962: "GL_ARRAY_BUFFER",
34-
34963: "GL_ELEMENT_ARRAY_BUFFER",
35-
}
36-
3729
# numpy dtype mapping
3830
NP_COMPONENT_DTYPE = {
3931
5121: numpy.uint8, # GL_UNSIGNED_BYTE
@@ -139,7 +131,7 @@ def load_glb(self):
139131
raise ValueError("{} has unsupported version {}".format(self.file, version))
140132

141133
# Total file size including headers
142-
struct.unpack('<I', fd.read(4))[0]
134+
_ = struct.unpack('<I', fd.read(4))[0]
143135

144136
# Chunk 0 - json
145137
chunk_0_length = struct.unpack('<I', fd.read(4))[0]
@@ -166,36 +158,38 @@ def load_samplers(self):
166158
self.samplers.append(sampler.create())
167159

168160
def load_textures(self):
169-
for texture in self.meta.textures:
170-
mt = MaterialTexture()
161+
for texture_meta in self.meta.textures:
162+
texture = MaterialTexture()
171163

172-
if texture.source is not None:
173-
mt.texture = self.images[texture.source]
164+
if texture_meta.source is not None:
165+
texture.texture = self.images[texture_meta.source]
174166

175-
if texture.sampler is not None:
176-
mt.sampler = self.samplers[texture.sampler]
167+
if texture_meta.sampler is not None:
168+
texture.sampler = self.samplers[texture_meta.sampler]
177169

178-
self.textures.append(mt)
170+
self.textures.append(texture)
179171

180172
def load_meshes(self):
181173
for meta_mesh in self.meta.meshes:
182174
# Returns a list of meshes
183175
meshes = meta_mesh.load(self.materials)
184176
self.meshes.append(meshes)
185-
for m in meshes:
186-
self.scene.meshes.append(m)
177+
178+
for mesh in meshes:
179+
self.scene.meshes.append(mesh)
187180

188181
def load_materials(self):
189182
# Create material objects
190-
for mat in self.meta.materials:
191-
m = Material(mat.name)
192-
m.color = mat.baseColorFactor
193-
m.double_sided = mat.doubleSided
194-
if mat.baseColorTexture is not None:
195-
m.mat_texture = self.textures[mat.baseColorTexture['index']]
183+
for meta_mat in self.meta.materials:
184+
mat = Material(meta_mat.name)
185+
mat.color = meta_mat.baseColorFactor
186+
mat.double_sided = meta_mat.doubleSided
187+
188+
if meta_mat.baseColorTexture is not None:
189+
mat.mat_texture = self.textures[meta_mat.baseColorTexture['index']]
196190

197-
self.materials.append(m)
198-
self.scene.materials.append(m)
191+
self.materials.append(mat)
192+
self.scene.materials.append(mat)
199193

200194
def load_nodes(self):
201195
# Start with root nodes in the scene
@@ -256,7 +250,7 @@ def __init__(self, file, data, binary_buffer=None):
256250
self.nodes = [GLTFNode(n) for n in data['nodes']] if data.get('nodes') else []
257251
self.meshes = [GLTFMesh(m) for m in data['meshes']] if data.get('meshes') else []
258252
self.cameras = [GLTFCamera(c) for c in data['cameras']] if data.get('cameras') else []
259-
self.bufferViews = [GLTFBufferView(i, v) for i, v in enumerate(data['bufferViews'])] \
253+
self.buffer_views = [GLTFBufferView(i, v) for i, v in enumerate(data['bufferViews'])] \
260254
if data.get('bufferViews') else []
261255
self.buffers = [GLTFBuffer(i, b, self.path) for i, b in enumerate(data['buffers'])] \
262256
if data.get('buffers') else []
@@ -274,25 +268,25 @@ def __init__(self, file, data, binary_buffer=None):
274268

275269
def _link_data(self):
276270
"""Add references"""
277-
# accessors -> bufferViews -> buffers
271+
# accessors -> buffer_views -> buffers
278272
for acc in self.accessors:
279-
acc.bufferView = self.bufferViews[acc.bufferViewId]
273+
acc.bufferView = self.buffer_views[acc.bufferViewId]
280274

281-
for bv in self.bufferViews:
282-
bv.buffer = self.buffers[bv.bufferId]
275+
for buffer_view in self.buffer_views:
276+
buffer_view.buffer = self.buffers[buffer_view.bufferId]
283277

284278
# Link accessors to mesh primitives
285279
for mesh in self.meshes:
286-
for p in mesh.primitives:
287-
if getattr(p, "indices", None) is not None:
288-
p.indices = self.accessors[p.indices]
289-
for name, value in p.attributes.items():
290-
p.attributes[name] = self.accessors[value]
280+
for primitive in mesh.primitives:
281+
if getattr(primitive, "indices", None) is not None:
282+
primitive.indices = self.accessors[primitive.indices]
283+
for name, value in primitive.attributes.items():
284+
primitive.attributes[name] = self.accessors[value]
291285

292286
# Link buffer views to images
293287
for image in self.images:
294288
if image.bufferViewId is not None:
295-
image.bufferView = self.bufferViews[image.bufferViewId]
289+
image.bufferView = self.buffer_views[image.bufferViewId]
296290

297291
@property
298292
def version(self):
@@ -329,7 +323,7 @@ def buffers_exist(self):
329323

330324
path = os.path.join(self.path, buff.uri)
331325
if not os.path.exists(path):
332-
raise FileNotFoundError("Buffer %s referenced in %s not found", path, self.file)
326+
raise FileNotFoundError("Buffer {} referenced in {} not found".format(path, self.file))
333327

334328
def images_exist(self):
335329
"""checks if the images references in textures exist"""
@@ -379,7 +373,6 @@ def load(self, materials):
379373
# Index buffer
380374
component_type, index_vbo = self.load_indices(primitive)
381375
if index_vbo is not None:
382-
# FIXME: Support u1 and u2 buffers
383376
vao.index_buffer(context.ctx().buffer(index_vbo.tobytes()),
384377
index_element_size=component_type.size)
385378

@@ -422,7 +415,7 @@ def prepare_attrib_mapping(self, primitive):
422415
"""Pre-parse buffer mappings for each VBO to detect interleaved data for a primitive"""
423416
buffer_info = []
424417
for name, accessor in primitive.attributes.items():
425-
info = VBOInfo(*accessor.info(target=GL.GL_ARRAY_BUFFER))
418+
info = VBOInfo(*accessor.info())
426419
info.attributes.append((name, info.components))
427420

428421
if buffer_info and buffer_info[-1].buffer_view == info.buffer_view:
@@ -442,12 +435,11 @@ def get_bbox(self, primitive):
442435

443436
class VBOInfo:
444437
"""Resolved data about each VBO"""
445-
def __init__(self, buffer=None, buffer_view=None, target=None,
438+
def __init__(self, buffer=None, buffer_view=None,
446439
byte_length=None, byte_offset=None,
447440
component_type=None, components=None, count=None):
448441
self.buffer = buffer # reference to the buffer
449442
self.buffer_view = buffer_view
450-
self.target = target
451443
self.byte_length = byte_length # Raw byte buffer length
452444
self.byte_offset = byte_offset # Raw byte offset
453445
self.component_type = component_type # Datatype of each component
@@ -477,7 +469,7 @@ def create(self):
477469
return dtype, data
478470

479471
def __str__(self):
480-
return "VBOInfo<buffer={}, buffer_view={}, target={}, \n" \
472+
return "VBOInfo<buffer={}, buffer_view={},\n" \
481473
" length={}, offset={}, \n" \
482474
" component_type={}, components={}, count={}, \n" \
483475
" attribs={}".format(self.buffer.id, self.buffer_view.id, self.target,
@@ -514,13 +506,13 @@ def read(self):
514506
count=self.count * ACCESSOR_TYPE[self.type],
515507
)
516508

517-
def info(self, target=None):
509+
def info(self):
518510
"""
519511
Get underlying buffer info for this accessor
520512
:return: buffer, byte_length, byte_offset, component_type, count
521513
"""
522-
buffer, target, byte_length, byte_offset = self.bufferView.info(byte_offset=self.byteOffset, target=target)
523-
return buffer, self.bufferView, target, \
514+
buffer, byte_length, byte_offset = self.bufferView.info(byte_offset=self.byteOffset)
515+
return buffer, self.bufferView, \
524516
byte_length, byte_offset, \
525517
self.componentType, ACCESSOR_TYPE[self.type], self.count
526518

@@ -534,7 +526,6 @@ def __init__(self, view_id, data):
534526
self.byteLength = data.get('byteLength')
535527
self.byteStride = data.get('byteStride') or 0
536528
# Valid: 34962 (ARRAY_BUFFER) and 34963 (ELEMENT_ARRAY_BUFFER) or None
537-
self.target = data.get('target')
538529

539530
def read(self, byte_offset=0, dtype=None, count=0):
540531
data = self.buffer.read(
@@ -547,14 +538,13 @@ def read(self, byte_offset=0, dtype=None, count=0):
547538
def read_raw(self):
548539
return self.buffer.read(byte_length=self.byteLength, byte_offset=self.byteOffset)
549540

550-
def info(self, byte_offset=0, target=None):
541+
def info(self, byte_offset=0):
551542
"""
552543
Get the underlying buffer info
553544
:param byte_offset: byte offset from accessor
554-
:param target: buffer target (elements or data array)
555-
:return: buffer, target, byte_length, byte_offset
545+
:return: buffer, byte_length, byte_offset
556546
"""
557-
return self.buffer, BUFFER_TARGETS[target], self.byteLength, byte_offset + self.byteOffset
547+
return self.buffer, self.byteLength, byte_offset + self.byteOffset
558548

559549

560550
class GLTFBuffer:
@@ -612,12 +602,15 @@ def __init__(self, data):
612602

613603
if self.matrix is None:
614604
self.matrix = matrix44.create_identity()
605+
615606
if self.translation is not None:
616607
self.matrix = matrix44.create_from_translation(self.translation)
608+
617609
if self.rotation is not None:
618-
q = quaternion.create(self.rotation[0], self.rotation[1], self.rotation[2], self.rotation[3])
619-
m = matrix44.create_from_quaternion(q)
620-
self.matrix = matrix44.multiply(m, self.matrix)
610+
quat = quaternion.create(self.rotation[0], self.rotation[1], self.rotation[2], self.rotation[3])
611+
mat = matrix44.create_from_quaternion(quat)
612+
self.matrix = matrix44.multiply(mat, self.matrix)
613+
621614
if self.scale is not None:
622615
self.matrix = matrix44.multiply(matrix44.create_from_scale(self.scale), self.matrix)
623616

@@ -689,7 +682,7 @@ def __init__(self, data):
689682
self.wrapT = data.get('wrapT')
690683

691684
def create(self):
692-
return samplers.create_sampler(
685+
return samplers.create(
693686
mipmap=True,
694687
mag_filter=self.magFilter,
695688
min_filter=self.minFilter,

demosys/scene/loaders/wavefront.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def load(self, scene, file=None):
7474
if mat.texture:
7575
mesh.material.mat_texture = MaterialTexture(
7676
texture=textures.get(mat.texture.path, create=True, mipmap=True),
77-
sampler=samplers.create_sampler(
77+
sampler=samplers.create(
7878
wrap_s=GL.GL_CLAMP_TO_EDGE,
7979
wrap_t=GL.GL_CLAMP_TO_EDGE,
8080
anisotropy=8,

0 commit comments

Comments
 (0)