[Bf-blender-cvs] [df3116b] master: Fix for un-subdivide creating duplicate faces

Campbell Barton noreply at git.blender.org
Wed Mar 5 15:00:47 CET 2014


Commit: df3116b3269f428ffbbcc31a1f786da0d6510400
Author: Campbell Barton
Date:   Thu Mar 6 01:00:18 2014 +1100
https://developer.blender.org/rBdf3116b3269f428ffbbcc31a1f786da0d6510400

Fix for un-subdivide creating duplicate faces

===================================================================

M	source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c

===================================================================

diff --git a/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c b/source/blender/bmesh/tools/bmesh_decimate_unsubdivide.c
index 092a004..ffc6808 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;




More information about the Bf-blender-cvs mailing list