fix [#24499] Consistency Issue with LassoSelect/ExtendOption
[blender.git] / source / blender / editors / armature / editarmature.c
index ead5d44d393cac5406a9f7dfa743dd39e79d2979..cab2fdc547fe8cc52c9c89469e7bcda94677983a 100644 (file)
@@ -509,28 +509,23 @@ static EditBone *editbone_name_exists (ListBase *edbo, const char *name)
 void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone)
 {
        EditBone *dupli;
-       char    tempname[64];
-       int             number;
-       char    *dot;
 
        dupli = editbone_name_exists(edbo, name);
        
        if (dupli && bone != dupli) {
-               /*      Strip off the suffix, if it's a number */
-               number= strlen(name);
-               if (number && isdigit(name[number-1])) {
-                       dot= strrchr(name, '.');        // last occurrence
-                       if (dot)
-                               *dot=0;
-               }
-               
-               for (number = 1; number <= 999; number++) {
-                       sprintf(tempname, "%s.%03d", name, number);
-                       if (!editbone_name_exists(edbo, tempname)) {
-                               BLI_strncpy(name, tempname, 32);
-                               return;
+               /* note: this block is used in other places, when changing logic apply to all others, search this message */
+               char    tempname[sizeof(bone->name)];
+               char    left[sizeof(bone->name)];
+               int             number;
+               int             len= BLI_split_name_num(left, &number, name);
+               do {    /* nested while loop looks bad but likely it wont run most times */
+                       while(BLI_snprintf(tempname, sizeof(tempname), "%s.%03d", left, number) >= sizeof(tempname)) {
+                               if(len > 0)     left[--len]= '\0';      /* word too long */
+                               else            number= 0;                      /* reset, must be a massive number */
                        }
-               }
+               } while(number++, ((dupli= editbone_name_exists(edbo, tempname)) && bone != dupli));
+
+               BLI_strncpy(name, tempname, sizeof(bone->name));
        }
 }
 
@@ -546,7 +541,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
                        /* apply current transform from parent (not yet destroyed), 
                         * then calculate new parent inverse matrix
                         */
-                       object_apply_mat4(ob, ob->obmat);
+                       object_apply_mat4(ob, ob->obmat, FALSE);
                        
                        what_does_parent(scene, ob, &workob);
                        invert_m4_m4(ob->parentinv, workob.obmat);
@@ -558,7 +553,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
 static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
-       Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
        bArmature *arm= get_armature(ob);
        bPose *pose;
        bPoseChannel *pchan;
@@ -655,10 +650,10 @@ void POSE_OT_armature_apply (wmOperatorType *ot)
 
 
 /* set the current pose as the restpose */
-static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
+static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op))
 {
        Scene *scene= CTX_data_scene(C);
-       Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
 
        /* don't check if editmode (should be done by caller) */
        if (ob->type!=OB_ARMATURE)
@@ -681,7 +676,7 @@ static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
                invert_m4_m4(imat, pchan->pose_mat);
                mul_m4_m4m4(delta_mat, mat, imat);
 
-               pchan_apply_mat4(pchan, delta_mat);
+               pchan_apply_mat4(pchan, delta_mat, TRUE);
 
                where_is_pose_bone(scene, ob, pchan, CFRA, 1);
        }
@@ -817,7 +812,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
 }
 
 /* join armature exec is exported for use in object->join objects operator... */
-int join_armature_exec(bContext *C, wmOperator *op)
+int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Main *bmain= CTX_data_main(C);
        Scene *scene= CTX_data_scene(C);
@@ -1075,7 +1070,7 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
  *     sel: remove selected bones from the armature, otherwise the unselected bones are removed
  *  (ob is not in editmode)
  */
-static void separate_armature_bones (Scene *scene, Object *ob, short sel) 
+static void separate_armature_bones(Object *ob, short sel) 
 {
        bArmature *arm= (bArmature *)ob->data;
        bPoseChannel *pchan, *pchann;
@@ -1127,7 +1122,7 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel)
 }
 
 /* separate selected bones into their armature */
