Sfoglia il codice sorgente

Remove faces in in QuickHull::build() that we don't need anymore

We delete the faces for consideration in this loop but we can still
sometimes find an edge that connects to this face. We now interate over
all edges and disconnect edges connecting to this face.

This fixes #16560 and fixes #17569
Hein-Pieter van Braam 7 anni fa
parent
commit
33669a8bca
1 ha cambiato i file con 9 aggiunte e 2 eliminazioni
  1. 9 2
      core/math/quick_hull.cpp

+ 9 - 2
core/math/quick_hull.cpp

@@ -397,7 +397,6 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry::MeshData &r_me
 			Map<Edge, RetFaceConnect>::Element *F = ret_edges.find(e);
 			Map<Edge, RetFaceConnect>::Element *F = ret_edges.find(e);
 
 
 			ERR_CONTINUE(!F);
 			ERR_CONTINUE(!F);
-
 			List<Geometry::MeshData::Face>::Element *O = F->get().left == E ? F->get().right : F->get().left;
 			List<Geometry::MeshData::Face>::Element *O = F->get().left == E ? F->get().right : F->get().left;
 			ERR_CONTINUE(O == E);
 			ERR_CONTINUE(O == E);
 			ERR_CONTINUE(O == NULL);
 			ERR_CONTINUE(O == NULL);
@@ -426,7 +425,6 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry::MeshData &r_me
 							Edge e2(idx, idxn);
 							Edge e2(idx, idxn);
 
 
 							Map<Edge, RetFaceConnect>::Element *F2 = ret_edges.find(e2);
 							Map<Edge, RetFaceConnect>::Element *F2 = ret_edges.find(e2);
-
 							ERR_CONTINUE(!F2);
 							ERR_CONTINUE(!F2);
 							//change faceconnect, point to this face instead
 							//change faceconnect, point to this face instead
 							if (F2->get().left == O)
 							if (F2->get().left == O)
@@ -439,6 +437,15 @@ Error QuickHull::build(const Vector<Vector3> &p_points, Geometry::MeshData &r_me
 					}
 					}
 				}
 				}
 
 
+				// remove all edge connections to this face
+				for (Map<Edge, RetFaceConnect>::Element *E = ret_edges.front(); E; E = E->next()) {
+					if (E->get().left == O)
+						E->get().left = NULL;
+
+					if (E->get().right == O)
+						E->get().right = NULL;
+				}
+
 				ret_edges.erase(F); //remove the edge
 				ret_edges.erase(F); //remove the edge
 				ret_faces.erase(O); //remove the face
 				ret_faces.erase(O); //remove the face
 			}
 			}