Skip to content

Commit 5419793

Browse files
committed
refactor(MeshHelper): optimize get_triangles
1 parent 83fd2ca commit 5419793

1 file changed

Lines changed: 15 additions & 25 deletions

File tree

UnityPy/helpers/MeshHelper.py

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)