More bugfixes for Armature Separation/Joining:
authorJoshua Leung <aligorith@gmail.com>
Sun, 11 May 2008 12:34:56 +0000 (12:34 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sun, 11 May 2008 12:34:56 +0000 (12:34 +0000)
* Move armatures out of posemode before joining/separating, so that bones don't mysteriously disappear after the operation
* Added an undo push and fixed up hotkey access for armature separation

source/blender/src/editarmature.c
source/blender/src/header_view3d.c
source/blender/src/space.c

index 7bb0dc7d347945c79f2b06ed41ee18476b743873..f87eb321fc8c5f09dd78afcfcc7346d0746e7154 100644 (file)
@@ -565,7 +565,11 @@ int join_armature(void)
        /* Get editbones of active armature to add editbones to */
        ebbase.first=ebbase.last= NULL;
        make_boneList(&ebbase, &arm->bonebase, NULL);
+       
+       /* get pose of active object and move it out of posemode */
        pose= ob->pose;
+       ob->flag &= ~OB_POSEMODE;
+       BASACT->flag &= ~OB_POSEMODE;
        
        for (base=FIRSTBASE; base; base=nextbase) {
                nextbase = base->next;
@@ -577,6 +581,8 @@ int join_armature(void)
                                
                                /* Get Pose of current armature */
                                opose= base->object->pose;
+                               base->object->flag &= ~OB_POSEMODE;
+                               BASACT->flag &= ~OB_POSEMODE;
                                
                                /* Find the difference matrix */
                                Mat4Invert(oimat, ob->obmat);
@@ -837,7 +843,7 @@ void separate_armature (void)
        arm= G.obedit->data;
        
        /* we are going to do this as follows (unlike every other instance of separate):
-        *      1. exit editmode for active armature/base. Take note of what this is. 
+        *      1. exit editmode +posemode for active armature/base. Take note of what this is.
         *      2. duplicate base - BASACT is the new one now
         *      3. for each of the two armatures, enter editmode -> remove appropriate bones -> exit editmode + recalc
         *      4. fix constraint links
@@ -856,6 +862,8 @@ void separate_armature (void)
        /* 1) store starting settings and exit editmode */
        oldob= G.obedit;
        oldbase= BASACT;
+       oldob->flag &= ~OB_POSEMODE;
+       oldbase->flag &= ~OB_POSEMODE;
        
        load_editArmature();
        free_editArmature();
@@ -894,6 +902,8 @@ void separate_armature (void)
        allqueue(REDRAWVIEW3D, 0);
        allqueue(REDRAWBUTSEDIT, 0);
        allqueue(REDRAWOOPS, 0);
+       
+       BIF_undo_push("Separate Armature");
 }
 
 /* **************** END tools on Editmode Armature **************** */
index 454409658597ff8f4d8103728f343ffab7ac7e85..cb3cfce62c3d62bfac726074676d4d5177e0ac0e 100644 (file)
@@ -3964,7 +3964,7 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill Between Joints|F",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
        uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
        
-       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|Ctrl Shift P",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
+       uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|Ctrl Alt P",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
        
        uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
        
index 77584ac21aa9fcc45b74b03023dc76b643dbe7cc..cc7f4322ed93c0df2f03a8d8e91c183deab99cee 100644 (file)
@@ -2411,7 +2411,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                                                clear_bone_parent();
                                        else if((G.qual==0) && (G.obedit->type==OB_ARMATURE)) 
                                                select_bone_parent();
-                                       else if((G.qual==(LR_CTRLKEY|LR_SHIFTKEY)) && (G.obedit->type==OB_ARMATURE))
+                                       else if((G.qual==(LR_CTRLKEY|LR_ALTKEY)) && (G.obedit->type==OB_ARMATURE))
                                                separate_armature();
                                        else if((G.qual==0) && G.obedit->type==OB_MESH)
                                                separatemenu();