@@ -642,10 +642,10 @@ def decompress_compressed_mesh(self):
642642
643643 def get_triangles (self ) -> List [List [Tuple [int , ...]]]:
644644 assert self .m_IndexBuffer is not None
645+ assert self .src .m_SubMeshes is not None
645646
646647 submeshes : List [List [Tuple [int , ...]]] = []
647648
648- assert self .src and self .src .m_SubMeshes is not None , "No submesh data!"
649649 for m_SubMesh in self .src .m_SubMeshes :
650650 firstIndex = m_SubMesh .firstByte // 2
651651 if not self .m_Use16BitIndices :
@@ -654,41 +654,31 @@ def get_triangles(self) -> List[List[Tuple[int, ...]]]:
654654 indexCount = m_SubMesh .indexCount
655655 topology = m_SubMesh .topology
656656
657- triangles : List [Tuple [int , ...]]
657+ triangles : List [Tuple [int , ...]] = []
658658
659659 if topology == MeshTopology .Triangles :
660- triangles = self .m_IndexBuffer [firstIndex : firstIndex + indexCount ] # type: ignore
661- triangles = [triangles [i : i + 3 ] for i in range (0 , len (triangles ), 3 )] # type: ignore
662- elif self .version [0 ] < 4 or topology == MeshTopology .TriangleStrip : # TriangleStrip
663- # todo: use as_strided, then fix winding, finally remove degenerates
664- triIndex = 0
665- triangles = [None ] * (indexCount - 2 ) # type: ignore
666-
667- for i in range (indexCount - 2 ):
668- a , b , c = self .m_IndexBuffer [firstIndex + i : firstIndex + i + 3 ]
660+ for i in range (firstIndex , firstIndex + indexCount , 3 ):
661+ triangles .append (tuple (self .m_IndexBuffer [i : i + 3 ]))
662+
663+ elif self .version [0 ] < 4 or topology == MeshTopology .TriangleStrip :
664+ for i in range (firstIndex , firstIndex + indexCount - 2 ):
665+ a , b , c = self .m_IndexBuffer [i : i + 3 ]
669666 # skip degenerates
670667 if a == b or a == c or b == c :
671668 continue
672-
673669 # do the winding flip-flop of strips
674- if i & 1 :
675- triangles [ triIndex ] = b , a , c
670+ if ( i - firstIndex ) & 1 :
671+ triangles . append (( b , a , c ))
676672 else :
677- triangles [triIndex ] = a , b , c
678- triIndex += 1
679-
680- triangles = triangles [:triIndex ]
673+ triangles .append ((a , b , c ))
674+ m_SubMesh .indexCount = len (triangles ) * 3
681675
682676 elif topology == MeshTopology .Quads :
683- # one quad is two triangles, so // 4 * 2 = // 2
684- # TODO: use as_strided
685- triangles = [None ] * (indexCount // 2 ) # type: ignore
686- triIndex = 0
687677 for i in range (firstIndex , firstIndex + indexCount , 4 ):
688678 a , b , c , d = self .m_IndexBuffer [i : i + 4 ]
689- triangles [ triIndex ] = a , b , c
690- triangles [ triIndex + 1 ] = a , c , d
691- triIndex += 2
679+ triangles . append (( a , b , c ))
680+ triangles . append (( a , c , d ))
681+
692682 else :
693683 raise ValueError ("Failed getting triangles. Submesh topology is lines or points." )
694684
0 commit comments