-static int separate_armature_exec (bContext *C, wmOperator *op)
+static int separate_armature_exec (bContext *C, wmOperator *UNUSED(op))
 {
        Main *bmain= CTX_data_main(C);
        Scene *scene= CTX_data_scene(C);
@@ -1176,8 +1171,8 @@ static int separate_armature_exec (bContext *C, wmOperator *op)
        
        
        /* 3) remove bones that shouldn't still be around on both armatures */
-       separate_armature_bones(scene, oldob, 1);
-       separate_armature_bones(scene, newob, 0);
+       separate_armature_bones(oldob, 1);
+       separate_armature_bones(newob, 0);
        
        
        /* 4) fix links before depsgraph flushes */ // err... or after?
@@ -1364,8 +1359,9 @@ static EditBone *editbone_get_child(bArmature *arm, EditBone *pabone, short use_
        for (curbone= arm->edbo->first; curbone; curbone= curbone->next) {
                if (curbone->parent == pabone) {
                        if (use_visibility) {
-                               if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A))
+                               if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A)) {
                                        chbone = curbone;
+                               }
                        }
                        else
                                chbone = curbone;
@@ -1389,7 +1385,7 @@ static int pose_setflag_exec (bContext *C, wmOperator *op)
        CTX_DATA_END;
        
        /* note, notifier might evolve */
-       WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_active_object(C));
+       WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ED_object_pose_armature(CTX_data_active_object(C)));
        
        return OPERATOR_FINISHED;
 }
@@ -1787,7 +1783,7 @@ EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
 
 /* previously delete_armature */
 /* only editmode! */
