converted more mixed tab/space indentations to tabs. only whitespace changes.
[blender.git] / source / blender / editors / armature / editarmature.c
index c0ca31b..23f91f8 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/editors/armature/editarmature.c
+ *  \ingroup edarmature
+ */
+
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <stddef.h>
@@ -82,6 +87,7 @@
 #include "ED_view3d.h"
 
 #include "UI_interface.h"
+#include "UI_resources.h"
 
 #include "armature_intern.h"
 #include "meshlaplacian.h"
@@ -246,11 +252,6 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
        EditBone        *eBoneAct= NULL;
        EditBone        *eBoneTest= NULL;
        Bone            *curBone;
-       float delta[3];
-       float premat[3][3];
-       float postmat[3][3];
-       float imat[3][3];
-       float difmat[3][3];
                
        for (curBone=bones->first; curBone; curBone=curBone->next) {
                eBone= MEM_callocN(sizeof(EditBone), "make_editbone");
@@ -291,20 +292,8 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
                }
 
                copy_v3_v3(eBone->head, curBone->arm_head);
-               copy_v3_v3(eBone->tail, curBone->arm_tail);             
-               
-               eBone->roll= 0.0f;
-               
-               /* roll fixing */
-               sub_v3_v3v3(delta, eBone->tail, eBone->head);
-               vec_roll_to_mat3(delta, 0.0f, postmat);
-               
-               copy_m3_m4(premat, curBone->arm_mat);
-               
-               invert_m3_m3(imat, postmat);
-               mul_m3_m3m3(difmat, imat, premat);
-               
-               eBone->roll = (float)atan2(difmat[2][0], difmat[2][2]);
+               copy_v3_v3(eBone->tail, curBone->arm_tail);
+               eBone->roll = curBone->arm_roll;
                
                /* rest of stuff copy */
                eBone->length= curBone->length;
@@ -420,12 +409,16 @@ void ED_armature_from_edit(Object *obedit)
                eBone->temp= newBone;   /* Associate the real Bones with the EditBones */
                
                BLI_strncpy(newBone->name, eBone->name, sizeof(newBone->name));
-               memcpy(newBone->head, eBone->head, sizeof(newBone->head));
-               memcpy(newBone->tail, eBone->tail, sizeof(newBone->tail));
+               copy_v3_v3(newBone->arm_head, eBone->head);
+               copy_v3_v3(newBone->arm_tail, eBone->tail);
+               newBone->arm_roll = eBone->roll;
+               
                newBone->flag= eBone->flag;
                
                if (eBone == arm->act_edbone) {
-                       newBone->flag |= BONE_SELECTED; /* important, editbones can be active with only 1 point selected */
+                       /* don't change active selection, this messes up separate which uses
+                        * editmode toggle and can separate active bone which is de-selected originally */
+                       /* newBone->flag |= BONE_SELECTED; */ /* important, editbones can be active with only 1 point selected */
                        arm->act_edbone= NULL;
                        arm->act_bone= newBone;
                }
@@ -456,7 +449,6 @@ void ED_armature_from_edit(Object *obedit)
                        BLI_addtail(&newBone->parent->childbase, newBone);
                        
                        {
-                               float M_boneRest[3][3];
                                float M_parentRest[3][3];
                                float iM_parentRest[3][3];
                                float   delta[3];
@@ -465,10 +457,6 @@ void ED_armature_from_edit(Object *obedit)
                                sub_v3_v3v3(delta, eBone->parent->tail, eBone->parent->head);
                                vec_roll_to_mat3(delta, eBone->parent->roll, M_parentRest);
                                
-                               /* Get this bone's  matrix (rotation only) */
-                               sub_v3_v3v3(delta, eBone->tail, eBone->head);
-                               vec_roll_to_mat3(delta, eBone->roll, M_boneRest);
-                               
                                /* Invert the parent matrix */
                                invert_m3_m3(iM_parentRest, M_parentRest);
                                
@@ -481,8 +469,11 @@ void ED_armature_from_edit(Object *obedit)
                        }
                }
                /*      ...otherwise add this bone to the armature's bonebase */
