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 33669a8bca
)
This commit is contained in:
parent
75f1731232
commit
73fa1470b3
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue