[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56969] trunk/blender/source/blender/ editors/object/object_vgroup.c: Weight tools: Clean added additional selection options in operator Panel

Gaia Clary gaia.clary at machinimatrix.org
Thu May 23 00:03:15 CEST 2013


Revision: 56969
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56969
Author:   gaiaclary
Date:     2013-05-22 22:03:14 +0000 (Wed, 22 May 2013)
Log Message:
-----------
Weight tools: Clean added additional selection options in operator Panel

Modified Paths:
--------------
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2013-05-22 20:46:48 UTC (rev 56968)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2013-05-22 22:03:14 UTC (rev 56969)
@@ -64,6 +64,7 @@
 #include "BKE_report.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_object_deform.h"
+#include "BKE_object.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -426,6 +427,13 @@
 	WT_REPLACE_EMPTY_WEIGHTS = 2
 } WT_ReplaceMode;
 
+typedef enum WT_VertexGroupSelect {
+	WT_VGROUP_ACTIVE = 1,
+	WT_VGROUP_BONE_SELECT = 2,
+	WT_VGROUP_BONE_DEFORM = 3,
+	WT_VGROUP_ALL = 4,
+} WT_VertexGroupSelect;
+
 static EnumPropertyItem WT_vertex_group_mode_item[] = {
 	{WT_REPLACE_ACTIVE_VERTEX_GROUP,
 	 "WT_REPLACE_ACTIVE_VERTEX_GROUP", 0, "Active", "Transfer active vertex group from selected to active mesh"},
@@ -454,6 +462,18 @@
 	{0, NULL, 0, NULL, NULL}
 };
 
+static EnumPropertyItem WT_vertex_group_select_item[] = {
+	{WT_VGROUP_ACTIVE,
+	 "ACTIVE", 0, "Active Group", "The active Vertex Group"},
+	{WT_VGROUP_BONE_SELECT,
+	 "BONE_SELECT", 0, "Pose Bone (Select)", "All Vertex Groups assigned to Selection"},
+	{WT_VGROUP_BONE_DEFORM,
+	 "BONE_DEFORM", 0, "Pose Bone (Deform)", "All Vertex Groups assigned to Deform Bones"},
+	{WT_VGROUP_ALL,
+	 "ALL", 0, "All Groups", "All Vertex Groups"},
+	{0, NULL, 0, NULL, NULL}
+};
+
 /* Copy weight.*/
 static void vgroup_transfer_weight(float *r_weight_dst, const float weight_src, const WT_ReplaceMode replace_mode)
 {
@@ -1071,6 +1091,53 @@
 	}
 }
 
+/**
+ * Return the subset type of the Vertex Group Selection
+ */
+static bool *vgroup_subset_from_select_type(Object *ob, WT_VertexGroupSelect subset_type, int *r_subset_count)
+{
+	bool *vgroup_validmap = NULL;
+	const int defbase_tot = BLI_countlist(&ob->defbase);
+
+	switch(subset_type) {
+		case WT_VGROUP_ALL:
+			vgroup_validmap = MEM_mallocN(defbase_tot * sizeof(*vgroup_validmap), __func__);
+			memset(vgroup_validmap, true, sizeof(bool) * defbase_tot);
+			*r_subset_count = defbase_tot;
+			break;
+		case WT_VGROUP_ACTIVE:
+		{
+			const int def_nr_active = ob->actdef - 1;
+			vgroup_validmap = MEM_mallocN(defbase_tot * sizeof(*vgroup_validmap), __func__);
+			memset(vgroup_validmap, false, sizeof(bool) * defbase_tot);
+			if (def_nr_active < defbase_tot) {
+				*r_subset_count = 1;
+				vgroup_validmap[def_nr_active] = true;
+			}
+			else {
+				*r_subset_count = 0;
+			}
+			break;
+		}
+		case WT_VGROUP_BONE_SELECT: {
+			vgroup_validmap = BKE_objdef_selected_get(ob, defbase_tot, r_subset_count);
+			break;
+		}
+		case WT_VGROUP_BONE_DEFORM: {
+			int i;
+			vgroup_validmap = BKE_objdef_validmap_get(ob, defbase_tot);
+			*r_subset_count = 0;
+			for (i = 0; i < defbase_tot; i++) {
+				if (vgroup_validmap[i])
+					*r_subset_count += 1;
+			}
+			break;
+		}
+	}
+
+	return vgroup_validmap;
+}
+
 static void vgroup_normalize(Object *ob)
 {
 	MDeformWeight *dw;
@@ -1884,49 +1951,14 @@
 	return is_change;
 }
 
