Fix #141026: Degenerate Dissolve crashes Blender.
The code added in commit ffc204d1fa to dissolve redundant 2-edged
vertices after a manifold boolean assumed that after dissolving such
vertices a valid face would remain. This is not true of the face
started out degenerate (all vertices on the same line).
Fixed by checking for such cases and in any case not creating
any faces with less than three vertices.
This commit is contained in:
@@ -1240,6 +1240,9 @@ static void dissolve_valence2_verts(MeshAssembly &ma)
|
||||
for (const int f : ma.new_faces.index_range()) {
|
||||
const OutFace &face = ma.new_faces[f];
|
||||
const int fsize = face.verts.size();
|
||||
if (fsize <= 3) {
|
||||
continue;
|
||||
}
|
||||
for (const int i : ma.new_faces[f].verts.index_range()) {
|
||||
const int vprev = face.verts[(i - 1 + fsize) % fsize];
|
||||
const int v = face.verts[i];
|
||||
@@ -1319,6 +1322,9 @@ static void dissolve_valence2_verts(MeshAssembly &ma)
|
||||
threading::parallel_for(ma.new_faces.index_range(), 10000, [&](IndexRange range) {
|
||||
for (const int f : range) {
|
||||
OutFace &face = ma.new_faces[f];
|
||||
if (face.verts.size() <= 3) {
|
||||
continue;
|
||||
}
|
||||
int i_to = 0;
|
||||
for (const int i_from : face.verts.index_range()) {
|
||||
const int mapped_v_from = ma.mapped_vert(face.verts[i_from]);
|
||||
@@ -1327,7 +1333,17 @@ static void dissolve_valence2_verts(MeshAssembly &ma)
|
||||
}
|
||||
}
|
||||
if (i_to < face.verts.size()) {
|
||||
BLI_assert(i_to >= 3);
|
||||
if (i_to < 3) {
|
||||
/* Should be very rare. Means we dissolved two or more vertices from
|
||||
* a degenerate ngon. Since its too late to really undo that, just make
|
||||
* a valid triangle with undeleted verts. */
|
||||
if (i_to == 0) {
|
||||
face.verts[i_to++] = 0;
|
||||
}
|
||||
while (i_to < 3) {
|
||||
face.verts[i_to++] = face.verts[0];
|
||||
}
|
||||
}
|
||||
face.verts.resize(i_to);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user