Revision: 24430
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24430
Author:   campbellbarton
Date:     2009-11-09 22:03:54 +0100 (Mon, 09 Nov 2009)

Log Message:
-----------
use armature active bone as a pointer rather then a flag for each bone that 
needs looking up.
- rna vars arm.bones.active & rna.edit_bones.active
- needed special undo support.
- readfile.c loads.
- duplicate and copy_armature support.
- keep the draw flag, renamed to BONE_DRAW_ACTIVE, only use for openGL drawing.

Note: it may be better to allow active/unselected as with objects.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/armature/armature_intern.h
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/editors/armature/editarmature_retarget.c
    trunk/blender/source/blender/editors/armature/poselib.c
    trunk/blender/source/blender/editors/armature/poseobject.c
    trunk/blender/source/blender/editors/include/ED_armature.h
    trunk/blender/source/blender/editors/screen/screen_context.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/space_buttons/buttons_context.c
    trunk/blender/source/blender/editors/space_outliner/outliner.c
    trunk/blender/source/blender/editors/space_view3d/drawarmature.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c
    trunk/blender/source/blender/editors/transform/transform_manipulator.c
    trunk/blender/source/blender/makesdna/DNA_armature_types.h
    trunk/blender/source/blender/makesrna/intern/rna_armature.c
    trunk/blender/source/gameengine/Converter/BL_ArmatureChannel.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c     2009-11-09 
20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/blenkernel/intern/action.c     2009-11-09 
21:03:54 UTC (rev 24430)
@@ -471,7 +471,7 @@
        
        /* find active */
        for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
-               if ((pchan->bone) && (pchan->bone->flag & BONE_ACTIVE) && 
(pchan->bone->layer & arm->layer))
+               if ((pchan->bone) && (pchan->bone == arm->act_bone) && 
(pchan->bone->layer & arm->layer))
                        return pchan;
        }
        

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c   2009-11-09 
20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c   2009-11-09 
21:03:54 UTC (rev 24430)
@@ -169,10 +169,13 @@
        }
 }
 
-static void    copy_bonechildren (Bone* newBone, Bone* oldBone)
+static void    copy_bonechildren (Bone* newBone, Bone* oldBone, Bone* actBone, 
Bone **newActBone)
 {
        Bone    *curBone, *newChildBone;
        
+       if(oldBone == actBone)
+               *newActBone= newBone;
+
        /*      Copy this bone's list*/
        BLI_duplicatelist(&newBone->childbase, &oldBone->childbase);
        
@@ -180,7 +183,7 @@
        newChildBone=newBone->childbase.first;
        for (curBone=oldBone->childbase.first;curBone;curBone=curBone->next){
                newChildBone->parent=newBone;
-               copy_bonechildren(newChildBone,curBone);
+               copy_bonechildren(newChildBone, curBone, actBone, newActBone);
                newChildBone=newChildBone->next;
        }
 }
@@ -189,6 +192,7 @@
 {
        bArmature *newArm;
        Bone            *oldBone, *newBone;
+       Bone            *newActBone= NULL;
        
        newArm= copy_libblock (arm);
        BLI_duplicatelist(&newArm->bonebase, &arm->bonebase);
@@ -197,10 +201,11 @@
        newBone=newArm->bonebase.first;
        for (oldBone=arm->bonebase.first;oldBone;oldBone=oldBone->next){
                newBone->parent=NULL;
-               copy_bonechildren (newBone, oldBone);
+               copy_bonechildren (newBone, oldBone, arm->act_bone, 
&newActBone);
                newBone=newBone->next;
        };
        
+       newArm->act_bone= newActBone;
        return newArm;
 }
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2009-11-09 
20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2009-11-09 
21:03:54 UTC (rev 24430)
@@ -2333,7 +2333,7 @@
                        rebuild= 1;
                else if(ob->id.lib==NULL && arm->id.lib) {
                        /* local pose selection copied to armature, bit hackish 
*/
-                       pchan->bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE);
+                       pchan->bone->flag &= ~BONE_SELECTED;
                        pchan->bone->flag |= pchan->selectflag;
                }
        }
@@ -2388,6 +2388,9 @@
                direct_link_bones(fd, bone);
                bone=bone->next;
        }