-               else
+               else {
+                       copy_v3_v3(newBone->head, eBone->head);
+                       copy_v3_v3(newBone->tail, eBone->tail);
                        BLI_addtail(&arm->bonebase, newBone);
+               }
        }
        
        /* Make a pass through the new armature to fix rolling */
@@ -515,6 +506,10 @@ void ED_armature_apply_transform(Object *ob, float mat[4][4])
                ebone->rad_head *= scale;
                ebone->rad_tail *= scale;
                ebone->dist             *= scale;
+
+               /* we could be smarter and scale by the matrix along the x & z axis */
+               ebone->xwidth   *= scale;
+               ebone->zwidth   *= scale;
        }
        
        /* Turn the list into an armature */
@@ -649,6 +644,8 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
        
        /* helpful warnings... */
        // TODO: add warnings to be careful about actions, applying deforms first, etc.
+       if (ob->adt && ob->adt->action) 
+               BKE_report(op->reports, RPT_WARNING, "Actions on this armature will be destroyed by this new rest pose as the transforms stored are relative to the old rest pose");
        
        /* Get editbones of active armature to alter */
        ED_armature_to_edit(ob);        
@@ -688,10 +685,11 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
                }
                
                /* clear transform values for pchan */
-               pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0.0f;
-               pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
-               pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0.0f;
-               pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
+               zero_v3(pchan->loc);
+               zero_v3(pchan->eul);
+               unit_qt(pchan->quat);
+               unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+               pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
                
                /* set anim lock */
                curbone->flag |= BONE_UNKEYED;
@@ -732,7 +730,6 @@ void POSE_OT_armature_apply (wmOperatorType *ot)
 /* set the current pose as the restpose */
 static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op))
 {
-       Scene *scene= CTX_data_scene(C);
        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) */
@@ -745,24 +742,18 @@ static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op)
         * at once are to be predictable*/
        CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
        {
-               float delta_mat[4][4], imat[4][4], mat[4][4];
-
-               where_is_pose_bone(scene, ob, pchan, CFRA, 1);
-
-               copy_m4_m4(mat, pchan->pose_mat);
-
-               /* calculate pchan->pose_mat without loc/size/rot & constraints applied */
-               where_is_pose_bone(scene, ob, pchan, CFRA, 0);
-               invert_m4_m4(imat, pchan->pose_mat);
-               mul_m4_m4m4(delta_mat, mat, imat);
-
+               float delta_mat[4][4];
+               
+               /* chan_mat already contains the delta transform from rest pose to pose-mode pose
+                * as that is baked into there so that B-Bones will work. Once we've set this as the
+                * new raw-transform components, don't recalc the poses yet, otherwise IK result will 
+                * change, thus changing the result we may be trying to record.
+                */
+               copy_m4_m4(delta_mat, pchan->chan_mat);
                pchan_apply_mat4(pchan, delta_mat, TRUE);
-
-               where_is_pose_bone(scene, ob, pchan, CFRA, 1);
        }
        CTX_DATA_END;
-
-       // ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
+       
        DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 
        /* note, notifier might evolve */
@@ -1008,7 +999,7 @@ int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
 static void separated_armature_fix_links(Object *origArm, Object *newArm)
 {
        Object *ob;
-       bPoseChannel *pchan, *pcha, *pchb;
+       bPoseChannel *pchan;
        bConstraint *con;
        ListBase *opchans, *npchans;
        
@@ -1035,38 +1026,23 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
                                                         *      - the target isn't origArm/newArm itself
                                                         *      - the target is one that can be found in newArm/origArm
                                                         */
-                                                       if ((ct->tar == origArm) && (ct->subtarget[0] != 0)) {
-                                                               for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) {
-                                                                       /* check if either one matches */
-                                                                       if ( (strcmp(pcha->name, ct->subtarget)==0) ||
-                                                                                (strcmp(pchb->name, ct->subtarget)==0) )
-                                                                       {
+                                                       if (ct->subtarget[0] != 0) {
+                                                               if (ct->tar == origArm) {
+                                                                       if(BLI_findstring(npchans, ct->subtarget, offsetof(bPoseChannel, name))) {
                                                                                ct->tar= newArm;
-                                                                               break;
                                                                        }
-                                                                       
-                                                                       /* check if both ends have met (to stop checking) */
-                                                                       if (pcha == pchb) break;
-                                                               }                                                               
-                                                       }
-                                                       else if ((ct->tar == newArm) && (ct->subtarget[0] != 0)) {
-                                                               for (pcha=opchans->first, pchb=opchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) {
-                                                                       /* check if either one matches */
-                                                                       if ( (strcmp(pcha->name, ct->subtarget)==0) ||
-                                                                                (strcmp(pchb->name, ct->subtarget)==0) )
-                                                                       {
+                                                               }
+                                                               else if (ct->tar == newArm) {
+                                                                       if(BLI_findstring(opchans, ct->subtarget, offsetof(bPoseChannel, name))) {
                                                                                ct->tar= origArm;
-                                                                               break;
                                                                        }
-                                                                       
-                                                                       /* check if both ends have met (to stop checking) */
-                                                                       if (pcha == pchb) break;
-                                                               }                                                               
+                                                               }
                                                        }
                                                }
-                                               
-                                               if (cti->flush_constraint_targets)
+
+                                               if (cti->flush_constraint_targets) {
                                                        cti->flush_constraint_targets(con, &targets, 0);
+                                               }
                                        }
                                }
                        }
