From 444c0df95b73bd7270486be0e58f07afa6c30628 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Tue, 2 Dec 2025 17:52:35 +0100 Subject: [PATCH 1/4] skip and warn on degen wall tris --- .../z64/exporter/collision/__init__.py | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/fast64_internal/z64/exporter/collision/__init__.py b/fast64_internal/z64/exporter/collision/__init__.py index 74f33701c..be63e61e3 100644 --- a/fast64_internal/z64/exporter/collision/__init__.py +++ b/fast64_internal/z64/exporter/collision/__init__.py @@ -103,6 +103,7 @@ def getCollisionData(dataHolder: Optional[Object], transform: Matrix, useMacros: for i, face in enumerate(meshObj.data.loop_triangles): material = meshObj.material_slots[face.material_index].material colProp = material.ootCollisionProperty + skip = False # get bounds and vertices data planePoint = transform @ meshObj.data.vertices[face.vertices[0]].co @@ -119,14 +120,31 @@ def getCollisionData(dataHolder: Optional[Object], transform: Matrix, useMacros: ) distance = convertIntTo2sComplement(distance, 2, True) + def sq(val): + return val * val + nx = (y2 - y1) * (z3 - z2) - (z2 - z1) * (y3 - y2) ny = (z2 - z1) * (x3 - x2) - (x2 - x1) * (z3 - z2) nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) - magSqr = nx * nx + ny * ny + nz * nz + magSqr = sq(nx) + sq(ny) + sq(nz) if magSqr <= 0: - print("INFO: Ignore denormalized triangle.") + skip = True + + # for walls only, see https://github.com/zeldaret/oot/blob/eb5dac74d6435baf85ced9158d3ff915ba8872ca/src/code/z_bgcheck.c#L751 + if normal[1] >= -0.8 and normal[1] <= 0.5: + normal_xz = math.sqrt(sq(normal[0]) + sq(normal[2])) + if math.fabs(normal_xz) < 0.008: + skip = True + + if skip: + print( + f"WARNING: skipping degenerate triangle on mesh object '{meshObj.name}' (material name is '{material.name}')" + ) continue + if normal[0] == 0 and normal[2] == 0: + raise PluginError("unexpected degenerate triangle") + indices: list[int] = [] for pos in [(x1, y1, z1), (x2, y2, z2), (x3, y3, z3)]: vertexIndex = CollisionUtility.getVertexIndex(pos, vertexList) From 4c81191eeea91a46d8b5c5d4ab20a3b47f1065e5 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Tue, 2 Dec 2025 17:57:05 +0100 Subject: [PATCH 2/4] error instead of warn --- fast64_internal/z64/exporter/collision/__init__.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/fast64_internal/z64/exporter/collision/__init__.py b/fast64_internal/z64/exporter/collision/__init__.py index be63e61e3..c840beeae 100644 --- a/fast64_internal/z64/exporter/collision/__init__.py +++ b/fast64_internal/z64/exporter/collision/__init__.py @@ -103,7 +103,7 @@ def getCollisionData(dataHolder: Optional[Object], transform: Matrix, useMacros: for i, face in enumerate(meshObj.data.loop_triangles): material = meshObj.material_slots[face.material_index].material colProp = material.ootCollisionProperty - skip = False + raise_error = False # get bounds and vertices data planePoint = transform @ meshObj.data.vertices[face.vertices[0]].co @@ -128,19 +128,18 @@ def sq(val): nz = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) magSqr = sq(nx) + sq(ny) + sq(nz) if magSqr <= 0: - skip = True + raise_error = True # for walls only, see https://github.com/zeldaret/oot/blob/eb5dac74d6435baf85ced9158d3ff915ba8872ca/src/code/z_bgcheck.c#L751 if normal[1] >= -0.8 and normal[1] <= 0.5: normal_xz = math.sqrt(sq(normal[0]) + sq(normal[2])) if math.fabs(normal_xz) < 0.008: - skip = True + raise_error = True - if skip: - print( - f"WARNING: skipping degenerate triangle on mesh object '{meshObj.name}' (material name is '{material.name}')" + if raise_error: + raise PluginError( + f"degenerate triangle detected on mesh object '{meshObj.name}' (material name is '{material.name}')" ) - continue if normal[0] == 0 and normal[2] == 0: raise PluginError("unexpected degenerate triangle") From d74757acd1041e7c4b0a1a9ea3fb1b7d5b96c9bf Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:37:56 +0100 Subject: [PATCH 3/4] review --- fast64_internal/z64/exporter/collision/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/fast64_internal/z64/exporter/collision/__init__.py b/fast64_internal/z64/exporter/collision/__init__.py index 0ef1ad9f9..7536aa3af 100644 --- a/fast64_internal/z64/exporter/collision/__init__.py +++ b/fast64_internal/z64/exporter/collision/__init__.py @@ -150,9 +150,6 @@ def sq(val): f"degenerate triangle detected on mesh object '{meshObj.name}' (material name is '{material.name}')" ) - if normal[0] == 0 and normal[2] == 0: - raise PluginError("unexpected degenerate triangle") - indices: list[int] = [] for pos in [(x1, y1, z1), (x2, y2, z2), (x3, y3, z3)]: vertexIndex = CollisionUtility.getVertexIndex(pos, vertexList) From b6797a69a548eca21c69280aa435b179a82b1069 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Sun, 1 Mar 2026 16:03:02 +0100 Subject: [PATCH 4/4] add missing import --- fast64_internal/z64/exporter/collision/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fast64_internal/z64/exporter/collision/__init__.py b/fast64_internal/z64/exporter/collision/__init__.py index 7536aa3af..39317aab6 100644 --- a/fast64_internal/z64/exporter/collision/__init__.py +++ b/fast64_internal/z64/exporter/collision/__init__.py @@ -1,5 +1,6 @@ import bpy import ctypes +import math from pathlib import Path from dataclasses import dataclass