summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorMorris Tabor <80684659+mortarroad@users.noreply.github.com>2021-08-25 14:18:45 +0200
committerMorris Tabor <80684659+mortarroad@users.noreply.github.com>2021-08-25 14:18:45 +0200
commit75dd294732a5670eb1978515a02cac109d169b3b (patch)
tree6a16f77de6fa29617cad6846fcee10e3ab9c1168 /core
parentc334989e003d8692cf00acb8f16a19a3bf9bc0d0 (diff)
Fix emitting duplicate edges for convex hulls
Identical to https://github.com/godotengine/godot/pull/52059
Diffstat (limited to 'core')
-rw-r--r--core/math/convex_hull.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/core/math/convex_hull.cpp b/core/math/convex_hull.cpp
index 21cb0efe20..f67035c803 100644
--- a/core/math/convex_hull.cpp
+++ b/core/math/convex_hull.cpp
@@ -2260,10 +2260,21 @@ Error ConvexHullComputer::convex_hull(const Vector<Vector3> &p_points, Geometry3
r_mesh.vertices = ch.vertices;
- r_mesh.edges.resize(ch.edges.size());
+ // Copy the edges over. There's two "half-edges" for every edge, so we pick only one of them.
+ r_mesh.edges.resize(ch.edges.size() / 2);
+ uint32_t edges_copied = 0;
for (uint32_t i = 0; i < ch.edges.size(); i++) {
- r_mesh.edges.write[i].a = (&ch.edges[i])->get_source_vertex();
- r_mesh.edges.write[i].b = (&ch.edges[i])->get_target_vertex();
+ uint32_t a = (&ch.edges[i])->get_source_vertex();
+ uint32_t b = (&ch.edges[i])->get_target_vertex();
+ if (a < b) { // Copy only the "canonical" edge. For the reverse edge, this will be false.
+ ERR_BREAK(edges_copied >= (uint32_t)r_mesh.edges.size());
+ r_mesh.edges.write[edges_copied].a = a;
+ r_mesh.edges.write[edges_copied].b = b;
+ edges_copied++;
+ }
+ }
+ if (edges_copied != (uint32_t)r_mesh.edges.size()) {
+ ERR_PRINT("Invalid edge count.");
}
r_mesh.faces.resize(ch.faces.size());