[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51506] trunk/blender: add vertex group option to decimate modifier, handy if you want to pin some parts of the geometry.

Campbell Barton ideasman42 at gmail.com
Mon Oct 22 17:39:07 CEST 2012


Revision: 51506
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51506
Author:   campbellbarton
Date:     2012-10-22 15:39:06 +0000 (Mon, 22 Oct 2012)
Log Message:
-----------
add vertex group option to decimate modifier, handy if you want to pin some parts of the geometry.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/bmesh/intern/bmesh_decimate.c
    trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h
    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
    trunk/blender/source/blender/modifiers/intern/MOD_util.h

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-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2012-10-22 15:39:06 UTC (rev 51506)
@@ -212,6 +212,9 @@
 
     def DECIMATE(self, layout, ob, md):
         layout.prop(md, "ratio")
+        row = layout.row()
+        row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        row.prop(md, "invert_vertex_group")
         layout.label(text="Face Count" + ": %d" % md.face_count)
 
     def DISPLACE(self, layout, ob, md):

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_decimate.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_decimate.c	2012-10-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_decimate.c	2012-10-22 15:39:06 UTC (rev 51506)
@@ -144,7 +144,7 @@
 }
 
 static void bm_decim_build_edge_cost_single(BMEdge *e,
-                                            const Quadric *vquadrics,
+                                            const Quadric *vquadrics, const float *vweights,
                                             Heap *eheap, HeapNode **eheap_table)
 {
 	const Quadric *q1, *q2;
@@ -180,6 +180,16 @@
 		eheap_table[BM_elem_index_get(e)] = NULL;
 		return;
 	}
+
+	if (vweights) {
+		if ((vweights[BM_elem_index_get(e->v1)] < FLT_EPSILON) &&
+		    (vweights[BM_elem_index_get(e->v2)] < FLT_EPSILON))
+		{
+			/* skip collapsing this edge */
+			eheap_table[BM_elem_index_get(e)] = NULL;
+			return;
+		}
+	}
 	/* end sanity check */
 
 
@@ -188,14 +198,21 @@
 	q1 = &vquadrics[BM_elem_index_get(e->v1)];
 	q2 = &vquadrics[BM_elem_index_get(e->v2)];
 
