From df3116b3269f428ffbbcc31a1f786da0d6510400 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 6 Mar 2014 01:00:18 +1100 Subject: Fix for un-subdivide creating duplicate faces --- .../bmesh/tools/bmesh_decimate_unsubdivide.c | 26 +++++++++++++++------- 1 file 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; -- cgit v1.2.3