Skip to content

Commit 28868b7

Browse files
committed
refactor(MeshHelper): optimize get_triangles
1 parent 313054a commit 28868b7

1 file changed

Lines changed: 17 additions & 18 deletions

File tree

UnityPy/helpers/MeshHelper.py

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

Comments
 (0)