[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45396] trunk/blender/source/blender/bmesh : fix [#30809] Limited dissolve leaves edges behind

Campbell Barton ideasman42 at gmail.com
Wed Apr 4 17:10:22 CEST 2012


Revision: 45396
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45396
Author:   campbellbarton
Date:     2012-04-04 15:10:20 +0000 (Wed, 04 Apr 2012)
Log Message:
-----------
fix [#30809] Limited dissolve leaves edges behind

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_core.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-04-04 14:48:10 UTC (rev 45395)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-04-04 15:10:20 UTC (rev 45396)
@@ -1035,6 +1035,13 @@
 			BM_vert_kill(bm, delverts[i]);
 		}
 	}
+	else {
+		/* otherwise we get both old and new faces */
+		for (i = 0; i < totface; i++) {
+			f = faces[i];
+			BM_face_kill(bm, f);
+		}
+	}
 	
 	BLI_array_free(edges);
 	BLI_array_free(deledges);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-04-04 14:48:10 UTC (rev 45395)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-04-04 15:10:20 UTC (rev 45396)
@@ -505,14 +505,10 @@
 		const float angle = BM_edge_face_angle(e);
 
 		if (angle < angle_limit) {
-			weight_elems[i].ele = (BMHeader *)e;
-			weight_elems[i].weight = angle;
 			tot_found++;
 		}
-		else {
-			weight_elems[i].ele = NULL;
-			weight_elems[i].weight = angle_max;
-		}
+		weight_elems[i].ele = (BMHeader *)e;
+		weight_elems[i].weight = angle;
 	}
 
 	if (tot_found != 0) {
@@ -520,19 +516,38 @@
 
 		for (i = 0; i < tot_found; i++) {
 			BMEdge *e = (BMEdge *)weight_elems[i].ele;
-			/* check twice because cumulative effect could dissolve over angle limit */
-			if (BM_edge_face_angle(e) < angle_limit) {
+
+			if (/* may have become non-manifold */
+			    BM_edge_is_manifold(e) &&
+			    /* check twice because cumulative effect could dissolve over angle limit */
+			    (BM_edge_face_angle(e) < angle_limit))
+			{
 				BMFace *nf = BM_faces_join_pair(bm, e->l->f,
 				                                e->l->radial_next->f,
 				                                e,
-				                                TRUE); /* join faces */
+				                                FALSE); /* join faces */
 
 				/* there may be some errors, we don't mind, just move on */
-				if (nf == NULL) {
+				if (nf) {
+					BM_face_normal_update(bm, nf);
+				}
+				else {
 					BMO_error_clear(bm);
 				}
 			}
 		}
+
+		/* remove all edges/verts left behind from dissolving */
+		for (i = 0; i < einput->len; i++) {
+			BMEdge *e = (BMEdge *)weight_elems[i].ele;
+			if (BM_edge_is_wire(e)) {
+				BMVert *v1 = e->v1;
+				BMVert *v2 = e->v2;
+				BM_edge_kill(bm, e);
+				if (v1->e == NULL) BM_vert_kill(bm, v1);
+				if (v2->e == NULL) BM_vert_kill(bm, v2);
+			}
+		}
 	}
 
 	/* --- second verts --- */




More information about the Bf-blender-cvs mailing list