[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