[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38426] branches/soc-2011-pepper/source/ blender/editors/animation/keyframing.c: Bugfix [#27157] keyframing a constrained bone does not work as before

Joshua Leung aligorith at gmail.com
Sat Jul 16 08:46:40 CEST 2011


Revision: 38426
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38426
Author:   aligorith
Date:     2011-07-16 06:46:39 +0000 (Sat, 16 Jul 2011)
Log Message:
-----------
Bugfix [#27157] keyframing a constrained bone does not work as before

Visual Keyframing was broken by r.34685, which used another method
which, at the time, appeared to work perfectly fine. Apparently not.

Also, extend/fixed visual keying to work for axis-angle rotations too.
Needs some testing, but should probably work

Modified Paths:
--------------
    branches/soc-2011-pepper/source/blender/editors/animation/keyframing.c

Modified: branches/soc-2011-pepper/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/soc-2011-pepper/source/blender/editors/animation/keyframing.c	2011-07-16 05:29:15 UTC (rev 38425)
+++ branches/soc-2011-pepper/source/blender/editors/animation/keyframing.c	2011-07-16 06:46:39 UTC (rev 38426)
@@ -661,41 +661,72 @@
 				mat4_to_eulO(eul, ob->rotmode, ob->obmat);
 				return eul[array_index];
 			}
-			// FIXME: other types of rotation don't work
+			else if (strstr(identifier, "rotation_quaternion")) {
+				float trimat[3][3], quat[4];
+				
+				copy_m3_m4(trimat, ob->obmat);
+				mat3_to_quat_is_ok(quat, trimat);
+				
+				return quat[array_index];
+			}
+			else if (strstr(identifier, "rotation_axis_angle")) {
+				float axis[3], angle;
+				
+				mat4_to_axis_angle(axis, &angle, ob->obmat);
+				
+				/* w = 0, x,y,z = 1,2,3 */
+				if (array_index == 0)
+					return angle;
+				else
+					return axis[array_index - 1];
+			}
 		}
 	}
 	else if (ptr->type == &RNA_PoseBone) {
+		Object *ob = (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
 		bPoseChannel *pchan= (bPoseChannel *)ptr->data;
-		bPoseChannel tchan;
+		float tmat[4][4];
 		
-		/* make a copy of pchan so that we can apply and decompose its chan_mat, thus getting the 
-		 * rest-pose to pose-mode transform that got stored there at the end of posing calculations
-		 * for B-Bone deforms to use
-		 *	- it should be safe to just make a local copy like this, since we're not doing anything with the copied pointers
+		/* Although it is not strictly required for this particular space conversion, 
+		 * arg1 must not be null, as there is a null check for the other conversions to
+		 * be safe. Therefore, the active object is passed here, and in many cases, this
+		 * will be what owns the pose-channel that is getting this anyway.
 		 */
-		memcpy(&tchan, pchan, sizeof(bPoseChannel));
-		pchan_apply_mat4(&tchan, pchan->chan_mat, TRUE);
+		copy_m4_m4(tmat, pchan->pose_mat);
+		constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
 		
 		/* Loc, Rot/Quat keyframes are supported... */
 		if (strstr(identifier, "location")) {
 			/* only use for non-connected bones */
 			if ((pchan->bone->parent) && !(pchan->bone->flag & BONE_CONNECTED))
-				return tchan.loc[array_index];
+				return tmat[3][array_index];
 			else if (pchan->bone->parent == NULL)
-				return tchan.loc[array_index];
+				return tmat[3][array_index];
 		}
 		else if (strstr(identifier, "rotation_euler")) {
-			return tchan.eul[array_index];
+			float eul[3];
+			
+			mat4_to_eulO(eul, pchan->rotmode, tmat);
+			return eul[array_index];
 		}
 		else if (strstr(identifier, "rotation_quaternion")) {
-			return tchan.quat[array_index];
+			float trimat[3][3], quat[4];
+			
+			copy_m3_m4(trimat, tmat);
+			mat3_to_quat_is_ok(quat, trimat);
+			
+			return quat[array_index];
 		}
-		else if (strstr(identifier, "rotation_axisangle")) {
+		else if (strstr(identifier, "rotation_axis_angle")) {
+			float axis[3], angle;
+			
+			mat4_to_axis_angle(axis, &angle, tmat);
+			
 			/* w = 0, x,y,z = 1,2,3 */
 			if (array_index == 0)
-				return tchan.rotAngle;
+				return angle;
 			else
-				return tchan.rotAxis[array_index - 1];
+				return axis[array_index - 1];
 		}
 	}
 	




More information about the Bf-blender-cvs mailing list