Sfoglia il codice sorgente

Merge pull request #52097 from mortarroad/master-fix-convex-hull-double-edges

Fix emitting duplicate edges for convex hulls
Max Hilbrunner 4 anni fa
parent
commit
f8fb2bc0b4
1 ha cambiato i file con 14 aggiunte e 3 eliminazioni
  1. 14 3
      core/math/convex_hull.cpp

+ 14 - 3
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());