From 33669a8bcacf108e8fbf1bb64cf94b38381634e6 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 --- 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 cb923d264e6..45c106102e6 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 }