+
+       arm->act_bone= newdataadr(fd, arm->act_bone);
+       arm->act_edbone= NULL;
 }
 
 /* ************ READ CAMERA ***************** */

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c  2009-11-09 
20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c  2009-11-09 
21:03:54 UTC (rev 24430)
@@ -1114,7 +1114,7 @@
                
                /* prevent crashes with autosave, when a bone duplicated in 
editmode has not yet been assigned to its posechannel */
                if (chan->bone) 
-                       chan->selectflag= chan->bone->flag & 
(BONE_SELECTED|BONE_ACTIVE); /* gets restored on read, for library armatures */
+                       chan->selectflag= chan->bone->flag & BONE_SELECTED; /* 
gets restored on read, for library armatures */
                
                writestruct(wd, DATA, "bPoseChannel", 1, chan);
        }

Modified: trunk/blender/source/blender/editors/armature/armature_intern.h
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_intern.h     
2009-11-09 20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/editors/armature/armature_intern.h     
2009-11-09 21:03:54 UTC (rev 24430)
@@ -136,7 +136,7 @@
 struct EditBone;
 struct ListBase;
 
-void make_boneList(struct ListBase *edbo, struct ListBase *bones, struct 
EditBone *parent);
+EditBone *make_boneList(struct ListBase *edbo, struct ListBase *bones, struct 
EditBone *parent, struct Bone *actBone);
 struct EditBone *addEditBone(struct bArmature *arm, char *name);
 void BIF_sk_selectStroke(struct bContext *C, short mval[2], short extend);
 

Modified: trunk/blender/source/blender/editors/armature/editarmature.c
===================================================================
--- trunk/blender/source/blender/editors/armature/editarmature.c        
2009-11-09 20:08:19 UTC (rev 24429)
+++ trunk/blender/source/blender/editors/armature/editarmature.c        
2009-11-09 21:03:54 UTC (rev 24430)
@@ -129,10 +129,30 @@
        }                               
 }
 
+void ED_armature_validate_active(struct bArmature *arm)
+{
+       EditBone *ebone= arm->act_edbone;
+
+       if(ebone) { 
+               if(ebone->flag & BONE_HIDDEN_A || (ebone->flag & 
BONE_SELECTED)==0)
+                       arm->act_edbone= NULL;
+       }
+}
+
+void free_edit_bone(bArmature *arm, EditBone *bone)
+{
+       if(arm->act_edbone==bone)
+               arm->act_edbone= NULL;
+
+       BLI_freelinkN(arm->edbo, bone);
+}
+
 /* converts Bones to EditBone list, used for tools as well */
-void make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent)
+EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, 
Bone *actBone)
 {
        EditBone        *eBone;
+       EditBone        *eBoneAct= NULL;
+       EditBone        *eBoneTest= NULL;
        Bone            *curBone;
        float delta[3];
        float premat[3][3];
@@ -194,9 +214,17 @@
                BLI_addtail(edbo, eBone);
                
                /*      Add children if necessary */
-               if (curBone->childbase.first) 
-                       make_boneList(edbo, &curBone->childbase, eBone);
+               if (curBone->childbase.first) {
+                       eBoneTest= make_boneList(edbo, &curBone->childbase, 
eBone, actBone);
+                       if(eBoneTest)
+                               eBoneAct= eBoneTest;
+               }
+
+               if(curBone==actBone)
+                       eBoneAct= eBone;
        }
+
+       return eBoneAct;
 }
 
 /* nasty stuff for converting roll in editbones into bones */
@@ -270,7 +298,7 @@
                                        fBone->parent= eBone->parent;
                        }
                        printf("Warning: removed zero sized bone: %s\n", 
eBone->name);
-                       BLI_freelinkN(arm->edbo, eBone);
+                       free_edit_bone(arm, eBone);
                }
        }
        
@@ -283,8 +311,12 @@
                memcpy(newBone->head, eBone->head, sizeof(float)*3);
                memcpy(newBone->tail, eBone->tail, sizeof(float)*3);
                newBone->flag= eBone->flag;
-               if (eBone->flag & BONE_ACTIVE) 
+
+               if (eBone == arm->act_edbone) {
                        newBone->flag |= BONE_SELECTED; /* important, editbones 
can be active with only 1 point selected */
+                       arm->act_edbone= NULL;
+                       arm->act_bone= newBone;
+               }
                newBone->roll = 0.0f;
                
                newBone->weight = eBone->weight;
@@ -997,7 +1029,7 @@
                        free_constraints(&pchan->constraints);
                        
                        /* get rid of unneeded bone */
