Revision: 57005
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57005
Author:   gaiaclary
Date:     2013-05-24 13:50:26 +0000 (Fri, 24 May 2013)
Log Message:
-----------
weight tools: added more selection types to limit total 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 
13:13:05 UTC (rev 57004)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2013-05-24 
13:50:26 UTC (rev 57005)
@@ -434,6 +434,12 @@
        WT_VGROUP_ALL = 4,
 } WT_VertexGroupSelect;
 
+#define WT_VGROUP_MASK_ALL \
+       ((1 << WT_VGROUP_ACTIVE) | \
+        (1 << WT_VGROUP_BONE_SELECT) | \
+        (1 << WT_VGROUP_BONE_DEFORM) | \
+        (1 << WT_VGROUP_ALL))
+
 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"},
@@ -466,16 +472,17 @@
        {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"},
+        "BONE_SELECT", 0, "Selected Pose Bones", "All Vertex Groups assigned 
to Selection"},
        {WT_VGROUP_BONE_DEFORM,
-        "BONE_DEFORM", 0, "Pose Bone (Deform)", "All Vertex Groups assigned to 
Deform Bones"},
+        "BONE_DEFORM", 0, "Deform Pose Bones", "All Vertex Groups assigned to 
Deform Bones"},
        {WT_VGROUP_ALL,
         "ALL", 0, "All Groups", "All Vertex Groups"},
        {0, NULL, 0, NULL, NULL}
 };
 
-static EnumPropertyItem *rna_vertex_group_selection_itemf(bContext *C, 
PointerRNA *UNUSED(ptr),
-                                                PropertyRNA *UNUSED(prop), int 
*free)
+static EnumPropertyItem *rna_vertex_group_selection_itemf_helper(
+        bContext *C, PointerRNA *UNUSED(ptr),
+        PropertyRNA *UNUSED(prop), int *free, const unsigned int 
selection_mask)
 {
        Object *ob;
        EnumPropertyItem *item = NULL;
@@ -486,14 +493,18 @@
                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 (selection_mask & (1 << WT_VGROUP_ACTIVE))
+               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);
+               if (selection_mask & (1 << WT_VGROUP_BONE_SELECT))
+                       RNA_enum_items_add_value(&item, &totitem, 
WT_vertex_group_select_item, WT_VGROUP_BONE_SELECT);
+               if (selection_mask & (1 << WT_VGROUP_BONE_DEFORM))
+                       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);
+       if (selection_mask & (1 << WT_VGROUP_ALL))
+               RNA_enum_items_add_value(&item, &totitem, 
WT_vertex_group_select_item, WT_VGROUP_ALL);
 
        RNA_enum_item_end(&item, &totitem);
        *free = true;
@@ -501,15 +512,33 @@
        return item;
 }
 
-static void vgroup_operator_subset_select_props(wmOperatorType *ot)
+static EnumPropertyItem *rna_vertex_group_with_single_itemf(bContext *C, 
PointerRNA *ptr,
+                                                            PropertyRNA *prop, 
int *free)
 {
+       return rna_vertex_group_selection_itemf_helper(C, ptr, prop, free, 
WT_VGROUP_MASK_ALL);
+}
+
+static EnumPropertyItem *rna_vertex_group_select_itemf(bContext *C, PointerRNA 
*ptr,
+                                                       PropertyRNA *prop, int 
*free)
+{
+       return rna_vertex_group_selection_itemf_helper(C, ptr, prop, free, 
WT_VGROUP_MASK_ALL & ~(1 << WT_VGROUP_ACTIVE));
+}
+
+static void vgroup_operator_subset_select_props(wmOperatorType *ot, bool 
use_active)
+{
        PropertyRNA *prop;
 
        prop = RNA_def_enum(ot->srna,
                            "group_select_mode", DummyRNA_NULL_items,
-                           WT_VGROUP_ACTIVE, "Subset",
+                           use_active ? WT_VGROUP_ACTIVE : WT_VGROUP_ALL, 
"Subset",
                            "Define which subset of Groups shall be used");
-       RNA_def_enum_funcs(prop, rna_vertex_group_selection_itemf);
+
+       if (use_active) {
+               RNA_def_enum_funcs(prop, rna_vertex_group_with_single_itemf);
+       }
+       else {
+               RNA_def_enum_funcs(prop, rna_vertex_group_select_itemf);
+       }
        ot->prop = prop;
 }
 