-	cost = (BLI_quadric_evaluate(q1, optimize_co) + BLI_quadric_evaluate(q2, optimize_co));
+	if (vweights == NULL) {
+		cost = (BLI_quadric_evaluate(q1, optimize_co) +
+		        BLI_quadric_evaluate(q2, optimize_co));
+	}
+	else {
+		cost = ((BLI_quadric_evaluate(q1, optimize_co) * vweights[BM_elem_index_get(e->v1)]) +
+		        (BLI_quadric_evaluate(q2, optimize_co) * vweights[BM_elem_index_get(e->v2)]));
+	}
 	// print("COST %.12f\n");
 
 	eheap_table[BM_elem_index_get(e)] = BLI_heap_insert(eheap, cost, e);
 }
 
 static void bm_decim_build_edge_cost(BMesh *bm,
-                                     const Quadric *vquadrics,
+                                     const Quadric *vquadrics, const float *vweights,
                                      Heap *eheap, HeapNode **eheap_table)
 {
 	BMIter iter;
@@ -204,7 +221,7 @@
 
 	BM_ITER_MESH_INDEX (e, &iter, bm, BM_EDGES_OF_MESH, i) {
 		eheap_table[i] = NULL;  /* keep sanity check happy */
-		bm_decim_build_edge_cost_single(e, vquadrics, eheap, eheap_table);
+		bm_decim_build_edge_cost_single(e, vquadrics, vweights, eheap, eheap_table);
 
 #ifdef USE_PRESERVE_BOUNDARY
 		/* init: runs second! */
@@ -268,15 +285,16 @@
 	BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
 		if (f->len == 4) {
 			BMLoop *f_l[4];
-			BMLoop *l_iter;
 			BMLoop *l_a, *l_b;
 
-			l_iter = BM_FACE_FIRST_LOOP(f);
+			{
+				BMLoop *l_iter = BM_FACE_FIRST_LOOP(f);
 
-			f_l[0] = l_iter; l_iter = l_iter->next;
-			f_l[1] = l_iter; l_iter = l_iter->next;
-			f_l[2] = l_iter; l_iter = l_iter->next;
-			f_l[3] = l_iter; l_iter = l_iter->next;
+				f_l[0] = l_iter; l_iter = l_iter->next;
+				f_l[1] = l_iter; l_iter = l_iter->next;
+				f_l[2] = l_iter; l_iter = l_iter->next;
+				f_l[3] = l_iter;
+			}
 
 			if (len_squared_v3v3(f_l[0]->v->co, f_l[2]->v->co) <
 			    len_squared_v3v3(f_l[1]->v->co, f_l[3]->v->co))
@@ -764,7 +782,7 @@
 
 /* collapse e the edge, removing e->v2 */
 static void bm_decim_edge_collapse(BMesh *bm, BMEdge *e,
-                                   Quadric *vquadrics,
+                                   Quadric *vquadrics, float *vweights,
                                    Heap *eheap, HeapNode **eheap_table,
                                    const CD_UseFlag customdata_flag)
 {
@@ -796,6 +814,12 @@
 		/* update collapse info */
 		int i;
 
+		if (vweights) {
+			const int fac = CLAMPIS(customdata_fac, 0.0f, 1.0f);
+			vweights[BM_elem_index_get(v_other)] = (vweights[v_clear_index]              * (1.0f - fac)) +
+			                                       (vweights[BM_elem_index_get(v_other)] * fac);
+		}
+
 		e = NULL;  /* paranoid safety check */
 
 		copy_v3_v3(v_other->co, optimize_co);
@@ -825,7 +849,7 @@
 			e_iter = e_first = v_other->e;
 			do {
 				BLI_assert(BM_edge_find_double(e_iter) == NULL);
-				bm_decim_build_edge_cost_single(e_iter, vquadrics, eheap, eheap_table);
+				bm_decim_build_edge_cost_single(e_iter, vquadrics, vweights, eheap, eheap_table);
 			} while ((e_iter = bmesh_disk_edge_next(e_iter, v_other)) != e_first);
 		}
 
@@ -857,7 +881,14 @@
 /* Main Decimate Function
  * ********************** */
 
-void BM_mesh_decimate(BMesh *bm, const float factor)
+/**
+ * \brief BM_mesh_decimate
+ * \param bm The mesh
+ * \param factor face count multiplier [0 - 1]
+ * \param vertex_weights Optional array of vertex  aligned weights [0 - 1],
+ *        a vertex group is the usual source for this.
+ */
+void BM_mesh_decimate(BMesh *bm, const float factor, float *vweights)
 {
 	Heap *eheap;             /* edge heap */
 	HeapNode **eheap_table;  /* edge index aligned table pointing to the eheap */
@@ -885,7 +916,7 @@
 	/* build initial edge collapse cost data */
 	bm_decim_build_quadrics(bm, vquadrics);
 
-	bm_decim_build_edge_cost(bm, vquadrics, eheap, eheap_table);
+	bm_decim_build_edge_cost(bm, vquadrics, vweights, eheap, eheap_table);
 
 	face_tot_target = bm->totface * factor;
 	bm->elem_index_dirty |= BM_FACE | BM_EDGE | BM_VERT;
@@ -910,7 +941,7 @@
 		 * but NULL just incase so we don't use freed node */
 		eheap_table[BM_elem_index_get(e)] = NULL;
 
-		bm_decim_edge_collapse(bm, e, vquadrics, eheap, eheap_table, customdata_flag);
+		bm_decim_edge_collapse(bm, e, vquadrics, vweights, eheap, eheap_table, customdata_flag);
 	}
 
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h	2012-10-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_decimate.h	2012-10-22 15:39:06 UTC (rev 51506)
@@ -27,6 +27,6 @@
  *  \ingroup bmesh
  */
 
-void BM_mesh_decimate(BMesh *bm, const float factor);
+void BM_mesh_decimate(BMesh *bm, const float factor, float *vweights);
 
 #endif /* __BMESH_DECIMATE_H__ */

Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-10-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h	2012-10-22 15:39:06 UTC (rev 51506)
@@ -362,9 +362,16 @@
 	ModifierData modifier;
 
 	float percent;
-	int faceCount;
+	int faceCount;  /* runtime only */
+
+	char defgrp_name[64];	/* MAX_VGROUP_NAME */
+	int flag, pad;
 } DecimateModifierData;
 
+enum {
+	MOD_DECIM_INVERT_VGROUP	= (1 << 0)
+};
+
 /* Smooth modifier flags */
 #define MOD_SMOOTH_X (1<<1)
 #define MOD_SMOOTH_Y (1<<2)

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-10-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2012-10-22 15:39:06 UTC (rev 51506)
@@ -377,6 +377,12 @@
 	rna_object_vgroup_name_set(ptr, value, smd->defgrp_name, sizeof(smd->defgrp_name));
 }
 
+static void rna_DecimateModifier_vgroup_set(PointerRNA *ptr, const char *value)
+{
+	DecimateModifierData *dmd = (DecimateModifierData *)ptr->data;
+	rna_object_vgroup_name_set(ptr, value, dmd->defgrp_name, sizeof(dmd->defgrp_name));
+}
+
 static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value)
 {
 	ModifierData *md = (ModifierData *)ptr->data;
@@ -1119,6 +1125,17 @@
 	RNA_def_property_ui_text(prop, "Ratio", "Ratio of triangles to reduce to");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+	prop = RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+	RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DecimateModifier_vgroup_set");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+	prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_DECIM_INVERT_VGROUP);
+	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, "face_count", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "faceCount");
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_decimate.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2012-10-22 14:49:37 UTC (rev 51505)
+++ trunk/blender/source/blender/modifiers/intern/MOD_decimate.c	2012-10-22 15:39:06 UTC (rev 51506)
@@ -32,9 +32,10 @@
  *  \ingroup modifiers
  */
 
-#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
 
 #include "BLI_math.h"
+#include "BLI_string.h"
 #include "BLI_utildefines.h"
 
 #include "BLF_translation.h"
@@ -43,6 +44,7 @@
 
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
+#include "BKE_deform.h"
 #include "BKE_particle.h"
 #include "BKE_cdderivedmesh.h"
 
@@ -70,9 +72,22 @@
 	DecimateModifierData *tdmd = (DecimateModifierData *) target;
 
 	tdmd->percent = dmd->percent;
+	BLI_strncpy(tdmd->defgrp_name, dmd->defgrp_name, sizeof(tdmd->defgrp_name));
+	tdmd->flag = dmd->flag;
 }
 
-static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+	DecimateModifierData *dmd = (DecimateModifierData *) md;
+	CustomDataMask dataMask = 0;
+
+	/* ask for vertexgroups if we need them */
+	if (dmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list