[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12246] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 10 11:00:49 CEST 2007


Revision: 12246
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12246
Author:   blendix
Date:     2007-10-10 11:00:47 +0200 (Wed, 10 Oct 2007)

Log Message:
-----------

Make B-Bones not deform in rest position by default.

B-Bones already deformed the mesh in the armature rest position, which is
unconvenient. For backwards compatibility existing .blend files still have
a button for the old behavior enabled.

(peach feature request)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_armature.h
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_armature_types.h
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/drawarmature.c

Modified: trunk/blender/source/blender/blenkernel/BKE_armature.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_armature.h	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/blenkernel/BKE_armature.h	2007-10-10 09:00:47 UTC (rev 12246)
@@ -112,7 +112,7 @@
 	float mat[4][4];
 } Mat4;
 
-Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan);
+Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan, int rest);
 
 #ifdef __cplusplus
 }

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2007-10-10 09:00:47 UTC (rev 12246)
@@ -44,7 +44,7 @@
 struct MemFile;
 
 #define BLENDER_VERSION			245
-#define BLENDER_SUBVERSION		3
+#define BLENDER_SUBVERSION		4
 
 #define BLENDER_MINVERSION		240
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2007-10-10 09:00:47 UTC (rev 12246)
@@ -404,9 +404,11 @@
 
 /* returns pointer to static array, filled with desired amount of bone->segments elements */
 /* this calculation is done  within unit bone space */
-Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
+Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
 {
 	static Mat4 bbone_array[MAX_BBONE_SUBDIV];
+	static Mat4 bbone_rest_array[MAX_BBONE_SUBDIV];
+	Mat4 *result_array= (rest)? bbone_rest_array: bbone_array;
 	bPoseChannel *next, *prev;
 	Bone *bone= pchan->bone;
 	float h1[3], h2[3], length, hlength1, hlength2, roll;
@@ -430,11 +432,17 @@
 		first point = (0,0,0)
 		last point =  (0, length, 0) */
 	
-	Mat4Invert(imat, pchan->pose_mat);
+	if(rest)
+		Mat4Invert(imat, pchan->bone->arm_mat);
+	else
+		Mat4Invert(imat, pchan->pose_mat);
 	
 	if(prev) {
 		/* transform previous point inside this bone space */
-		VECCOPY(h1, prev->pose_head);
+		if(rest)
+			VECCOPY(h1, prev->bone->arm_head)
+		else
+			VECCOPY(h1, prev->pose_head)
 		Mat4MulVecfl(imat, h1);
 		/* if previous bone is B-bone too, use average handle direction */
 		if(prev->bone->segments>1) h1[1]-= length;
@@ -448,14 +456,20 @@
 		float difmat[4][4], result[3][3], imat3[3][3];
 		
 		/* transform next point inside this bone space */
-		VECCOPY(h2, next->pose_tail);
+		if(rest)
+			VECCOPY(h2, next->bone->arm_tail)
+		else
+			VECCOPY(h2, next->pose_tail)
 		Mat4MulVecfl(imat, h2);
 		/* if next bone is B-bone too, use average handle direction */
 		if(next->bone->segments>1);
 		else h2[1]-= length;
 		
 		/* find the next roll to interpolate as well */
-		Mat4MulMat4(difmat, next->pose_mat, imat);
+		if(rest)
+			Mat4MulMat4(difmat, next->pose_mat, imat);
+		else
+			Mat4MulMat4(difmat, next->bone->arm_mat, imat);
 		Mat3CpyMat4(result, difmat);				// the desired rotation at beginning of next bone
 		
 		vec_roll_to_mat3(h2, 0.0f, mat3);			// the result of vec_roll without roll
@@ -490,19 +504,20 @@
 	for(a=0, fp= data[0]; a<bone->segments; a++, fp+=4) {
 		VecSubf(h1, fp+4, fp);
 		vec_roll_to_mat3(h1, fp[3], mat3);		// fp[3] is roll
-		Mat4CpyMat3(bbone_array[a].mat, mat3);
-		VECCOPY(bbone_array[a].mat[3], fp);
+		Mat4CpyMat3(result_array[a].mat, mat3);
+		VECCOPY(result_array[a].mat[3], fp);
 	}
 	
-	return bbone_array;
+	return result_array;
 }
 
 /* ************ Armature Deform ******************* */
 
-static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
+static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion, int rest_def)
 {
 	Bone *bone= pchan->bone;
-	Mat4 *b_bone= b_bone_spline_setup(pchan);
+	Mat4 *b_bone= b_bone_spline_setup(pchan, 0);
+	Mat4 *b_bone_rest= (rest_def)? NULL: b_bone_spline_setup(pchan, 1);
 	Mat4 *b_bone_mats;
 	DualQuat *b_bone_dual_quats= NULL;
 	float tmat[4][4];
@@ -529,7 +544,10 @@
 	Mat4One(tmat);
 
 	for(a=0; a<bone->segments; a++) {
-		tmat[3][1] = -a*(bone->length/(float)bone->segments);
+		if(b_bone_rest)
+			Mat4Invert(tmat, b_bone_rest[a].mat);
+		else
+			tmat[3][1] = -a*(bone->length/(float)bone->segments);
 
 		Mat4MulSerie(b_bone_mats[a+1].mat, pchan->chan_mat, bone->arm_mat,
 			b_bone[a].mat, tmat, b_bone_mats[0].mat, NULL, NULL, NULL);
@@ -726,6 +744,7 @@
 	float obinv[4][4], premat[4][4], postmat[4][4];
 	int use_envelope = deformflag & ARM_DEF_ENVELOPE;
 	int use_quaternion = deformflag & ARM_DEF_QUATERNION;
+	int bbone_rest_def = deformflag & ARM_DEF_B_BONE_REST;
 	int numGroups = 0;		/* safety for vertexgroup index overflow */
 	int i, target_totvert = 0;	/* safety for vertexgroup overflow */
 	int use_dverts = 0;
@@ -751,7 +770,7 @@
 	for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
 		if(!(pchan->bone->flag & BONE_NO_DEFORM)) {
 			if(pchan->bone->segments > 1)
-				pchan_b_bone_defmats(pchan, use_quaternion);
+				pchan_b_bone_defmats(pchan, use_quaternion, bbone_rest_def);
 
 			if(use_quaternion) {
 				pchan->dual_quat= &dualquats[totchan++];

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-10-10 09:00:47 UTC (rev 12246)
@@ -6750,6 +6750,21 @@
 		}
 	}
 
+	if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 4)) {
+		bArmature *arm;
+		ModifierData *md;
+		Object *ob;
+
+		for(arm= main->armature.first; arm; arm= arm->id.next)
+			arm->deformflag |= ARM_DEF_B_BONE_REST;
+
+		for(ob = main->object.first; ob; ob= ob->id.next)
+			for(md=ob->modifiers.first; md; md=md->next)
+				if(md->type==eModifierType_Armature)
+					((ArmatureModifierData*)md)->deformflag |= ARM_DEF_B_BONE_REST;
+	}
+
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
 

