[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57216] trunk/blender: fix [#35311] Planar Decimate / Limited Dissolve fails to merge some adjacent faces

Campbell Barton ideasman42 at gmail.com
Mon Jun 3 07:07:16 CEST 2013


Revision: 57216
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57216
Author:   campbellbarton
Date:     2013-06-03 05:07:16 +0000 (Mon, 03 Jun 2013)
Log Message:
-----------
fix [#35311] Planar Decimate / Limited Dissolve fails to merge some adjacent faces
optionally limit by face flipping, also added support to delimit by material and edge crease.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
    trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/makesdna/DNA_modifier_types.h
    trunk/blender/source/blender/makesrna/RNA_enum_types.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c
    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	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2013-06-03 05:07:16 UTC (rev 57216)
@@ -262,6 +262,9 @@
         else:  # decimate_type == 'DISSOLVE':
             layout.prop(md, "angle_limit")
             layout.prop(md, "use_dissolve_boundaries")
+            layout.label("Delimit:")
+            row = layout.row()
+            row.prop(md, "delimit")
 
         layout.label(text=iface_("Face Count: %d") % md.face_count, translate=False)
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2013-06-03 05:07:16 UTC (rev 57216)
@@ -941,6 +941,7 @@
 	 {"use_dissolve_boundaries", BMO_OP_SLOT_BOOL},
 	 {"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}},
 	 {"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}},
+	 {"delimit", BMO_OP_SLOT_INT},
 	 {{'\0'}},
 	},
 	{{{'\0'}}},  /* no output */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operator_api.h	2013-06-03 05:07:16 UTC (rev 57216)
@@ -297,6 +297,12 @@
 	BMO_SYMMETRIZE_POSITIVE_Z,
 } BMO_SymmDirection;
 
+typedef enum {
+	BMO_DELIM_NORMAL = 1 << 0,
+	BMO_DELIM_MATERIAL = 1 << 1,
+	BMO_DELIM_SEAM = 1 << 2,
+} BMO_Delimit;
+
 void BMO_op_flag_enable(BMesh *bm, BMOperator *op, const int op_flag);
 void BMO_op_flag_disable(BMesh *bm, BMOperator *op, const int op_flag);
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c	2013-06-03 05:07:16 UTC (rev 57216)
@@ -452,8 +452,9 @@
 	const float angle_max = (float)M_PI / 2.0f;
 	const float angle_limit = min_ff(angle_max, BMO_slot_float_get(op->slots_in, "angle_limit"));
 	const bool do_dissolve_boundaries = BMO_slot_bool_get(op->slots_in, "use_dissolve_boundaries");
+	const BMO_Delimit delimit = BMO_slot_int_get(op->slots_in, "delimit");
 
-	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
+	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries, delimit,
 	                             (BMVert **)BMO_SLOT_AS_BUFFER(vinput), vinput->len,
 	                             (BMEdge **)BMO_SLOT_AS_BUFFER(einput), einput->len);
 }

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate.h	2013-06-03 05:07:16 UTC (rev 57216)
@@ -33,9 +33,11 @@
 void BM_mesh_decimate_unsubdivide(BMesh *bm, const int iterations);
 
 void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+                                  const BMO_Delimit delimit,
                                   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, const bool do_dissolve_boundaries);
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+                               const BMO_Delimit delimit);
 
 /* these weights are accumulated so too high values may reach 'inf' too quickly */
 #define BM_MESH_DECIM_WEIGHT_MAX 100000.0f

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_decimate_dissolve.c	2013-06-03 05:07:16 UTC (rev 57216)
@@ -70,6 +70,7 @@
 }
 
 void BM_mesh_decimate_dissolve_ex(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+                                  const BMO_Delimit delimit,
                                   BMVert **vinput_arr, const int vinput_len,
                                   BMEdge **einput_arr, const int einput_len)
 {
@@ -77,7 +78,6 @@
 	DissolveElemWeight *weight_elems = MEM_mallocN(max_ii(einput_len, vinput_len) *
 	                                               sizeof(DissolveElemWeight), __func__);
 	int i, tot_found;
-
 	BMIter iter;
 	BMEdge *e_iter;
 	BMEdge **earray;
@@ -94,8 +94,14 @@
 	/* go through and split edge */
 	for (i = 0, tot_found = 0; i < einput_len; i++) {
 		BMEdge *e = einput_arr[i];
-		const float angle = BM_edge_calc_face_angle(e);
+		const bool is_contig = BM_edge_is_contiguous(e);
+		float angle;
 
+		angle = BM_edge_calc_face_angle(e);
+		if (is_contig == false) {
+			angle = (float)M_PI - angle;
+		}
+
 		if (angle < angle_limit) {
 			tot_found++;
 		}
@@ -108,12 +114,39 @@
 
 		for (i = 0; i < tot_found; i++) {
 			BMEdge *e = (BMEdge *)weight_elems[i].ele;
+			const bool is_contig = BM_edge_is_contiguous(e);
+			float angle;
 
-			if (/* may have become non-manifold */
-			    BM_edge_is_manifold(e) &&
-			    /* check twice because cumulative effect could dissolve over angle limit */
-			    (BM_edge_calc_face_angle(e) < angle_limit))
+			/* may have become non-manifold */
+			if (!BM_edge_is_manifold(e)) {
+				continue;
+			}
+
+			if ((delimit & BMO_DELIM_SEAM) &&
+			    (BM_elem_flag_test(e, BMO_DELIM_SEAM)))
 			{
+				continue;
+			}
+
+			if ((delimit & BMO_DELIM_MATERIAL) &&
+			    (e->l->f->mat_nr != e->l->radial_next->f->mat_nr))
+			{
+				continue;
+			}
+
+			if ((delimit & BMO_DELIM_NORMAL) &&
+			    (is_contig == false))
+			{
+				continue;
+			}
+
+			/* check twice because cumulative effect could dissolve over angle limit */
+			angle = BM_edge_calc_face_angle(e);
+			if (is_contig == false) {
+				angle = (float)M_PI - angle;
+			}
+
+			if (angle < angle_limit) {
 				BMFace *f_new = BM_faces_join_pair(bm, e->l->f,
 				                                   e->l->radial_next->f,
 				                                   e,
@@ -223,7 +256,8 @@
 	MEM_freeN(weight_elems);
 }
 
-void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries)
+void BM_mesh_decimate_dissolve(BMesh *bm, const float angle_limit, const bool do_dissolve_boundaries,
+                               const BMO_Delimit delimit)
 {
 	int vinput_len;
 	int einput_len;
@@ -231,7 +265,9 @@
 	BMVert **vinput_arr = BM_iter_as_arrayN(bm, BM_VERTS_OF_MESH, NULL, &vinput_len, NULL, 0);
 	BMEdge **einput_arr = BM_iter_as_arrayN(bm, BM_EDGES_OF_MESH, NULL, &einput_len, NULL, 0);
 
+
 	BM_mesh_decimate_dissolve_ex(bm, angle_limit, do_dissolve_boundaries,
+	                             delimit,
 	                             vinput_arr, vinput_len,
 	                             einput_arr, einput_len);
 

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2013-06-03 05:07:16 UTC (rev 57216)
@@ -150,7 +150,7 @@
 				if ((id->name[2] == '.') && (str[0] != '.'))
 					continue;
 
-			if (BLI_strcasestr(id->name + 2, str)) {
+			if (*str == '\0' || BLI_strcasestr(id->name + 2, str)) {
 				/* +1 is needed because name_uiprefix_id used 3 letter prefix
 				 * followed by ID_NAME-2 characters from id->name
 				 */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2013-06-03 05:07:16 UTC (rev 57216)
@@ -3056,6 +3056,7 @@
 	BMesh *bm = em->bm;
 	const float angle_limit = RNA_float_get(op->ptr, "angle_limit");
 	const bool use_dissolve_boundaries = RNA_boolean_get(op->ptr, "use_dissolve_boundaries");
+	const int delimit = RNA_enum_get(op->ptr, "delimit");
 
 	char dissolve_flag;
 
@@ -3091,8 +3092,8 @@
 	}
 
 	if (!EDBM_op_callf(em, op,
-	                   "dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b",
-	                   dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries))
+	                   "dissolve_limit edges=%he verts=%hv angle_limit=%f use_dissolve_boundaries=%b delimit=%i",
+	                   dissolve_flag, dissolve_flag, angle_limit, use_dissolve_boundaries, delimit))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -3123,6 +3124,8 @@
 	RNA_def_property_float_default(prop, DEG2RADF(5.0f));
 	RNA_def_boolean(ot->srna, "use_dissolve_boundaries", 0, "All Boundaries",
 	                "Dissolve all vertices inbetween face boundaries");
+	RNA_def_enum_flag(ot->srna, "delimit", mesh_delimit_mode_items, 0, "Delimit",
+	                  "Delimit dissolve operation");
 }
 
 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	2013-06-03 04:58:46 UTC (rev 57215)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2013-06-03 05:07:16 UTC (rev 57216)
@@ -367,7 +367,8 @@
 
 	float percent;  /* (mode == MOD_DECIM_MODE_COLLAPSE) */
 	short   iter;   /* (mode == MOD_DECIM_MODE_UNSUBDIV) */
-	short   pad;
+	char delimit;   /* (mode == MOD_DECIM_MODE_DISSOLVE) */
+	char pad;
 	float   angle;  /* (mode == MOD_DECIM_MODE_DISSOLVE) */
 
 	char defgrp_name[64];	/* MAX_VGROUP_NAME */


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list