[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51525] trunk/blender: add option to planar decimator to collapse all verts that define face boundries (verts that 2 faces share and have 2 edge users).

Campbell Barton ideasman42 at gmail.com
Tue Oct 23 08:13:59 CEST 2012


Revision: 51525
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51525
Author:   campbellbarton
Date:     2012-10-23 06:13:56 +0000 (Tue, 23 Oct 2012)
Log Message:
-----------
add option to planar decimator to collapse all verts that define face boundries (verts that 2 faces share and have 2 edge users).

avoids ugly stepping between faces when applying on curves surfaces. (but less useful for architectural style models)

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h
    trunk/blender/source/blender/bmesh/intern/bmesh_decimate_dissolve.c
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/modifiers/intern/MOD_decimate.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-10-23 06:13:56 UTC (rev 51525)
@@ -220,11 +220,12 @@
             row = layout.row()
             row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
             row.prop(md, "invert_vertex_group")
-            layout.prop(md, "use_triangulate")
+            layout.prop(md, "use_collapse_triangulate")
         elif decimate_type == 'UNSUBDIV':
             layout.prop(md, "iterations")
         else:  # decimate_type == 'DISSOLVE':
             layout.prop(md, "angle_limit")
+            layout.prop(md, "use_dissolve_boundaries")
 
         layout.label(text="Face Count" + ": %d" % md.face_count)
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h	2012-10-23 06:13:56 UTC (rev 51525)
@@ -32,10 +32,10 @@
 void BM_mesh_decimate_unsubdivide_ex(BMesh *bm, const int iterations, const int tag_only);
 void BM_mesh_decimate_unsubdivide(BMesh *bm, const int iterations);
 
-void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit,
+void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const int do_dissolve_boundaries,
                                   BMVert **vinput_arr, const int vinput_len,
                                   BMEdge **einput_arr, const int einput_len);
-void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit);
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const int do_dissolve_boundaries);
 
 
 #endif /* __BMESH_DECIMATE_H__ */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_decimate_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_decimate_dissolve.c	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_decimate_dissolve.c	2012-10-23 06:13:56 UTC (rev 51525)
@@ -69,7 +69,10 @@
 	return 0;
 }
 