Modified: trunk/blender/source/blender/makesdna/DNA_armature_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_armature_types.h	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/makesdna/DNA_armature_types.h	2007-10-10 09:00:47 UTC (rev 12246)
@@ -114,6 +114,7 @@
 #define		ARM_DEF_VGROUP		1
 #define		ARM_DEF_ENVELOPE	2
 #define		ARM_DEF_QUATERNION	4
+#define		ARM_DEF_B_BONE_REST	8
 
 /* armature->pathflag */
 #define		ARM_PATH_FNUMS	0x001

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/src/buttons_editing.c	2007-10-10 09:00:47 UTC (rev 12246)
@@ -1912,9 +1912,8 @@
 			uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ob);
 			uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vert.Groups",	lx,cy-=19,buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform");
 			uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes",	lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform");
-			uiDefButBitS(block, TOG, ARM_DEF_QUATERNION, B_ARM_RECALCDATA, "Quaternion",	lx,(cy-=19),buttonWidth + 1,20, &amd->deformflag, 0, 0, 0, 0, "Enable deform rotation interpolation with Quaternions");
-
-			
+			uiDefButBitS(block, TOG, ARM_DEF_QUATERNION, B_ARM_RECALCDATA, "Quaternion",	lx,(cy-=19),buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable deform rotation interpolation with Quaternions");
+			uiDefButBitS(block, TOG, ARM_DEF_B_BONE_REST, B_ARM_RECALCDATA, "B-Bone Rest", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Make B-Bones deform already in rest position");
 		} else if (md->type==eModifierType_Hook) {
 			HookModifierData *hmd = (HookModifierData*) md;
 			uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff: ",		lx, (cy-=19), buttonWidth,19, &hmd->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
@@ -3641,8 +3640,9 @@
 	uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vertex Groups",	10, 20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform (not for Modifiers)");
 	uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes",	110,20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform (not for Modifiers)");
 	uiDefButBitS(block, TOG, ARM_DEF_QUATERNION, B_ARM_RECALCDATA, "Quaternion", 210,20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable deform rotation interpolation with Quaternions (not for Modifiers)");
-	uiDefButBitI(block, TOG, ARM_RESTPOS, B_ARM_RECALCDATA,"Rest Position",		10,0,150,20, &arm->flag, 0, 0, 0, 0, "Show armature rest position, no posing possible");
-	uiDefButBitI(block, TOG, ARM_DELAYDEFORM, REDRAWVIEW3D, "Delay Deform",		160,0,150,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode");
+	uiDefButBitI(block, TOG, ARM_RESTPOS, B_ARM_RECALCDATA,"Rest Position",		10,0,100,20, &arm->flag, 0, 0, 0, 0, "Show armature rest position, no posing possible");
+	uiDefButBitI(block, TOG, ARM_DELAYDEFORM, REDRAWVIEW3D, "Delay Deform",		110,0,100,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode");
+	uiDefButBitS(block, TOG, ARM_DEF_B_BONE_REST, B_ARM_RECALCDATA,"B-Bone Rest", 210,0,100,20, &arm->deformflag, 0, 0, 0, 0, "Make B-Bones deform already in rest position");
 	uiBlockEndAlign(block);
 }
 

Modified: trunk/blender/source/blender/src/drawarmature.c
===================================================================
--- trunk/blender/source/blender/src/drawarmature.c	2007-10-09 20:37:53 UTC (rev 12245)
+++ trunk/blender/source/blender/src/drawarmature.c	2007-10-10 09:00:47 UTC (rev 12246)
@@ -888,7 +888,7 @@
 	
 	if(segments>1 && pchan) {
 		float dlen= length/(float)segments;
-		Mat4 *bbone= b_bone_spline_setup(pchan);
+		Mat4 *bbone= b_bone_spline_setup(pchan, 0);
 		int a;
 		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list