From 73fa1470b326d62dc94920eddfa7d33a4ee4e93d Mon Sep 17 00:00:00 2001 From: Hein-Pieter van Braam Date: Mon, 20 Aug 2018 00:22:47 +0200 Subject: [PATCH] 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 (cherry picked from commit 33669a8bcacf108e8fbf1bb64cf94b38381634e6) --- core/math/quick_hull.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/math/quick_hull.cpp b/core/math/quick_hull.cpp index 5cb6f763ae9..4b030cbfa3d 100644 --- a/core/math/quick_hull.cpp +++ b/core/math/quick_hull.cpp @@ -397,7 +397,6 @@ Error QuickHull::build(const Vector &p_points, Geometry::MeshData &r_me Map::Element *F = ret_edges.find(e); ERR_CONTINUE(!F); - List::Element *O = F->get().left == E ? F->get().right : F->get().left; ERR_CONTINUE(O == E); ERR_CONTINUE(O == NULL); @@ -426,7 +425,6 @@ Error QuickHull::build(const Vector &p_points, Geometry::MeshData &r_me Edge e2(idx, idxn); Map::Element *F2 = ret_edges.find(e2); - ERR_CONTINUE(!F2); //change faceconnect, point to this face instead if (F2->get().left == O) @@ -439,6 +437,15 @@ Error QuickHull::build(const Vector &p_points, Geometry::MeshData &r_me } } + // remove all edge connections to this face + for (Map::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_faces.erase(O); //remove the face }