diff options
-rw-r--r-- | source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c b/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c index 092a004aece..ffc680817a7 100644 --- a/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c +++ b/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c @@ -41,6 +41,8 @@ static bool bm_vert_dissolve_fan_test(BMVert *v) BMIter iter; BMEdge *e; + BMVert *varr[4]; + unsigned int tot_edge = 0; unsigned int tot_edge_boundary = 0; unsigned int tot_edge_manifold = 0; @@ -56,17 +58,25 @@ static bool bm_vert_dissolve_fan_test(BMVert *v) else if (BM_edge_is_wire(e)) { tot_edge_wire++; } + + /* bail out early */ + if (tot_edge == 4) { + return false; + } + + /* used to check overlapping faces */ + varr[tot_edge] = BM_edge_other_vert(e, v); + tot_edge++; } - if ((tot_edge == 4) && (tot_edge_boundary == 0) && (tot_edge_manifold == 4)) { - return true; - } - else if ((tot_edge == 3) && (tot_edge_boundary == 0) && (tot_edge_manifold == 3)) { - return true; - } - else if ((tot_edge == 3) && (tot_edge_boundary == 2) && (tot_edge_manifold == 1)) { - return true; + if (((tot_edge == 4) && (tot_edge_boundary == 0) && (tot_edge_manifold == 4)) || + ((tot_edge == 3) && (tot_edge_boundary == 0) && (tot_edge_manifold == 3)) || + ((tot_edge == 3) && (tot_edge_boundary == 2) && (tot_edge_manifold == 1))) + { + if (!BM_face_exists(varr, tot_edge, NULL)) { + return true; + } } else if ((tot_edge == 2) && (tot_edge_wire == 2)) { return true; |