-static int armature_delete_selected_exec(bContext *C, wmOperator *op)
+static int armature_delete_selected_exec(bContext *C, wmOperator *UNUSED(op))
 {
        bArmature *arm;
        EditBone        *curBone, *next;
@@ -1892,7 +1888,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
  * toggle==2: only active tag
  * toggle==3: swap (no test)
  */
-void ED_armature_deselectall(Object *obedit, int toggle)
+void ED_armature_deselect_all(Object *obedit, int toggle)
 {
        bArmature *arm= obedit->data;
        EditBone        *eBone;
@@ -1919,7 +1915,7 @@ void ED_armature_deselectall(Object *obedit, int toggle)
                for (eBone=arm->edbo->first;eBone;eBone=eBone->next) {
                        if (sel==3) {
                                /* invert selection of bone */
-                               if ((arm->layer & eBone->layer) && (eBone->flag & BONE_HIDDEN_A)==0) {
+                               if(EBONE_VISIBLE(arm, eBone)) {
                                        eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
                                        if(arm->act_edbone==eBone)
                                                arm->act_edbone= NULL;
@@ -1927,7 +1923,7 @@ void ED_armature_deselectall(Object *obedit, int toggle)
                        }
                        else if (sel==1) {
                                /* select bone */
-                               if(arm->layer & eBone->layer && (eBone->flag & BONE_HIDDEN_A)==0) {
+                               if(EBONE_VISIBLE(arm, eBone)) {
                                        eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
                                        if(eBone->parent)
                                                eBone->parent->flag |= (BONE_TIPSEL);
@@ -1945,6 +1941,20 @@ void ED_armature_deselectall(Object *obedit, int toggle)
        ED_armature_sync_selection(arm->edbo);
 }
 
+void ED_armature_deselect_all_visible(Object *obedit)
+{
+       bArmature *arm= obedit->data;
+       EditBone        *ebone;
+
+       for (ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+               /* first and foremost, bone must be visible and selected */
+               if (EBONE_VISIBLE(arm, ebone) && (ebone->flag & BONE_UNSELECTABLE)==0) {
+                       ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+               }
+       }
+
+       ED_armature_sync_selection(arm->edbo);
+}
 
 /* context: editmode armature in view3d */
 int mouse_armature(bContext *C, short mval[2], int extend)
@@ -1963,7 +1973,7 @@ int mouse_armature(bContext *C, short mval[2], int extend)
        if (nearBone) {
 
                if (!extend)
-                       ED_armature_deselectall(obedit, 0);
+                       ED_armature_deselect_all(obedit, 0);
                
                /* by definition the non-root connected bones have no root point drawn,
                   so a root selection needs to be delivered to the parent tip */
@@ -2087,7 +2097,7 @@ float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3])
 
 
 /* Set roll value for given bone -> Z-Axis Point up (original method) */
-static void auto_align_ebone_zaxisup(Scene *scene, View3D *v3d, EditBone *ebone)
+static void auto_align_ebone_zaxisup(Scene *UNUSED(scene), View3D *UNUSED(v3d), EditBone *ebone)
 {
        float   delta[3], curmat[3][3];
        float   xaxis[3]={1.0f, 0.0f, 0.0f}, yaxis[3], zaxis[3]={0.0f, 0.0f, 1.0f};
@@ -2360,7 +2370,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
        mul_m3_m3m3(totmat, obmat, viewmat);
        invert_m3_m3(imat, totmat);
        
-       ED_armature_deselectall(obedit, 0);
+       ED_armature_deselect_all(obedit, 0);
        
        /*      Create a bone   */
        bone= ED_armature_edit_bone_add(obedit->data, "Bone");
@@ -2377,7 +2387,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
 
 /* previously addvert_armature */
 /* the ctrl-click method */
-static int armature_click_extrude_exec(bContext *C, wmOperator *op)
+static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op))
 {
        View3D *v3d;
        bArmature *arm;
@@ -2413,7 +2423,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
                to_root= 1;
        }
        
-       ED_armature_deselectall(obedit, 0);
+       ED_armature_deselect_all(obedit, 0);
        
        /* we re-use code for mirror editing... */
        flipbone= NULL;
@@ -2691,7 +2701,7 @@ EditBone *duplicateEditBone(EditBone *curBone, char *name, ListBase *editbones,
 }
 
 /* previously adduplicate_armature */
-static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
+static int armature_duplicate_selected_exec(bContext *C, wmOperator *UNUSED(op))
 {
        bArmature *arm;
        EditBone        *eBone = NULL;
@@ -3262,7 +3272,7 @@ void ARMATURE_OT_merge (wmOperatorType *ot)
 /* ************** END Add/Remove stuff in editmode ************ */
 /* *************** Tools in editmode *********** */
 
-static int armature_hide_exec(bContext *C, wmOperator *op)
+static int armature_hide_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Object *obedit= CTX_data_edit_object(C);
        bArmature *arm= obedit->data;
@@ -3302,7 +3312,7 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int armature_reveal_exec(bContext *C, wmOperator *op)
+static int armature_reveal_exec(bContext *C, wmOperator *UNUSED(op))
 {
        Object *obedit= CTX_data_edit_object(C);
        bArmature *arm= obedit->data;
@@ -3580,7 +3590,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
        mul_m3_m3m3(totmat, obmat, viewmat);
        invert_m3_m3(imat, totmat);
        
-       ED_armature_deselectall(obedit, 0);
+       ED_armature_deselect_all(obedit, 0);
        
        /*      Create a bone   */
        bone= ED_armature_edit_bone_add(obedit->data, name);
@@ -3632,10 +3642,7 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
        int numcuts, i;
        
        /* there may not be a number_cuts property defined (for 'simple' subdivide) */
-       if (RNA_property_is_set(op->ptr, "number_cuts"))
-               numcuts= RNA_int_get(op->ptr, "number_cuts");
-       else
-               numcuts= 1;
+       numcuts= RNA_int_get(op->ptr, "number_cuts");
        
        /* loop over all editable bones */
        // XXX the old code did this in reverse order though!
@@ -3690,26 +3697,11 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
        return OPERATOR_FINISHED;
 }
 
-
-void ARMATURE_OT_subdivide_simple(wmOperatorType *ot)
-{
-       /* identifiers */
-       ot->name= "Subdivide Simple";
-       ot->idname= "ARMATURE_OT_subdivide_simple";
-       
-       /* api callbacks */
-       ot->exec = armature_subdivide_exec;
-       ot->poll = ED_operator_editarmature;
-       
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
+void ARMATURE_OT_subdivide(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Subdivide Multi";
-       ot->idname= "ARMATURE_OT_subdivide_multi";
+       ot->idname= "ARMATURE_OT_subdivide";
        
        /* api callbacks */
        ot->exec = armature_subdivide_exec;
@@ -3719,65 +3711,7 @@ void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
        
        /* Properties */
-       RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10);
-}
-
-
-
-static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-       uiPopupMenu *pup;
-       uiLayout *layout;
-
-       pup= uiPupMenuBegin(C, "Subdivision Type", 0);
-       layout= uiPupMenuLayout(pup);
-       uiItemsEnumO(layout, "ARMATURE_OT_subdivs", "type");
-       uiPupMenuEnd(C, pup);
-       
-       return OPERATOR_CANCELLED;
-}
-
-static int armature_subdivs_exec(bContext *C, wmOperator *op)
-{      
-       switch (RNA_int_get(op->ptr, "type"))
-       {
-               case 0: /* simple */
-                       RNA_int_set(op->ptr, "number_cuts", 1);
-                       armature_subdivide_exec(C, op);
-                       break;
-               case 1: /* multi */
-                       armature_subdivide_exec(C, op);
-                       break;
-       }
-       
-       return OPERATOR_FINISHED;
-}
-
-void ARMATURE_OT_subdivs(wmOperatorType *ot)
-{
-       static EnumPropertyItem type_items[]= {
-                {0, "SIMPLE", 0, "Simple", ""},
-               {1, "MULTI", 0, "Multi", ""},
-               {0, NULL, 0, NULL, NULL}};
-
-       /* identifiers */
-       ot->name= "subdivs";
-       ot->idname= "ARMATURE_OT_subdivs";
-       
-       /* api callbacks */
-       ot->invoke= armature_subdivs_invoke;
-       ot->exec= armature_subdivs_exec;
-       
-       ot->poll= ED_operator_editarmature;
-       
-       /* flags */
-       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-       
-       /* props */
-       RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
-       
-       /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/
-       RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10); 
+       RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of Cuts", "", 1, 10);
 }
 
 /* ----------- */
@@ -3788,7 +3722,7 @@ void ARMATURE_OT_subdivs(wmOperatorType *ot)
  * this to be done easily.
  */
 
-static int armature_switch_direction_exec(bContext *C, wmOperator *op
+static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op)
 {
        Object *ob= CTX_data_edit_object(C);
        bArmature *arm= (bArmature *)ob->data;
@@ -4009,7 +3943,7 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
        return OPERATOR_FINISHED;
 }
 
-static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
 {
        EditBone *actbone = CTX_data_active_bone(C);
        uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", 0);
@@ -4106,7 +4040,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
 
 /* ****************  Selections  ******************/
 
-static int armature_select_inverse_exec(bContext *C, wmOperator *op)
+static int armature_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
 {
        /*      Set the flags */
        CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
@@ -4522,7 +4456,7 @@ void ED_pose_deselectall (Object *ob, int test)
        /*      Determine if we're selecting or deselecting     */
        if (test==1) {
                for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
-                       if ((pchan->bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+                       if (PBONE_VISIBLE(arm, pchan->bone)) {
                                if (pchan->bone->flag & BONE_SELECTED)
                                        break;
                        }
@@ -4552,7 +4486,7 @@ void ED_pose_deselectall (Object *ob, int test)
                arm->act_bone= NULL;
 }
 
-static int bone_skinnable(Object *ob, Bone *bone, void *datap)
+static int bone_skinnable_cb(Object *ob, Bone *bone, void *datap)
 {
        /* Bones that are deforming
         * are regarded to be "skinnable" and are eligible for
@@ -4601,7 +4535,7 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap)
        return 0;
 }
 
-static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data
+static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)
 {
        /* This group creates a vertex group to ob that has the
          * same name as bone (provided the bone is skinnable). 
@@ -4616,7 +4550,7 @@ static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
        return 0;
 }
 
-static int dgroup_skinnable(Object *ob, Bone *bone, void *datap) 
+static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap) 
 {
        /* Bones that are deforming
         * are regarded to be "skinnable" and are eligible for
@@ -4672,7 +4606,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
        return 0;
 }
 
-static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void add_vgroups__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
        /* DerivedMesh mapFunc for getting final coords in weight paint mode */
 
@@ -4723,7 +4657,7 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
        }
 }
 
-void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int mirror)
+void add_verts_to_dgroups(ReportList *reports, Scene *scene, Object *ob, Object *par, int heat, int mirror)
 {
        /* This functions implements the automatic computation of vertex group
         * weights, either through envelopes or using a heat equilibrium.
@@ -4755,7 +4689,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
        looper_data.list= NULL;
 
        /* count the number of skinnable bones */
-       numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+       numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
        
        if (numbones == 0)
                return;
@@ -4764,7 +4698,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
         * and fill it with all of the skinnable bones */
        bonelist = MEM_callocN(numbones*sizeof(Bone *), "bonelist");
        looper_data.list= bonelist;
-       bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+       bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
 
        /* create an array of pointers to the deform groups that
         * coorespond to the skinnable bones (creating them
@@ -4773,7 +4707,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
        dgroupflip = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgroupflip");
 
        looper_data.list= dgrouplist;
-       bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable);
+       bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable_cb);
 
        /* create an array of root and tip positions transformed into
         * global coords */
@@ -4870,14 +4804,22 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
 
        /* compute the weights based on gathered vertices and bones */
        if (heat) {
+               const char *error= NULL;
                heat_bone_weighting(ob, mesh, verts, numbones, dgrouplist, dgroupflip,
-                       root, tip, selected);
+                       root, tip, selected, &error);
+               
+               if(error) {
+                       BKE_report(reports, RPT_WARNING, error);
+               }
        }
        else {
                envelope_bone_weighting(ob, mesh, verts, numbones, bonelist, dgrouplist,
                        dgroupflip, root, tip, selected, mat4_to_scale(par->obmat));
        }
-       
+
+       /* only generated in some cases but can call anyway */
+       mesh_octree_table(ob, NULL, NULL, 'e');
+
        /* free the memory allocated */
        MEM_freeN(bonelist);
        MEM_freeN(dgrouplist);
@@ -4888,7 +4830,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
        MEM_freeN(verts);
 }
 
-void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mode, int mirror)
+void create_vgroups_from_armature(ReportList *reports, Scene *scene, Object *ob, Object *par, int mode, int mirror)
 {
        /* Lets try to create some vertex groups 
         * based on the bones of the parent armature.
@@ -4899,7 +4841,7 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
                /* Traverse the bone list, trying to create empty vertex 
                 * groups cooresponding to the bone.
                 */
-               bone_looper(ob, arm->bonebase.first, NULL, ED_vgroup_add_unique_bone);
+               bone_looper(ob, arm->bonebase.first, NULL, vgroup_add_unique_bone_cb);
 
                if (ob->type == OB_MESH)
                        ED_vgroup_data_create(ob->data);
@@ -4909,15 +4851,15 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
                 * that are populated with the vertices for which the
                 * bone is closest.
                 */
-               add_verts_to_dgroups(scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
+               add_verts_to_dgroups(reports, scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
        }
 } 
 /* ************* Clear Pose *****************************/
 
-static int pose_clear_scale_exec(bContext *C, wmOperator *op
+static int pose_clear_scale_exec(bContext *C, wmOperator *UNUSED(op)
 {
        Scene *scene= CTX_data_scene(C);
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        short autokey = 0;
        
        /* only clear those channels that are not locked */
@@ -4956,7 +4898,7 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
                
                /* now recalculate paths */
                if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
-                       ED_pose_recalculate_paths(C, scene, ob);
+                       ED_pose_recalculate_paths(scene, ob);
        }
        
        DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -4982,10 +4924,10 @@ void POSE_OT_scale_clear(wmOperatorType *ot)
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int pose_clear_loc_exec(bContext *C, wmOperator *op
+static int pose_clear_loc_exec(bContext *C, wmOperator *UNUSED(op)
 {
        Scene *scene= CTX_data_scene(C);
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        short autokey = 0;
        
        /* only clear those channels that are not locked */
@@ -5025,7 +4967,7 @@ static int pose_clear_loc_exec(bContext *C, wmOperator *op)
                
                /* now recalculate paths */
                if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
-                       ED_pose_recalculate_paths(C, scene, ob);
+                       ED_pose_recalculate_paths(scene, ob);
        }
        
        DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -5051,10 +4993,10 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
-static int pose_clear_rot_exec(bContext *C, wmOperator *op
+static int pose_clear_rot_exec(bContext *C, wmOperator *UNUSED(op)
 {
        Scene *scene= CTX_data_scene(C);
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        short autokey = 0;
        
        /* only clear those channels that are not locked */
@@ -5178,7 +5120,7 @@ static int pose_clear_rot_exec(bContext *C, wmOperator *op)
                
                /* now recalculate paths */
                if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
-                       ED_pose_recalculate_paths(C, scene, ob);
+                       ED_pose_recalculate_paths(scene, ob);
        }
        
        DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
@@ -5207,7 +5149,7 @@ void POSE_OT_rot_clear(wmOperatorType *ot)
 
 /* ***************** selections ********************** */
 
-static int pose_select_inverse_exec(bContext *C, wmOperator *op)
+static int pose_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
 {
        
        /*      Set the flags */
@@ -5304,9 +5246,9 @@ void POSE_OT_select_all(wmOperatorType *ot)
        WM_operator_properties_select_all(ot);
 }
 
-static int pose_select_parent_exec(bContext *C, wmOperator *op)
+static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        bPoseChannel *pchan,*parent;
 
        /*      Determine if there is an active bone */
@@ -5348,7 +5290,7 @@ void POSE_OT_select_parent(wmOperatorType *ot)
 
 /* ************* hide/unhide pose bones ******************* */
 
-static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr
+static int hide_selected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)
 {
        bArmature *arm= ob->data;
        
@@ -5363,7 +5305,7 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
        return 0;
 }
 
-static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr
+static int hide_unselected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)
 {
        bArmature *arm= ob->data;
        
@@ -5381,15 +5323,13 @@ static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
 /* active object is armature in posemode, poll checked */
 static int pose_hide_exec(bContext *C, wmOperator *op) 
 {
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        bArmature *arm= ob->data;
 
        if(RNA_boolean_get(op->ptr, "unselected"))
-          bone_looper(ob, arm->bonebase.first, NULL, 
-                               hide_unselected_pose_bone);
+          bone_looper(ob, arm->bonebase.first, NULL, hide_unselected_pose_bone_cb);
        else
-          bone_looper(ob, arm->bonebase.first, NULL, 
-                                  hide_selected_pose_bone);
+          bone_looper(ob, arm->bonebase.first, NULL, hide_selected_pose_bone_cb);
        
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5414,7 +5354,7 @@ void POSE_OT_hide(wmOperatorType *ot)
        RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "");
 }
 
-static int show_pose_bone(Object *ob, Bone *bone, void *ptr
+static int show_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr)
 {
        bArmature *arm= ob->data;
        
@@ -5429,12 +5369,12 @@ static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
 }
 
 /* active object is armature in posemode, poll checked */
-static int pose_reveal_exec(bContext *C, wmOperator *op
+static int pose_reveal_exec(bContext *C, wmOperator *UNUSED(op)
 {
-       Object *ob= CTX_data_active_object(C);
+       Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
        bArmature *arm= ob->data;
        
-       bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone);
+       bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone_cb);
        
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5459,29 +5399,22 @@ void POSE_OT_reveal(wmOperatorType *ot)
 /* ************* RENAMING DISASTERS ************ */
 
 /* note: there's a unique_editbone_name() too! */
-void unique_bone_name (bArmature *arm, char *name)
-{
-       char            tempname[64];
-       int                     number;
-       char            *dot;
-       
+static void unique_bone_name (bArmature *arm, char *name)
+{      
        if (get_named_bone(arm, name)) {
-               
-               /*      Strip off the suffix, if it's a number */
-               number= strlen(name);
-               if(number && isdigit(name[number-1])) {
-                       dot= strrchr(name, '.');        // last occurrence
-                       if (dot)
-                               *dot=0;
-               }
-               
-               for (number = 1; number <=999; number++) {
-                       sprintf (tempname, "%s.%03d", name, number);
-                       if (!get_named_bone(arm, tempname)) {
-                               BLI_strncpy (name, tempname, 32);
-                               return;
+               /* note: this block is used in other places, when changing logic apply to all others, search this message */
+               char    tempname[sizeof(((Bone *)NULL)->name)];
+               char    left[sizeof(((Bone *)NULL)->name)];
+               int             number;
+               int             len= BLI_split_name_num(left, &number, name);
+               do {    /* nested while loop looks bad but likely it wont run most times */
+                       while(BLI_snprintf(tempname, sizeof(tempname), "%s.%03d", left, number) >= sizeof(tempname)) {
+                               if(len > 0)     left[--len]= '\0';      /* word too long */
+                               else            number= 0;                      /* reset, must be a massive number */
                        }
-               }
+               } while(number++, get_named_bone(arm, tempname));
+
+               BLI_strncpy(name, tempname, sizeof(tempname));
        }
 }
 
@@ -5626,7 +5559,7 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
 }
 
 
-static int armature_flip_names_exec (bContext *C, wmOperator *op)
+static int armature_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
 {
        Object *ob= CTX_data_edit_object(C);
        bArmature *arm;