Fix for un-subdivide creating duplicate faces
authorCampbell Barton <ideasman42@gmail.com>
Wed, 5 Mar 2014 14:00:18 +0000 (01:00 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 5 Mar 2014 14:00:18 +0000 (01:00 +1100)
source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c

index 092a004aecee7f88a7b6c958fe12d3135bae47b9..ffc680817a7c47454c4fe8c6e8492a82c247317b 100644 (file)
@@ -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;