-                       BLI_freelinkN(arm->edbo, curbone);
+                       free_edit_bone(arm, curbone);
                        BLI_freelinkN(&ob->pose->chanbase, pchan);
                }
        }
@@ -1633,19 +1665,20 @@
        return NULL;
 }
 
-static void delete_bone(ListBase *edbo, EditBone* exBone)
+/* warning, wont clear the active bone */
+static void delete_bone(bArmature *arm, EditBone* exBone)
 {
        EditBone *curBone;
        
        /* Find any bones that refer to this bone */
-       for (curBone=edbo->first;curBone;curBone=curBone->next) {
+       for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
                if (curBone->parent==exBone) {
                        curBone->parent=exBone->parent;
                        curBone->flag &= ~BONE_CONNECTED;
                }
        }
-       
-       BLI_freelinkN(edbo, exBone);
+
+       free_edit_bone(arm, exBone);
 }
 
 /* context: editmode armature */
@@ -1742,8 +1775,10 @@
        for (curBone=arm->edbo->first;curBone;curBone=next) {
                next=curBone->next;
                if (arm->layer & curBone->layer) {
-                       if (curBone->flag & BONE_SELECTED)
-                               delete_bone(arm->edbo, curBone);
+                       if (curBone->flag & BONE_SELECTED) {
+                               if(curBone==arm->act_edbone) arm->act_edbone= 
NULL;
+                               delete_bone(arm, curBone);
+                       }
                }
        }
        
@@ -1795,31 +1830,34 @@
        }
        else sel= toggle;
        
-       /*      Set the flags */
-       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) {
-                               eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | 
BONE_ROOTSEL);
-                               eBone->flag &= ~BONE_ACTIVE;
+       if(sel==2) {
+               arm->act_edbone= NULL;
+       } else {
+               /*      Set the flags */
+               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) {
+                                       eBone->flag ^= (BONE_SELECTED | 
BONE_TIPSEL | BONE_ROOTSEL);
+                                       if(arm->act_edbone==eBone)
+                                               arm->act_edbone= NULL;
+                               }
                        }
-               }
-               else if (sel==1) {
-                       /* select bone */
-                       if(arm->layer & eBone->layer && (eBone->flag & 
BONE_HIDDEN_A)==0) {
-                               eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | 
BONE_ROOTSEL);
-                               if(eBone->parent)
-                                       eBone->parent->flag |= (BONE_TIPSEL);
+                       else if (sel==1) {
+                               /* select bone */
+                               if(arm->layer & eBone->layer && (eBone->flag & 
BONE_HIDDEN_A)==0) {
+                                       eBone->flag |= (BONE_SELECTED | 
BONE_TIPSEL | BONE_ROOTSEL);
+                                       if(eBone->parent)
+                                               eBone->parent->flag |= 
(BONE_TIPSEL);
+                               }
                        }
+                       else {
+                               /* deselect bone */
+                               eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | 
BONE_ROOTSEL);
+                               if(arm->act_edbone==eBone)
+                                       arm->act_edbone= NULL;
+                       }
                }
-               else if (sel==2) {
-                       /* clear active flag */
-                       eBone->flag &= ~(BONE_ACTIVE);
-               }
-               else {
-                       /* deselect bone */
-                       eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | 
BONE_ROOTSEL | BONE_ACTIVE);
-               }
        }
        
        ED_armature_sync_selection(arm->edbo);
@@ -1836,7 +1874,7 @@
        Object *obedit= CTX_data_edit_object(C);
        bArmature *arm= obedit->data;
        ViewContext vc;
-       EditBone *nearBone = NULL, *ebone;
+       EditBone *nearBone = NULL;
        int     selmask;
 
        view3d_set_viewcontext(C, &vc);
@@ -1898,8 +1936,7 @@
                
                if(nearBone) {
                        /* then now check for active status */
-                       for (ebone=arm->edbo->first;ebone;ebone=ebone->next) 
ebone->flag &= ~BONE_ACTIVE;
-                       if(nearBone->flag & BONE_SELECTED) nearBone->flag |= 
BONE_ACTIVE;
+                       if(nearBone->flag & BONE_SELECTED) arm->act_edbone= 
nearBone;
                }
                
                WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
@@ -1945,7 +1982,8 @@
        
        ED_armature_edit_free(ob);
        arm->edbo= MEM_callocN(sizeof(ListBase), "edbo armature");

@@ 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