[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19004] branches/blender2.5/blender/source /blender/editors: Visual Keyframing - Restored code to make this work, but it may still be flaky

Joshua Leung aligorith at gmail.com
Tue Feb 17 11:58:45 CET 2009


Revision: 19004
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19004
Author:   aligorith
Date:     2009-02-17 11:58:40 +0100 (Tue, 17 Feb 2009)

Log Message:
-----------
Visual Keyframing - Restored code to make this work, but it may still be flaky

NOTE: upon further testing, quick-record-animation feature does not work with auto-ik yet. Although it would be desireable to have, it is not a priority at this point, since adding that would require a bit of reworking of that code for something it wasn't intended for.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
    branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/keyframing.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-02-17 09:34:21 UTC (rev 19003)
+++ branches/blender2.5/blender/source/blender/editors/animation/keyframing.c	2009-02-17 10:58:40 UTC (rev 19004)
@@ -527,37 +527,50 @@
  */
 static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
 {
-	//Object *ob= NULL;
 	bConstraint *con= NULL;
 	short searchtype= VISUALKEY_NONE;
+	char *identifier= NULL;
 	
-#if 0 //  XXX old animation system	
 	/* validate data */
-	if ((id == NULL) || (GS(id->name)!=ID_OB) || !(ELEM(blocktype, ID_OB, ID_PO))) 
-		return 0;	
-	
-	/* get first constraint and determine type of keyframe constraints to check for*/
-	ob= (Object *)id;
-	
-	if (blocktype == ID_OB) {
+	// TODO: this check is probably not needed, but it won't hurt
+	if (ELEM3(NULL, ptr, ptr->data, prop))
+		return 0;
+		
+	/* get first constraint and determine type of keyframe constraints to check for 
+	 * 	- constraints can be on either Objects or PoseChannels, so we only check if the
+	 *	  ptr->type is RNA_Object or RNA_PoseChannel, which are the RNA wrapping-info for
+	 *  	  those structs, allowing us to identify the owner of the data 
+	 */
+	if (ptr->type == &RNA_Object) {
+		/* Object */
+		Object *ob= (Object *)ptr->data;
+		
 		con= ob->constraints.first;
+		identifier= (char *)RNA_property_identifier(ptr, prop);
+	}
+	else if (ptr->type == &RNA_PoseChannel) {
+		/* Pose Channel */
+		bPoseChannel *pchan= (bPoseChannel *)ptr->data;
 		
-		if (ELEM3(adrcode, OB_LOC_X, OB_LOC_Y, OB_LOC_Z))
-			searchtype= VISUALKEY_LOC;
-		else if (ELEM3(adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z))
-			searchtype= VISUALKEY_ROT;
+		con= pchan->constraints.first;
+		identifier= (char *)RNA_property_identifier(ptr, prop);
 	}
-	else if (blocktype == ID_PO) {
-		bPoseChannel *pchan= get_pose_channel(ob->pose, actname);
-		con= pchan->constraints.first;
+	
+	/* check if any data to search using */
+	if (ELEM(NULL, con, identifier))
+		return 0;
 		
-		if (ELEM3(adrcode, AC_LOC_X, AC_LOC_Y, AC_LOC_Z))
-			searchtype= VISUALKEY_LOC;
-		else if (ELEM4(adrcode, AC_QUAT_W, AC_QUAT_X, AC_QUAT_Y, AC_QUAT_Z))
-			searchtype= VISUALKEY_ROT;
+	/* location or rotation identifiers only... */
+	if (strstr(identifier, "location"))
+		searchtype= VISUALKEY_LOC;
+	else if (strstr(identifier, "rotation"))
+		searchtype= VISUALKEY_ROT;
+	else {
+		printf("visualkey_can_use() failed: identifier - '%s' \n", identifier);
+		return 0;
 	}
-#endif
 	
+	
 	/* only search if a searchtype and initial constraint are available */
 	if (searchtype && con) {
 		for (; con; con= con->next) {
@@ -617,52 +630,40 @@
  * In the event that it is not possible to perform visual keying, try to fall-back
  * to using the default method. Assumes that all data it has been passed is valid.
  */
-// xxx... ptr here should be struct that data is in.... prop is the channel that's being used
 static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_index)
 {
-#if 0 // XXX old animation system
-	Object *ob;
-	void *poin = NULL;
-	int index, vartype;
+	char *identifier= (char *)RNA_property_identifier(ptr, prop);
 	
-	/* validate situtation */
-	if ((id==NULL) || (GS(id->name)!=ID_OB) || (ELEM(blocktype, ID_OB, ID_PO)==0))
-		return 0.0f;
+	/* handle for Objects or PoseChannels only 
+	 * 	- constraints can be on either Objects or PoseChannels, so we only check if the
+	 *	  ptr->type is RNA_Object or RNA_PoseChannel, which are the RNA wrapping-info for
+	 *  	  those structs, allowing us to identify the owner of the data 
+	 *	- assume that array_index will be sane
+	 */
+	if (ptr->type == &RNA_Object) {
+		Object *ob= (Object *)ptr->data;
 		
-	/* get object */
-	ob= (Object *)id;
-	
-	/* only valid for objects or posechannels */
-	if (blocktype == ID_OB) {
 		/* parented objects are not supported, as the effects of the parent
 		 * are included in the matrix, which kindof beats the point
 		 */
 		if (ob->parent == NULL) {
 			/* only Location or Rotation keyframes are supported now */
-			if (ELEM3(adrcode, OB_LOC_X, OB_LOC_Y, OB_LOC_Z)) {
-				/* assumes that OB_LOC_Z > OB_LOC_Y > OB_LOC_X */
-				index= adrcode - OB_LOC_X;
-				
-				return ob->obmat[3][index];
+			if (strstr(identifier, "location")) {
+				return ob->obmat[3][array_index];
 			}
-			else if (ELEM3(adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) {
+			else if (strstr(identifier, "rotation")) {
 				float eul[3];
 				
-				/* assumes that OB_ROT_Z > OB_ROT_Y > OB_ROT_X */
-				index= adrcode - OB_ROT_X;
-				
 				Mat4ToEul(ob->obmat, eul);
-				return eul[index]*(5.72958f);
+				return eul[array_index]*(5.72958f);
 			}
 		}
 	}
-	else if (blocktype == ID_PO) {
-		bPoseChannel *pchan;
+	else if (ptr->type == &RNA_PoseChannel) {
+		Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
+		bPoseChannel *pchan= (bPoseChannel *)ptr->data;
 		float tmat[4][4];
 		
-		/* get data to use */
-		pchan= get_pose_channel(ob->pose, actname);
-		
 		/* 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
@@ -672,29 +673,29 @@
 		constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
 		
 		/* Loc, Rot/Quat keyframes are supported... */
-		if (ELEM3(adrcode, AC_LOC_X, AC_LOC_Y, AC_LOC_Z)) {
-			/* assumes that AC_LOC_Z > AC_LOC_Y > AC_LOC_X */
-			index= adrcode - AC_LOC_X;
-			
+		if (strstr(identifier, "location")) {
 			/* only use for non-connected bones */
 			if ((pchan->bone->parent) && !(pchan->bone->flag & BONE_CONNECTED))
-				return tmat[3][index];
+				return tmat[3][array_index];
 			else if (pchan->bone->parent == NULL)
-				return tmat[3][index];
+				return tmat[3][array_index];
 		}
-		else if (ELEM4(adrcode, AC_QUAT_W, AC_QUAT_X, AC_QUAT_Y, AC_QUAT_Z)) {
+		else if (strstr(identifier, "euler_rotation")) {
+			float eul[3];
+			
+			/* euler-rotation test before standard rotation, as standard rotation does quats */
+			Mat4ToEul(tmat, eul);
+			return eul[array_index];
+		}
+		else if (strstr(identifier, "rotation")) {
 			float trimat[3][3], quat[4];
 			
-			/* assumes that AC_QUAT_Z > AC_QUAT_Y > AC_QUAT_X > AC_QUAT_W */
-			index= adrcode - AC_QUAT_W;
-			
 			Mat3CpyMat4(trimat, tmat);
 			Mat3ToQuat_is_ok(trimat, quat);
 			
-			return quat[index];
+			return quat[array_index];
 		}
 	}
-#endif	// XXX old animation system
 	
 	/* as the function hasn't returned yet, read value from system in the default way */
 	return setting_get_rna_value(ptr, prop, array_index);

Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c	2009-02-17 09:34:21 UTC (rev 19003)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c	2009-02-17 10:58:40 UTC (rev 19004)
@@ -4212,10 +4212,15 @@
 		short flag= 0;
 		char buf[512];
 		
+		/* flag is initialised from UserPref keyframing settings 
+		 *	- special exception for targetless IK - INSERTKEY_MATRIX keyframes should get
+		 * 	  visual keyframes even if flag not set, as it's not that useful otherwise
+		 *	  (for quick animation recording)
+		 */
+		if (IS_AUTOKEY_FLAG(AUTOMATKEY) || (targetless_ik))
+			flag |= INSERTKEY_MATRIX;
 		if (IS_AUTOKEY_FLAG(INSERTNEEDED))
 			flag |= INSERTKEY_NEEDED;
-		if (IS_AUTOKEY_FLAG(AUTOMATKEY))
-			flag |= INSERTKEY_MATRIX;
 		
 		for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
 			if (pchan->bone->flag & BONE_TRANSFORM) {

Modified: branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c	2009-02-17 09:34:21 UTC (rev 19003)
+++ branches/blender2.5/blender/source/blender/editors/transform/transform_generics.c	2009-02-17 10:58:40 UTC (rev 19004)
@@ -568,7 +568,7 @@
 		// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
 		// TODO: maybe the ob->adt check isn't really needed? makes it too difficult to use...
 		if (/*(ob->adt) && */(t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
-			short targetless_ik= (t->flag & T_AUTOIK);
+			short targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
 			autokeyframe_pose_cb_func(t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
 		}
 		





More information about the Bf-blender-cvs mailing list