@@ -1906,9 +1935,11 @@
 /* Used for limiting the number of influencing bones per vertex when exporting
  * skinned meshes.  if all_deform_weights is True, limit all deform modifiers
  * to max_weights regardless of type, otherwise, only limit the number of 
influencing bones per vertex*/
-static bool vertex_group_limit_total(Object *ob,
-                                     const int max_weights,
-                                     const bool all_deform_weights)
+static bool vgroup_limit_total_subset(Object *ob,
+                                      const bool *vgroup_validmap,
+                                      const int vgroup_tot,
+                                      const int subset_count,
+                                      const int max_weights)
 {
        MDeformVert *dv, **dvert_array = NULL;
        int i, dvert_tot = 0;
@@ -1918,84 +1949,63 @@
        ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot, use_vert_sel);
 
        if (dvert_array) {
-               int defbase_tot = BLI_countlist(&ob->defbase);
-               const bool *vgroup_validmap = (all_deform_weights == false) ?
-                           BKE_objdef_validmap_get(ob, defbase_tot) :
-                           NULL;
                int num_to_drop = 0;
 
-               /* only the active group */
                for (i = 0; i < dvert_tot; i++) {
 
+                       MDeformWeight *dw_temp;
+                       int bone_count = 0, non_bone_count = 0;
+                       int j;
+
                        /* in case its not selected */
                        if (!(dv = dvert_array[i])) {
                                continue;
                        }
 
-                       if (all_deform_weights) {
-                               /* keep only the largest weights, discarding 
the rest
-                                * qsort will put array in descending order 
because of  invCompare function */
-                               num_to_drop = dv->totweight - max_weights;
-                               if (num_to_drop > 0) {
-                                       qsort(dv->dw, dv->totweight, 
sizeof(MDeformWeight), inv_cmp_mdef_vert_weights);
-                                       dv->dw = MEM_reallocN(dv->dw, 
sizeof(MDeformWeight) * max_weights);
-                                       dv->totweight = max_weights;
-                                       is_change = true;
-                               }
-                       }
-                       else {
-                               MDeformWeight *dw_temp;
-                               int bone_count = 0, non_bone_count = 0;
-                               int j;
-                               /* only consider vgroups with bone modifiers 
attached (in vgroup_validmap) */
+                       num_to_drop = subset_count - max_weights;
 
-                               num_to_drop = dv->totweight - max_weights;
-
-                               /* first check if we even need to test further 
*/
-                               if (num_to_drop > 0) {
-                                       /* re-pack dw array so that non-bone 
weights are first, bone-weighted verts at end
-                                        * sort the tail, then copy only the 
truncated array back to dv->dw */
-                                       dw_temp = 
MEM_mallocN(sizeof(MDeformWeight) * (dv->totweight), __func__);
-                                       bone_count = 0; non_bone_count = 0;
-                                       for (j = 0; j < dv->totweight; j++) {
-                                               BLI_assert(dv->dw[j].def_nr < 
defbase_tot);
-                                               if 
(!vgroup_validmap[(dv->dw[j]).def_nr]) {
-                                                       dw_temp[non_bone_count] 
= dv->dw[j];
-                                                       non_bone_count += 1;
-                                               }
-                                               else {
-                                                       dw_temp[dv->totweight - 
1 - bone_count] = dv->dw[j];
-                                                       bone_count += 1;
-                                               }
+                       /* first check if we even need to test further */
+                       if (num_to_drop > 0) {
+                               /* re-pack dw array so that non-bone weights 
are first, bone-weighted verts at end
+                                * sort the tail, then copy only the truncated 
array back to dv->dw */
+                               dw_temp = MEM_mallocN(sizeof(MDeformWeight) * 
dv->totweight, __func__);
+                               bone_count = 0; non_bone_count = 0;
+                               for (j = 0; j < dv->totweight; j++) {
+                                       BLI_assert(dv->dw[j].def_nr < 
vgroup_tot);
+                                       if (!vgroup_validmap[dv->dw[j].def_nr]) 
{
+                                               dw_temp[non_bone_count] = 
dv->dw[j];
+                                               non_bone_count += 1;
                                        }
-                                       BLI_assert(bone_count + non_bone_count 
== dv->totweight);
-                                       num_to_drop = bone_count - max_weights;
-                                       if (num_to_drop > 0) {
-                                               qsort(&dw_temp[non_bone_count], 
bone_count, sizeof(MDeformWeight), inv_cmp_mdef_vert_weights);
-                                               dv->totweight -= num_to_drop;
-                                               /* Do we want to 
clean/normalize here? */
-                                               MEM_freeN(dv->dw);
-                                               dv->dw = MEM_reallocN(dw_temp, 
sizeof(MDeformWeight) * dv->totweight);
-                                               is_change = true;
-                                       }
                                        else {
-                                               MEM_freeN(dw_temp);
+                                               dw_temp[dv->totweight - 1 - 
bone_count] = dv->dw[j];
+                                               bone_count += 1;
                                        }
                                }
+                               BLI_assert(bone_count + non_bone_count == 
dv->totweight);
+                               num_to_drop = bone_count - max_weights;
+                               if (num_to_drop > 0) {
+                                       qsort(&dw_temp[non_bone_count], 
bone_count, sizeof(MDeformWeight), inv_cmp_mdef_vert_weights);
+                                       dv->totweight -= num_to_drop;
+                                       /* Do we want to clean/normalize here? 
*/
+                                       MEM_freeN(dv->dw);
+                                       dv->dw = MEM_reallocN(dw_temp, 
sizeof(MDeformWeight) * dv->totweight);
+                                       is_change = true;
+                               }
+                               else {
+                                       MEM_freeN(dw_temp);
+                               }
                        }
+
                }
                MEM_freeN(dvert_array);
 
-               if (vgroup_validmap) {
-                       MEM_freeN((void *)vgroup_validmap);
-               }
        }
 
        return is_change;
 }
 
 
-static void vgroup_clean_subset(Object *ob, bool *vgroup_validmap, const int 
vgroup_tot, const int UNUSED(subset_count),
+static void vgroup_clean_subset(Object *ob, const bool *vgroup_validmap, const 
int vgroup_tot, const int UNUSED(subset_count),
                                 const float epsilon, const bool keep_single)
 {
        MDeformVert **dvert_array = NULL;
@@ -2961,7 +2971,7 @@
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
        
-       vgroup_operator_subset_select_props(ot);
+       vgroup_operator_subset_select_props(ot, true);
        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);
 }
@@ -3143,7 +3153,7 @@
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       vgroup_operator_subset_select_props(ot);
+       vgroup_operator_subset_select_props(ot, true);
        RNA_def_boolean(ot->srna, "auto_assign", true, "Add Weights",
                        "Add verts from groups that have zero weight before 
inverting");
        RNA_def_boolean(ot->srna, "auto_remove", true, "Remove Weights",
@@ -3251,7 +3261,7 @@
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
-       vgroup_operator_subset_select_props(ot);
+       vgroup_operator_subset_select_props(ot, true);
        RNA_def_float(ot->srna, "limit", 0.0f, 0.0f, 1.0, "Limit", "Remove 
weights under this limit", 0.0f, 0.99f);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to