@@ -1088,58 +1064,33 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
                                                 *      - the target isn't origArm/newArm itself
                                                 *      - the target is one that can be found in newArm/origArm
                                                 */
-                                               if ((ct->tar == origArm) && (ct->subtarget[0] != 0)) {
-                                                       for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) {
-                                                               /* check if either one matches */
-                                                               if ( (strcmp(pcha->name, ct->subtarget)==0) ||
-                                                                        (strcmp(pchb->name, ct->subtarget)==0) )
-                                                               {
+                                               if(ct->subtarget[0] != '\0')  {
+                                                       if (ct->tar == origArm) {
+                                                               if(BLI_findstring(npchans, ct->subtarget, offsetof(bPoseChannel, name))) {
                                                                        ct->tar= newArm;
-                                                                       break;
                                                                }
-                                                               
-                                                               /* check if both ends have met (to stop checking) */
-                                                               if (pcha == pchb) break;
-                                                       }                                                               
-                                               }
-                                               else if ((ct->tar == newArm) && (ct->subtarget[0] != 0)) {
-                                                       for (pcha=opchans->first, pchb=opchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) {
-                                                               /* check if either one matches */
-                                                               if ( (strcmp(pcha->name, ct->subtarget)==0) ||
-                                                                        (strcmp(pchb->name, ct->subtarget)==0) )
-                                                               {
+                                                       }
+                                                       else if (ct->tar == newArm) {
+                                                               if(BLI_findstring(opchans, ct->subtarget, offsetof(bPoseChannel, name))) {
                                                                        ct->tar= origArm;
-                                                                       break;
                                                                }
-                                                               
-                                                               /* check if both ends have met (to stop checking) */
-                                                               if (pcha == pchb) break;
-                                                       }                                                               
+                                                       }
                                                }
                                        }
-                                       
-                                       if (cti->flush_constraint_targets)
+
+                                       if (cti->flush_constraint_targets) {
                                                cti->flush_constraint_targets(con, &targets, 0);
+                                       }
                                }
                        }
                }
                
                /* See if an object is parented to this armature */
