allow multiple bones to be selected in weight paint mode in a less complicated way...
authorCampbell Barton <ideasman42@gmail.com>
Sun, 18 Sep 2011 15:17:16 +0000 (15:17 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 18 Sep 2011 15:17:16 +0000 (15:17 +0000)
source/blender/editors/armature/editarmature.c

index 4cbf93e..7ab8d29 100644 (file)
@@ -4276,74 +4276,35 @@ static int bone_looper(Object *ob, Bone *bone, void *data,
        
        return count;
 }
-/* Radish */
-Bone* get_other_selected_bone(Object *ob) {
-       Bone *bone;
-       int i;
-       bone = get_indexed_bone(ob, 0);
-       for(i = 0; bone;){
-               if(bone->flag & BONE_SELECTED) {
-                       return bone;
-               }
-               i++;
-               bone = get_indexed_bone(ob, i);
-       }
 
-       return NULL;
-}
 /* called from editview.c, for mode-less pose selection */
 /* assumes scene obact and basact is still on old situation */
 int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, short hits, short extend)
 {
        Object *ob= base->object;
        Bone *nearBone;
-
+       
        if (!ob || !ob->pose) return 0;
 
        nearBone= get_bone_from_selectbuffer(scene, base, buffer, hits, 1);
-
+       
        /* if the bone cannot be affected, don't do anything */
        if ((nearBone) && !(nearBone->flag & BONE_UNSELECTABLE)) {
+               Object *ob_act= OBACT;
                bArmature *arm= ob->data;
                
-               /* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
-               /* Radish, I'm doing a select for multibone painting */
-               if (scene->toolsettings->multipaint && (base != scene->basact)) {//if (!(extend) || (base != scene->basact)) {
-                       Bone *new_act_bone;
-                       /* Radish */
-                       /* only deselect all if they aren't using 'shift' */
-                       if(!extend) {
-                               ED_pose_deselectall(ob, 0);
-                               nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
-                               arm->act_bone= nearBone;
-                               ED_vgroup_select_by_name(OBACT, nearBone->name);
-                       }
-                       else {
-                               /* Radish deselect this bone specifically if it is selected already */
-                               if (nearBone->flag & BONE_SELECTED) {
-                                       nearBone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
-                                       if(nearBone == arm->act_bone) {
-                                               // make a different bone the active one if it exists
-                                               new_act_bone = get_other_selected_bone(ob);
-                                               if(new_act_bone) {
-                                                       new_act_bone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
-                                                       arm->act_bone = new_act_bone;
-                                                       ED_vgroup_select_by_name(OBACT, new_act_bone->name);
-                                               }
-                                       }
-                               // or select the bone if they are using shift
-                               } else {
-                                       nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
-                                       arm->act_bone= nearBone;
-                               }
-                       } 
-                       DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
-                               // XXX old cruft! use notifiers instead
-                       //select_actionchannel_by_name(ob->action, nearBone->name, 1);
-               } else if (!(extend) || (base != scene->basact)) {
+               /* since we do unified select, we don't shift+select a bone if the
+                * armature object was not active yet.
+                * note, special exception for armature mode so we can do multi-select
+                * we could check for multi-select explicitly but think its fine to
+                * always give pradictable behavior in weight paint mode - campbell */
+               if (!(extend) || (base->object != ob_act && !(ob_act->mode & OB_MODE_WEIGHT_PAINT))) {
                        ED_pose_deselectall(ob, 0);
                        nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
                        arm->act_bone= nearBone;
+                       
+                               // XXX old cruft! use notifiers instead
+                       //select_actionchannel_by_name(ob->action, nearBone->name, 1);
                }
                else {
                        if (nearBone->flag & BONE_SELECTED) {
@@ -4368,7 +4329,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
                }
                
                /* in weightpaint we select the associated vertex group too */
-               if (OBACT && OBACT->mode & OB_MODE_WEIGHT_PAINT) {
+               if (ob_act && ob_act->mode & OB_MODE_WEIGHT_PAINT) {
                        if (nearBone == arm->act_bone) {
                                ED_vgroup_select_by_name(OBACT, nearBone->name);
                                DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);