33import base64
44import io
55import json
6- import numpy
76import os
87import struct
8+ import numpy
99
10- import moderngl as mgl
11- from OpenGL import GL
1210from PIL import Image
13-
11+ import moderngl as mgl
1412from pyrr import matrix44 , Matrix44 , quaternion
1513
1614from demosys import context
2826
2927GLTF_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
3830NP_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
443436class 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
560550class 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 ,
0 commit comments