[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24430] trunk/blender/source: use armature active bone as a pointer rather then a flag for each bone that needs looking up .
Campbell Barton
ideasman42 at gmail.com
Mon Nov 9 22:03:54 CET 2009
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. @@
More information about the Bf-blender-cvs
mailing list