Fix crash when importing fbx model with convex polygon with duplicated vertices

#3222
This commit is contained in:
Wojtek Figat
2025-02-21 17:36:20 +01:00
parent 9d5d80bf4a
commit bd9a5f03a4

View File

@@ -669,16 +669,31 @@ int Triangulate(OpenFbxImporterData& data, const ofbx::GeometryData& geom, const
earIndices.Add(indices[i1]); earIndices.Add(indices[i1]);
earIndices.Add(indices[i2]); earIndices.Add(indices[i2]);
earIndices.Add(indices[i3]); earIndices.Add(indices[i3]);
// Remove midpoint of the ear from the loop
indices.RemoveAtKeepOrder(i2); indices.RemoveAtKeepOrder(i2);
} }
for (int i = 0; i < earIndices.Count(); i++) // Last ear
triangulatedIndices[i] = polygon.from_vertex + (earIndices[i] % polygon.vertex_count); earIndices.Add(indices[0]);
triangulatedIndices[earIndices.Count() + 0] = polygon.from_vertex + (indices[0] % polygon.vertex_count); earIndices.Add(indices[1]);
triangulatedIndices[earIndices.Count() + 1] = polygon.from_vertex + (indices[1] % polygon.vertex_count); earIndices.Add(indices[2]);
triangulatedIndices[earIndices.Count() + 2] = polygon.from_vertex + (indices[2] % polygon.vertex_count);
return 3 * (polygon.vertex_count - 2); // Write any degenerate triangles (eg. if points are duplicated within a list)
for (int32 i = 3; i < indices.Count(); i += 3)
{
earIndices.Add(indices[i + 0]);
earIndices.Add(indices[(i + 1) % indices.Count()]);
earIndices.Add(indices[(i + 2) % indices.Count()]);
}
// Copy ears into triangles
for (int32 i = 0; i < earIndices.Count(); i++)
triangulatedIndices[i] = polygon.from_vertex + (earIndices[i] % polygon.vertex_count);
// Ensure that we've written enough ears
ASSERT(earIndices.Count() == 3 * (polygon.vertex_count - 2));
return earIndices.Count();
} }
bool ProcessMesh(ModelData& result, OpenFbxImporterData& data, const ofbx::Mesh* aMesh, MeshData& mesh, String& errorMsg, int partitionIndex) bool ProcessMesh(ModelData& result, OpenFbxImporterData& data, const ofbx::Mesh* aMesh, MeshData& mesh, String& errorMsg, int partitionIndex)
@@ -715,6 +730,7 @@ bool ProcessMesh(ModelData& result, OpenFbxImporterData& data, const ofbx::Mesh*
mesh.Positions.Get()[j] = ToFloat3(positions.get(triangulatedIndices[j])); mesh.Positions.Get()[j] = ToFloat3(positions.get(triangulatedIndices[j]));
numIndicesTotal += numIndices; numIndicesTotal += numIndices;
} }
ASSERT(numIndicesTotal == vertexCount);
} }
// Indices (dummy index buffer) // Indices (dummy index buffer)