@@ -625,10 +625,10 @@ def decompress_compressed_mesh(self):
625625
626626 def get_triangles (self ) -> List [List [Tuple [int , ...]]]:
627627 assert self .m_IndexBuffer is not None
628+ assert self .src .m_SubMeshes is not None
628629
629630 submeshes : List [List [Tuple [int , ...]]] = []
630631
631- assert self .src and self .src .m_SubMeshes is not None , "No submesh data!"
632632 for m_SubMesh in self .src .m_SubMeshes :
633633 firstIndex = m_SubMesh .firstByte // 2
634634 if not self .m_Use16BitIndices :
@@ -640,38 +640,37 @@ def get_triangles(self) -> List[List[Tuple[int, ...]]]:
640640 triangles : List [Tuple [int , ...]]
641641
642642 if topology == MeshTopology .Triangles :
643- triangles = self .m_IndexBuffer [firstIndex : firstIndex + indexCount ] # type: ignore
644- triangles = [triangles [i : i + 3 ] for i in range (0 , len (triangles ), 3 )] # type: ignore
645- elif self .version [0 ] < 4 or topology == MeshTopology .TriangleStrip : # TriangleStrip
646- # todo: use as_strided, then fix winding, finally remove degenerates
647- triIndex = 0
648- triangles = [None ] * (indexCount - 2 ) # type: ignore
643+ triangles = [
644+ tuple (self .m_IndexBuffer [i : i + 3 ]) for i in range (firstIndex , firstIndex + indexCount , 3 )
645+ ]
649646
650- for i in range (indexCount - 2 ):
651- a , b , c = self .m_IndexBuffer [firstIndex + i : firstIndex + i + 3 ]
647+ elif self .version [0 ] < 4 or topology == MeshTopology .TriangleStrip :
648+ triangles = [()] * (indexCount - 2 )
649+ triIndex = 0
650+ for i in range (firstIndex , firstIndex + indexCount - 2 ):
651+ a , b , c = self .m_IndexBuffer [i : i + 3 ]
652652 # skip degenerates
653653 if a == b or a == c or b == c :
654654 continue
655-
656655 # do the winding flip-flop of strips
657- if i & 1 :
658- triangles [triIndex ] = b , a , c
656+ if ( i - firstIndex ) & 1 :
657+ triangles [triIndex ] = ( b , a , c )
659658 else :
660- triangles [triIndex ] = a , b , c
659+ triangles [triIndex ] = ( a , b , c )
661660 triIndex += 1
662-
663661 triangles = triangles [:triIndex ]
662+ m_SubMesh .indexCount = len (triangles ) * 3
664663
665664 elif topology == MeshTopology .Quads :
666665 # one quad is two triangles, so // 4 * 2 = // 2
667- # TODO: use as_strided
668- triangles = [None ] * (indexCount // 2 ) # type: ignore
666+ triangles = [()] * (indexCount // 2 )
669667 triIndex = 0
670668 for i in range (firstIndex , firstIndex + indexCount , 4 ):
671669 a , b , c , d = self .m_IndexBuffer [i : i + 4 ]
672- triangles [triIndex ] = a , b , c
673- triangles [triIndex + 1 ] = a , c , d
670+ triangles [triIndex ] = ( a , b , c )
671+ triangles [triIndex + 1 ] = ( a , c , d )
674672 triIndex += 2
673+
675674 else :
676675 raise ValueError ("Failed getting triangles. Submesh topology is lines or points." )
677676
0 commit comments