[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45404] trunk/blender/source/blender/bmesh : adjust limited dissolve to take face angle into account when dissolving vertices between manifold edges .

Campbell Barton ideasman42 at gmail.com
Thu Apr 5 03:20:36 CEST 2012


Revision: 45404
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45404
Author:   campbellbarton
Date:     2012-04-05 01:20:32 +0000 (Thu, 05 Apr 2012)
Log Message:
-----------
adjust limited dissolve to take face angle into account when dissolving vertices between manifold edges.

stops artifact with zig-zag patterns between _almost_ planer faces.

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 17:18:01 UTC (rev 45403)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c	2012-04-05 01:20:32 UTC (rev 45404)
@@ -1038,8 +1038,7 @@
 	else {
 		/* otherwise we get both old and new faces */
 		for (i = 0; i < totface; i++) {
-			f = faces[i];
-			BM_face_kill(bm, f);
+			BM_face_kill(bm, faces[i]);
 		}
 	}
 	

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-04-04 17:18:01 UTC (rev 45403)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-04-05 01:20:32 UTC (rev 45404)
@@ -472,7 +472,29 @@
 
 #endif
 
-/**/
+/* Limited Dissolve */
+
+#define UNIT_TO_ANGLE DEG2RADF(90.0)
+#define ANGLE_TO_UNIT (1.0 / UNIT_TO_ANGLE)
+
+/* multiply vertex edge angle by face angle
+ * this means we are not left with sharp corners between _almost_ planer faces
+ * convert angles [0-PI/2] -> [0-1], multiply together, then convert back to radians. */
+float bm_vert_edge_face_angle(BMVert *v)
+{
+	const float angle = BM_vert_edge_angle(v);
+	/*note: could be either edge, it doesnt matter */
+	if (v->e && BM_edge_is_manifold(v->e)) {
+		return ((angle * ANGLE_TO_UNIT) * (BM_edge_face_angle(v->e) * ANGLE_TO_UNIT)) * UNIT_TO_ANGLE;
+	}
+	else {
+		return angle;
+	}
+}
+
+#undef UNIT_TO_ANGLE
+#undef ANGLE_TO_UNIT
+
 typedef struct DissolveElemWeight {
 	BMHeader *ele;
 	float weight;
@@ -553,7 +575,7 @@
 	/* --- second verts --- */
 	for (i = 0, tot_found = 0; i < vinput->len; i++) {
 		BMVert *v = ((BMVert **)vinput->data.p)[i];
-		const float angle = BM_vert_edge_angle(v);
+		const float angle = bm_vert_edge_face_angle(v);
 
 		if (angle < angle_limit) {
 			weight_elems[i].ele = (BMHeader *)v;
@@ -571,9 +593,16 @@
 
 		for (i = 0; i < tot_found; i++) {
 			BMVert *v = (BMVert *)weight_elems[i].ele;
-			/* check twice because cumulative effect could dissolve over angle limit */
-			if (BM_vert_edge_angle(v) < angle_limit) {
-				BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
+			if (/* topology changes may cause this to be un-collapsable */
+			    (BM_vert_edge_count(v) == 2) &&
+			    /* check twice because cumulative effect could dissolve over angle limit */
+			    bm_vert_edge_face_angle(v) < angle_limit)
+			{
+				BMEdge *ne = BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
+
+				if (ne && ne->l) {
+					BM_edge_normals_update(bm, ne);
+				}
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list