-void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit,
+/**
+ * \param do_all_verts Collapse all verts between 2 faces - don't check their edge angle.
+ */
+void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const int do_dissolve_boundaries,
                                   BMVert **vinput_arr, const int vinput_len,
                                   BMEdge **einput_arr, const int einput_len)
 {
@@ -172,35 +175,48 @@
 
 
 	/* --- second verts --- */
-	for (i = 0, tot_found = 0; i < vinput_len; i++) {
-		BMVert *v = vinput_arr[i];
-		const float angle = v ? bm_vert_edge_face_angle(v) : angle_limit;
-
-		if (angle < angle_limit) {
-			weight_elems[i].ele = (BMHeader *)v;
-			weight_elems[i].weight = angle;
-			tot_found++;
+	if (do_dissolve_boundaries) {
+		/* simple version of the branch below, sincve we will dissolve _all_ verts that use 2 edges */
+		for (i = 0; i < vinput_len; i++) {
+			BMVert *v = vinput_arr[i];
+			if (v) {
+				if (BM_vert_edge_count(v) == 2) {
+					BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
+				}
+			}
 		}
-		else {
-			weight_elems[i].ele = NULL;
-			weight_elems[i].weight = angle_max;
-		}
 	}
+	else {
+		for (i = 0, tot_found = 0; i < vinput_len; i++) {
+			BMVert *v = vinput_arr[i];
+			const float angle = v ? bm_vert_edge_face_angle(v) : angle_limit;
 
-	if (tot_found != 0) {
-		qsort(weight_elems, vinput_len, sizeof(DissolveElemWeight), dissolve_elem_cmp);
+			if (angle < angle_limit) {
+				weight_elems[i].ele = (BMHeader *)v;
+				weight_elems[i].weight = angle;
+				tot_found++;
+			}
+			else {
+				weight_elems[i].ele = NULL;
+				weight_elems[i].weight = angle_max;
+			}
+		}
 
-		for (i = 0; i < tot_found; i++) {
-			BMVert *v = (BMVert *)weight_elems[i].ele;
-			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 (tot_found != 0) {
+			qsort(weight_elems, vinput_len, sizeof(DissolveElemWeight), dissolve_elem_cmp);
 
-				if (ne && ne->l) {
-					BM_edge_normals_update(ne);
+			for (i = 0; i < tot_found; i++) {
+				BMVert *v = (BMVert *)weight_elems[i].ele;
+				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(ne);
+					}
 				}
 			}
 		}
@@ -209,7 +225,7 @@
 	MEM_freeN(weight_elems);
 }
 
-void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit)
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const int do_dissolve_boundaries)
 {
 	int vinput_len;
 	int einput_len;
@@ -217,7 +233,7 @@
 	BMVert **vinput_arr = BM_iter_as_arrayN(bm, BM_VERTS_OF_MESH, NULL, &vinput_len);
 	BMEdge **einput_arr = BM_iter_as_arrayN(bm, BM_EDGES_OF_MESH, NULL, &einput_len);
 
-	BM_mesh_decimate_dissolve_ex(bm, angle_limit,
+	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
 	                             vinput_arr, vinput_len,
 	                             einput_arr, einput_len);
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-10-23 06:13:56 UTC (rev 51525)
@@ -679,6 +679,7 @@
 static BMOpDefine bmo_dissolve_limit_def = {
 	"dissolve_limit",
 	{{BMO_OP_SLOT_FLT, "angle_limit"}, /* total rotation angle (degrees) */
+	 {BMO_OP_SLOT_BOOL, "use_dissolve_boundaries"},
 	 {BMO_OP_SLOT_ELEMENT_BUF, "verts"},
 	 {BMO_OP_SLOT_ELEMENT_BUF, "edges"},
 	 {0} /* null-terminating sentinel */},

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2012-10-23 06:13:56 UTC (rev 51525)
@@ -483,8 +483,9 @@
 	BMOpSlot *vinput = BMO_slot_get(op, "verts");
 	const float angle_max = (float)M_PI / 2.0f;
 	const float angle_limit = minf(angle_max, BMO_slot_float_get(op, "angle_limit"));
+	const int do_dissolve_boundaries = BMO_slot_bool_get(op, "use_dissolve_boundaries");
 
-	BM_mesh_decimate_dissolve_ex(bm, angle_limit,
+	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
 	                             vinput->data.p, vinput->len,
 	                             einput->data.p, einput->len);
 }

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-10-23 06:13:56 UTC (rev 51525)
@@ -3412,7 +3412,8 @@
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
 	BMesh *bm = em->bm;
-	float angle_limit = RNA_float_get(op->ptr, "angle_limit");
+	const float angle_limit = RNA_float_get(op->ptr, "angle_limit");
+	const int use_dissolve_boundaries = RNA_boolean_get(op->ptr, "use_dissolve_boundaries");
 
 	char dissolve_flag;
 
@@ -3448,8 +3449,8 @@
 	}
 
 	if (!EDBM_op_callf(em, op,
-	                   "dissolve_limit edges=%he verts=%hv angle_limit=%f",
-	                   dissolve_flag, dissolve_flag, angle_limit))
+	                   "dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b",
+	                   dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -3478,6 +3479,8 @@
 	prop = RNA_def_float_rotation(ot->srna, "angle_limit", 0, NULL, 0.0f, DEG2RADF(180.0f),
 	                              "Max Angle", "Angle Limit in Degrees", 0.0f, DEG2RADF(180.0f));
 	RNA_def_property_float_default(prop, DEG2RADF(15.0f));
+	RNA_def_boolean(ot->srna, "use_dissolve_boundaries", 0, "All Boundries",
+	                "Dissolve all vertices inbetween face boundaries");
 }
 
 static int edbm_split_exec(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-10-23 06:13:56 UTC (rev 51525)
@@ -374,8 +374,9 @@
 } DecimateModifierData;
 
 enum {
-	MOD_DECIM_FLAG_INVERT_VGROUP = (1 << 0),
-	MOD_DECIM_FLAG_TRIANGULATE   = (1 << 1)   /* for collapse only. dont convert tri pairs back to quads */
+	MOD_DECIM_FLAG_INVERT_VGROUP       = (1 << 0),
+	MOD_DECIM_FLAG_TRIANGULATE         = (1 << 1),  /* for collapse only. dont convert tri pairs back to quads */
+	MOD_DECIM_FLAG_ALL_BOUNDARY_VERTS  = (1 << 2)   /* for dissolve only. collapse all verts between 2 faces */
 };
 
 enum {

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-10-23 05:48:21 UTC (rev 51524)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-10-23 06:13:56 UTC (rev 51525)
@@ -1167,12 +1167,21 @@
 	RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
-	prop = RNA_def_property(srna, "use_triangulate", PROP_BOOLEAN, PROP_NONE);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list