-               if ((ob->parent) && (ob->parent == origArm)) {
+               if (ob->parent && (ob->parent == origArm)) {
                        /* Is object parented to a bone of this src armature? */
-                       if (ob->partype==PARBONE) {
-                               /* bone name in object */
-                               for (pcha=npchans->first, pchb=npchans->last; pcha && pchb; pcha=pcha->next, pchb=pchb->prev) {
-                                       /* check if either one matches */
-                                       if ( (strcmp(pcha->name, ob->parsubstr)==0) ||
-                                                (strcmp(pchb->name, ob->parsubstr)==0) )
-                                       {
-                                               ob->parent= newArm;
-                                               break;
-                                       }
-                                       
-                                       /* check if both ends have met (to stop checking) */
-                                       if (pcha == pchb) break;
+                       if ((ob->partype == PARBONE) && (ob->parsubstr[0] != '\0')) {
+                               if(BLI_findstring(npchans, ob->parsubstr, offsetof(bPoseChannel, name))) {
+                                       ob->parent= newArm;
                                }
                        }
                }
@@ -1209,12 +1160,10 @@ static int separate_armature_exec (bContext *C, wmOperator *UNUSED(op))
        Object *obedit= CTX_data_edit_object(C);
        Object *oldob, *newob;
        Base *oldbase, *newbase;
-       bArmature *arm;
        
        /* sanity checks */
        if (obedit == NULL)
                return OPERATOR_CANCELLED;
-       arm= obedit->data;
        
        /* set wait cursor in case this takes a while */
        WM_cursor_wait(1);
@@ -1633,6 +1582,7 @@ void POSE_OT_select_linked(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Select Connected";
        ot->idname= "POSE_OT_select_linked";
+       ot->description= "Select bones related to selected ones by parent/child relationships";
        
        /* api callbacks */
        ot->exec= NULL;
@@ -1732,6 +1682,7 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Select Connected";
        ot->idname= "ARMATURE_OT_select_linked";
+       ot->description= "Select bones related to selected ones by parent/child relationships";
        
        /* api callbacks */
        ot->exec= NULL;
@@ -1916,6 +1867,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Delete Selected Bone(s)";
        ot->idname= "ARMATURE_OT_delete";
+       ot->description= "Remove selected bones from the armature";
        
        /* api callbacks */
        ot->invoke = WM_operator_confirm;
@@ -2141,7 +2093,7 @@ float ED_rollBoneToVector(EditBone *bone, const float align_axis[3], const short
                sub_v3_v3v3(align_axis_proj, align_axis, vec);
                
                if(axis_only) {
-                       if(angle_v3v3(align_axis_proj, mat[2]) > M_PI/2) {
+                       if(angle_v3v3(align_axis_proj, mat[2]) > (float)(M_PI/2.0)) {
                                negate_v3(align_axis_proj);
                        }
                }
@@ -2220,10 +2172,8 @@ static int armature_calc_roll_exec(bContext *C, wmOperator *op)
                        mul_m3_v3(imat, vec);
                }
                else if (type==5) {
-                       bArmature *arm= ob->data;
-                       EditBone *ebone= (EditBone *)arm->act_edbone;
                        float mat[3][3], nor[3];
-
+                       ebone= (EditBone *)arm->act_edbone;
                        if(ebone==NULL) {
                                BKE_report(op->reports, RPT_ERROR, "No active bone set");
                                return OPERATOR_CANCELLED;
@@ -2272,6 +2222,7 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Recalculate Roll";
        ot->idname= "ARMATURE_OT_calculate_roll";
+       ot->description= "Automatically fix alignment of select bones' axes";
        
        /* api callbacks */
        ot->invoke = WM_menu_invoke;
@@ -2598,6 +2549,7 @@ void ARMATURE_OT_click_extrude(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Click-Extrude";
        ot->idname= "ARMATURE_OT_click_extrude";
+       ot->description= "Create a new bone going from the last selected joint to the mouse position";
        
        /* api callbacks */
        ot->invoke = armature_click_extrude_invoke;
@@ -2772,7 +2724,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *UNUSED(op))
 
        /* cancel if nothing selected */
        if (CTX_DATA_COUNT(C, selected_bones) == 0)
-         return OPERATOR_CANCELLED;
+               return OPERATOR_CANCELLED;
        
        ED_armature_sync_selection(arm->edbo); // XXX why is this needed?
 
@@ -2866,6 +2818,7 @@ void ARMATURE_OT_duplicate(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Duplicate Selected Bone(s)";
        ot->idname= "ARMATURE_OT_duplicate";
+       ot->description= "Make copies of the selected bones within the same armature";
        
        /* api callbacks */
        ot->exec = armature_duplicate_selected_exec;
@@ -2996,14 +2949,13 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
        bArmature *arm= (obedit) ? obedit->data : NULL;
        Scene *scene= CTX_data_scene(C);
        View3D *v3d= CTX_wm_view3d(C);
-       EditBone *newbone=NULL;
        ListBase points = {NULL, NULL};
        int count;
-       
+
        /* sanity checks */
-       if ELEM(NULL, obedit, arm)
+       if (ELEM(NULL, obedit, arm))
                return OPERATOR_CANCELLED;
-       
+
        /* loop over all bones, and only consider if visible */
        CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones)
        {
@@ -3037,7 +2989,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
                mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
                
                /* Create a bone */
-               newbone= add_points_bone(obedit, ebp->vec, curs);
+               /* newbone= */ add_points_bone(obedit, ebp->vec, curs);
        }
        else if (count == 2) {
                EditBonePoint *ebp, *ebp2;
@@ -3098,7 +3050,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
                
                /* add new bone and parent it to the appropriate end */
                if (headtail) {
-                       newbone= add_points_bone(obedit, head, tail);
+                       EditBone *newbone= add_points_bone(obedit, head, tail);
                        
                        /* do parenting (will need to set connected flag too) */
                        if (headtail == 2) {
@@ -3338,11 +3290,12 @@ void ARMATURE_OT_merge (wmOperatorType *ot)
 /* ************** END Add/Remove stuff in editmode ************ */
 /* *************** Tools in editmode *********** */
 
-static int armature_hide_exec(bContext *C, wmOperator *UNUSED(op))
+static int armature_hide_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
        bArmature *arm= obedit->data;
        EditBone *ebone;
+       const int invert= RNA_boolean_get(op->ptr, "unselected") ? BONE_SELECTED : 0;
 
        /* cancel if nothing selected */
        if (CTX_DATA_COUNT(C, selected_bones) == 0)
@@ -3350,7 +3303,7 @@ static int armature_hide_exec(bContext *C, wmOperator *UNUSED(op))
 
        for (ebone = arm->edbo->first; ebone; ebone=ebone->next) {
                if (EBONE_VISIBLE(arm, ebone)) {
-                       if (ebone->flag & BONE_SELECTED) {
+                       if ((ebone->flag & BONE_SELECTED) != invert) {
                                ebone->flag &= ~(BONE_TIPSEL|BONE_SELECTED|BONE_ROOTSEL);
                                ebone->flag |= BONE_HIDDEN_A;
                        }
@@ -3369,6 +3322,7 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Hide Selected Bones";
        ot->idname= "ARMATURE_OT_hide";
+       ot->description= "Tag selected bones to not be visible in Edit Mode";
        
        /* api callbacks */
        ot->exec= armature_hide_exec;
@@ -3376,6 +3330,9 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+       /* props */
+       RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected.");
 }
 
 static int armature_reveal_exec(bContext *C, wmOperator *UNUSED(op))
@@ -3405,6 +3362,7 @@ void ARMATURE_OT_reveal(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Reveal Bones";
        ot->idname= "ARMATURE_OT_reveal";
+       ot->description= "Unhide all bones that have been tagged to be hidden in Edit Mode";
        
        /* api callbacks */
        ot->exec= armature_reveal_exec;
@@ -3412,9 +3370,10 @@ void ARMATURE_OT_reveal(wmOperatorType *ot)
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
 
-void hide_selected_armature_bones(Scene *scene)
+}
+#if 0 // remove this?
+static void hide_selected_armature_bones(Scene *scene)
 {
        Object *obedit= scene->obedit; // XXX get from context
        bArmature *arm= obedit->data;
@@ -3432,8 +3391,6 @@ void hide_selected_armature_bones(Scene *scene)
        ED_armature_sync_selection(arm->edbo);
 }
 
-
-#if 0 // remove this?
 static void hide_unselected_armature_bones(Scene *scene)
 {
        Object *obedit= scene->obedit; // XXX get from context
@@ -3453,9 +3410,7 @@ static void hide_unselected_armature_bones(Scene *scene)
        ED_armature_validate_active(arm);
        ED_armature_sync_selection(arm->edbo);
 }
-#endif
 
-#if 0 // remove this?
 void show_all_armature_bones(Scene *scene)
 {
        Object *obedit= scene->obedit; // XXX get from context
@@ -3616,6 +3571,7 @@ void ARMATURE_OT_extrude(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Extrude";
        ot->idname= "ARMATURE_OT_extrude";
+       ot->description= "Create new bones from the selected joints";
        
        /* api callbacks */
        ot->exec= armature_extrude_exec;
@@ -3678,6 +3634,7 @@ void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Add Bone";
        ot->idname= "ARMATURE_OT_bone_primitive_add";
+       ot->description= "Add a new bone located at the 3D-Cursor";
        
        /* api callbacks */
        ot->exec = armature_bone_primitive_add_exec;
@@ -3767,6 +3724,7 @@ void ARMATURE_OT_subdivide(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Subdivide Multi";
        ot->idname= "ARMATURE_OT_subdivide";
+       ot->description= "Break selected bones into chains of smaller bones";
        
        /* api callbacks */
        ot->exec = armature_subdivide_exec;
@@ -3868,6 +3826,7 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Switch Direction";
        ot->idname= "ARMATURE_OT_switch_direction";
+       ot->description= "Change the direction that a chain of bones points in (head <-> tail swap)";
        
        /* api callbacks */
        ot->exec = armature_switch_direction_exec;
@@ -4015,7 +3974,7 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
 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 ", ICON_NULL);
+       uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", ICON_NONE);
        uiLayout *layout= uiPupMenuLayout(pup);
        int allchildbones = 0;
        
@@ -4042,6 +4001,7 @@ void ARMATURE_OT_parent_set(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Make Parent";
        ot->idname= "ARMATURE_OT_parent_set";
+       ot->description= "Set the active bone as the parent of the selected bones";
        
        /* api callbacks */
        ot->invoke = armature_parent_set_invoke;
@@ -4095,6 +4055,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Clear Parent";
        ot->idname= "ARMATURE_OT_parent_clear";
+       ot->description= "Remove the parent-child relationship between selected bones and their parents";
        
        /* api callbacks */
        ot->invoke = WM_menu_invoke;
@@ -4131,6 +4092,7 @@ void ARMATURE_OT_select_inverse(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Select Inverse";
        ot->idname= "ARMATURE_OT_select_inverse";
+       ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
        
        /* api callbacks */
        ot->exec= armature_select_inverse_exec;
@@ -4168,7 +4130,8 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
                        case SEL_INVERT:
                                if (ebone->flag & BONE_SELECTED) {
                                        ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
-                               } else {
+                               } 
+                               else {
                                        ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
                                        if(ebone->parent)
                                                ebone->parent->flag |= (BONE_TIPSEL);
@@ -4186,10 +4149,10 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
 
 void ARMATURE_OT_select_all(wmOperatorType *ot)
 {
-       
        /* identifiers */
        ot->name= "Select or Deselect All";
        ot->idname= "ARMATURE_OT_select_all";
+       ot->description= "Toggle selection status of all bones";
        
        /* api callbacks */
        ot->exec= armature_de_select_all_exec;
@@ -4270,6 +4233,7 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Select Hierarchy";
        ot->idname= "ARMATURE_OT_select_hierarchy";
+       ot->description= "Select immediate parent/children of selected bones";
        
        /* api callbacks */
        ot->exec= armature_select_hierarchy_exec;
@@ -4706,14 +4670,14 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
                                bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
                        
                        /* add the vert to the deform group if weight!=0.0 */
-                       if (distance!=0.0)
+                       if (distance != 0.0f)
                                ED_vgroup_vert_add (ob, dgroup, i, distance, WEIGHT_REPLACE);
                        else
                                ED_vgroup_vert_remove (ob, dgroup, i);
                        
                        /* do same for mirror */
                        if (dgroupflip && dgroupflip[j] && iflip >= 0) {
-                               if (distance!=0.0)
+                               if (distance != 0.0f)
                                        ED_vgroup_vert_add (ob, dgroupflip[j], iflip, distance,
                                                WEIGHT_REPLACE);
                                else
@@ -4723,7 +4687,7 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
        }
 }
 
-void add_verts_to_dgroups(ReportList *reports, Scene *scene, Object *ob, Object *par, int heat, int mirror)
+static 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.
@@ -4962,7 +4926,7 @@ static void pchan_clear_rot(bPoseChannel *pchan)
                                        pchan->rotAxis[2]= 0.0f;
                                        
                                /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
-                               if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
+                               if (IS_EQF(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQF(pchan->rotAxis[1], pchan->rotAxis[2]))
                                        pchan->rotAxis[1] = 1.0f;
                        }
                        else if (pchan->rotmode == ROT_MODE_QUAT) {
@@ -5035,11 +4999,10 @@ static void pchan_clear_rot(bPoseChannel *pchan)
                }
                else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
                        /* by default, make rotation of 0 radians around y-axis (roll) */
-                       pchan->rotAxis[0]=pchan->rotAxis[2]=pchan->rotAngle= 0.0f;
-                       pchan->rotAxis[1]= 1.0f;
+                       unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
                }
                else {
-                       pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
+                       zero_v3(pchan->eul);
                }
        }
 }
@@ -5068,7 +5031,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
                return OPERATOR_CANCELLED;
        }
        
-       /* only clear those channels that are not locked */
+       /* only clear relevant transforms for selected bones */
        CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) 
        {
                /* run provided clearing function */
@@ -5218,10 +5181,10 @@ static int pose_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
 
 void POSE_OT_select_inverse(wmOperatorType *ot)
 {
-       
        /* identifiers */
        ot->name= "Select Inverse";
        ot->idname= "POSE_OT_select_inverse";
+       ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
        
        /* api callbacks */
        ot->exec= pose_select_inverse_exec;
@@ -5253,7 +5216,8 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
                case SEL_INVERT:
                        if (pchan->bone->flag & BONE_SELECTED) {
                                pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
-                       } else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
+                       } 
+                       else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
                                        pchan->bone->flag |= BONE_SELECTED;
                        }
                        break;
@@ -5268,10 +5232,10 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
 
 void POSE_OT_select_all(wmOperatorType *ot)
 {
-       
        /* identifiers */
        ot->name= "Select or Deselect All";
        ot->idname= "POSE_OT_select_all";
+       ot->description= "Toggle selection status of all bones";
        
        /* api callbacks */
        ot->exec= pose_de_select_all_exec;
@@ -5313,8 +5277,9 @@ static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
 void POSE_OT_select_parent(wmOperatorType *ot)
 {
        /* identifiers */
-       ot->name= "select parent bone";
+       ot->name= "Select Parent Bone";
        ot->idname= "POSE_OT_select_parent";
+       ot->description= "Select bones that are parents of the currently selected bones";
 
        /* api callbacks */
        ot->exec= pose_select_parent_exec;
@@ -5379,6 +5344,7 @@ void POSE_OT_hide(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Hide Selected";
        ot->idname= "POSE_OT_hide";
+       ot->description= "Tag selected bones to not be visible in Pose Mode";
        
        /* api callbacks */
        ot->exec= pose_hide_exec;
@@ -5424,6 +5390,7 @@ void POSE_OT_reveal(wmOperatorType *ot)
        /* identifiers */
        ot->name= "Reveal Selected";
        ot->idname= "POSE_OT_reveal";
+       ot->description= "Unhide all bones that have been tagged to be hidden in Pose Mode";
        
        /* api callbacks */
        ot->exec= pose_reveal_exec;
@@ -5440,13 +5407,11 @@ static int bone_unique_check(void *arg, const char *name)
        return get_named_bone((bArmature *)arg, name) != NULL;
 }
 
-void unique_bone_name(bArmature *arm, char *name)
+static void unique_bone_name(bArmature *arm, char *name)
 {
        BLI_uniquename_cb(bone_unique_check, (void *)arm, "Bone", '.', name, sizeof(((Bone *)NULL)->name));
 }
 
-
-#define MAXBONENAME 32
 /* helper call for armature_bone_rename */
 static void constraint_bone_name_fix(Object *ob, ListBase *conlist, char *oldname, char *newname)
 {
@@ -5620,7 +5585,7 @@ void ARMATURE_OT_flip_names (wmOperatorType *ot)
        /* identifiers */
        ot->name= "Flip Names";
        ot->idname= "ARMATURE_OT_flip_names";
-       ot->description= "Flips (and corrects) the names of selected bones";
+       ot->description= "Flips (and corrects) the axis suffixes of the names of selected bones";
        
        /* api callbacks */
        ot->exec= armature_flip_names_exec;
@@ -5841,7 +5806,7 @@ EditBone * test_subdivideByCorrelation(Scene *scene, Object *obedit, ReebArc *ar
                lastBone = subdivideArcBy(arm, arm->edbo, iter, invmat, tmat, nextAdaptativeSubdivision);
        }
        
-         return lastBone;
+       return lastBone;
 }
 
 float arcLengthRatio(ReebArc *arc)