-static void vgroup_clean(Object *ob, const float epsilon, const bool keep_single)
-{
-	MDeformWeight *dw;
-	MDeformVert *dv, **dvert_array = NULL;
-	int i, dvert_tot = 0;
-	const int def_nr = ob->actdef - 1;
-	const int use_vert_sel = vertex_group_use_vert_sel(ob);
 
-	if (!BLI_findlink(&ob->defbase, def_nr)) {
-		return;
-	}
-
-	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
-
-	if (dvert_array) {
-		/* only the active group */
-		for (i = 0; i < dvert_tot; i++) {
-
-			/* in case its not selected */
-			if (!(dv = dvert_array[i])) {
-				continue;
-			}
-
-			dw = defvert_find_index(dv, def_nr);
-
-			if (dw) {
-				if (dw->weight <= epsilon) {
-					if (keep_single == false || dv->totweight > 1) {
-						defvert_remove_group(dv, dw); /* dw can be NULL */
-					}
-				}
-			}
-		}
-
-		MEM_freeN(dvert_array);
-	}
-}
-
-static void vgroup_clean_all(Object *ob, const float epsilon, const bool keep_single)
+static void vgroup_clean_subset(Object *ob, const bool *vgroup_validmap,
+                                const float epsilon, const bool keep_single)
 {
 	MDeformVert **dvert_array = NULL;
 	int i, dvert_tot = 0;
 	const int use_vert_sel = vertex_group_use_vert_sel(ob);
+	const int defbase_tot = BLI_countlist(&ob->defbase);
 
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
 
@@ -1950,9 +1982,10 @@
 					break;
 
 				dw = dv->dw + j;
-
-				if (dw->weight <= epsilon) {
-					defvert_remove_group(dv, dw);
+				if ((dw->def_nr < defbase_tot) && vgroup_validmap[dw->def_nr]) {
+					if (dw->weight <= epsilon) {
+						defvert_remove_group(dv, dw);
+					}
 				}
 			}
 		}
@@ -2912,6 +2945,46 @@
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
+static EnumPropertyItem *rna_vertex_group_selection_itemf(bContext *C, PointerRNA *UNUSED(ptr),
+                                                PropertyRNA *UNUSED(prop), int *free)
+{
+	Object *ob;
+	EnumPropertyItem *item = NULL;
+	int totitem = 0;
+
+
+	if (!C) /* needed for docs and i18n tools */
+		return WT_vertex_group_select_item;
+
+	ob = CTX_data_active_object(C);
+	RNA_enum_items_add_value(&item, &totitem, WT_vertex_group_select_item, WT_VGROUP_ACTIVE);
+
+	if (BKE_object_pose_armature_get(ob)) {
+		RNA_enum_items_add_value(&item, &totitem, WT_vertex_group_select_item, WT_VGROUP_BONE_SELECT);
+		RNA_enum_items_add_value(&item, &totitem, WT_vertex_group_select_item, WT_VGROUP_BONE_DEFORM);
+	}
+
+	RNA_enum_items_add_value(&item, &totitem, WT_vertex_group_select_item, WT_VGROUP_ALL);
+
+	RNA_enum_item_end(&item, &totitem);
+	*free = true;
+
+	return item;
+}
+
+static void vgroup_operator_subset_select_props(wmOperatorType *ot)
+{
+	PropertyRNA *prop;
+
+	prop = RNA_def_enum(ot->srna,
+	                    "group_select_mode", DummyRNA_NULL_items,
+	                    WT_VGROUP_ACTIVE, "Subset",
+	                    "Define which subset of Groups shall be used");
+	RNA_def_enum_funcs(prop, rna_vertex_group_selection_itemf);
+	ot->prop = prop;
+}
+
+
 static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op)
 {
 	Object *ob = ED_object_context(C);
@@ -3129,12 +3202,15 @@
 	Object *ob = ED_object_context(C);
 
 	float limit = RNA_float_get(op->ptr, "limit");
-	bool all_groups = RNA_boolean_get(op->ptr, "all_groups");
 	bool keep_single = RNA_boolean_get(op->ptr, "keep_single");
+	WT_VertexGroupSelect subset_type  = RNA_enum_get(op->ptr, "group_select_mode");
+	int subset_count;
+	bool *vgroup_validmap = vgroup_subset_from_select_type(ob, subset_type, &subset_count);
 
-	if (all_groups) vgroup_clean_all(ob, limit, keep_single);
-	else vgroup_clean(ob, limit, keep_single);
+	vgroup_clean_subset(ob, vgroup_validmap, limit, keep_single);
 
+	MEM_freeN(vgroup_validmap);
+
 	DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 	WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
@@ -3156,8 +3232,8 @@
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
+	vgroup_operator_subset_select_props(ot);
 	RNA_def_float(ot->srna, "limit", 0.0f, 0.0f, 1.0, "Limit", "Remove weights under this limit", 0.0f, 0.99f);
-	RNA_def_boolean(ot->srna, "all_groups", false, "All Groups", "Clean all vertex groups");
 	RNA_def_boolean(ot->srna, "keep_single", false, "Keep Single",
 	                "Keep verts assigned to at least one group when cleaning");
 }




More information about the Bf-blender-cvs mailing list