diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2022-10-13 20:34:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-13 20:34:00 +0200 |
commit | 46a1b92bb7756ff3934c643ecf49d86982ff754d (patch) | |
tree | fd00d7d2c0118d209c3de9841d7c8a1debd3bcb8 /core/math/quick_hull.cpp | |
parent | 01ae26d31befb6679ecd92cd3c73aa5a76162e95 (diff) | |
parent | 71d2e38cb528c95b0b154c5c9b22b0be4f04884a (diff) | |
download | redot-engine-46a1b92bb7756ff3934c643ecf49d86982ff754d.tar.gz |
Merge pull request #66294 from reduz/optimize-convex-collision
Diffstat (limited to 'core/math/quick_hull.cpp')
-rw-r--r-- | core/math/quick_hull.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/core/math/quick_hull.cpp b/core/math/quick_hull.cpp index c7727a44a1..c194e1cc21 100644 --- a/core/math/quick_hull.cpp +++ b/core/math/quick_hull.cpp @@ -369,7 +369,7 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_ for (List<Geometry3D::MeshData::Face>::Element *E = ret_faces.front(); E; E = E->next()) { Geometry3D::MeshData::Face &f = E->get(); - for (int i = 0; i < f.indices.size(); i++) { + for (uint32_t i = 0; i < f.indices.size(); i++) { int a = E->get().indices[i]; int b = E->get().indices[(i + 1) % f.indices.size()]; Edge e(a, b); @@ -436,17 +436,24 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry3D::MeshData &r_ r_mesh.faces.clear(); r_mesh.faces.resize(ret_faces.size()); + HashMap<List<Geometry3D::MeshData::Face>::Element *, int> face_indices; + int idx = 0; - for (const Geometry3D::MeshData::Face &E : ret_faces) { - r_mesh.faces.write[idx++] = E; + for (List<Geometry3D::MeshData::Face>::Element *E = ret_faces.front(); E; E = E->next()) { + face_indices[E] = idx; + r_mesh.faces[idx++] = E->get(); } r_mesh.edges.resize(ret_edges.size()); idx = 0; for (const KeyValue<Edge, RetFaceConnect> &E : ret_edges) { Geometry3D::MeshData::Edge e; - e.a = E.key.vertices[0]; - e.b = E.key.vertices[1]; - r_mesh.edges.write[idx++] = e; + e.vertex_a = E.key.vertices[0]; + e.vertex_b = E.key.vertices[1]; + ERR_CONTINUE(!face_indices.has(E.value.left)); + ERR_CONTINUE(!face_indices.has(E.value.right)); + e.face_a = face_indices[E.value.left]; + e.face_b = face_indices[E.value.right]; + r_mesh.edges[idx++] = e; } r_mesh.vertices = p_points; |