[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56999] trunk/blender/source/blender/ editors/object/object_vgroup.c: weight tools: added more selection types to levels operator

Gaia Clary gaia.clary at machinimatrix.org
Fri May 24 12:46:37 CEST 2013


Revision: 56999
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56999
Author:   gaiaclary
Date:     2013-05-24 10:46:37 +0000 (Fri, 24 May 2013)
Log Message:
-----------
weight tools: added more selection types to levels operator

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-24 10:16:07 UTC (rev 56998)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2013-05-24 10:46:37 UTC (rev 56999)
@@ -474,6 +474,45 @@
 	{0, NULL, 0, NULL, NULL}
 };
 
+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;
+}
+
 /* Copy weight.*/
 static void vgroup_transfer_weight(float *r_weight_dst, const float weight_src, const WT_ReplaceMode replace_mode)
 {
@@ -1544,34 +1583,37 @@
 	}
 }
 
-static void vgroup_levels(Object *ob, float offset, float gain)
+static void vgroup_levels_subset(Object *ob, bool *vgroup_validmap, const int vgroup_tot, const int UNUSED(subset_count), 
+								 const float offset, const float gain)
 {
 	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) {
+
 		for (i = 0; i < dvert_tot; i++) {
+			int j;
 
 			/* in case its not selected */
 			if (!(dv = dvert_array[i])) {
 				continue;
 			}
 
-			dw = defvert_find_index(dv, def_nr);
-			if (dw) {
-				dw->weight = gain * (dw->weight + offset);
+			j = vgroup_tot;
+			while(j--) {
+				if (vgroup_validmap[j]) {
+					dw = defvert_find_index(dv, j);
+					if (dw) {
+						dw->weight = gain * (dw->weight + offset);
 
-				CLAMP(dw->weight, 0.0f, 1.0f);
+						CLAMP(dw->weight, 0.0f, 1.0f);
+					}
+				}
 			}
 		}
 
@@ -2890,9 +2932,13 @@
 	
 	float offset = RNA_float_get(op->ptr, "offset");
 	float gain = RNA_float_get(op->ptr, "gain");
+	WT_VertexGroupSelect subset_type  = RNA_enum_get(op->ptr, "group_select_mode");
+
+	int subset_count, vgroup_tot;
+
+	bool *vgroup_validmap = vgroup_subset_from_select_type(ob, subset_type, &vgroup_tot, &subset_count);
+	vgroup_levels_subset(ob, vgroup_validmap, vgroup_tot, subset_count, offset, gain);
 	
-	vgroup_levels(ob, offset, gain);
-	
 	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);
@@ -2914,6 +2960,7 @@
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 	
+	vgroup_operator_subset_select_props(ot);
 	RNA_def_float(ot->srna, "offset", 0.f, -1.0, 1.0, "Offset", "Value to add to weights", -1.0f, 1.f);
 	RNA_def_float(ot->srna, "gain", 1.f, 0.f, FLT_MAX, "Gain", "Value to multiply weights by", 0.0f, 10.f);
 }
@@ -2946,46 +2993,6 @@
 	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);




More information about the Bf-blender-cvs mailing list