[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17218] branches/animsys2/source/blender/ src/poseobject.c: AnimSys2 - Copy/ Paste Poses now works with the new rotation options

Joshua Leung aligorith at gmail.com
Wed Oct 29 12:40:29 CET 2008


Revision: 17218
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17218
Author:   aligorith
Date:     2008-10-29 12:40:29 +0100 (Wed, 29 Oct 2008)

Log Message:
-----------
AnimSys2 - Copy/Paste Poses now works with the new rotation options

Modified Paths:
--------------
    branches/animsys2/source/blender/src/poseobject.c

Modified: branches/animsys2/source/blender/src/poseobject.c
===================================================================
--- branches/animsys2/source/blender/src/poseobject.c	2008-10-29 11:25:14 UTC (rev 17217)
+++ branches/animsys2/source/blender/src/poseobject.c	2008-10-29 11:40:29 UTC (rev 17218)
@@ -905,8 +905,8 @@
 {
 	Object *ob= OBACT;
 	bPoseChannel *chan, *pchan;
-	float eul[4];
 	char name[32];
+	short flag = 0;
 	
 	if (!ob || !ob->pose)
 		return;
@@ -922,6 +922,12 @@
 		return;
 	*/
 	
+	/* set flags for use when inserting keyframes */
+	if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+		flag |= INSERTKEY_NEEDED;
+	if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+		flag |= INSERTKEY_MATRIX;
+	
 	/* Safely merge all of the channels in this pose into
 	any existing pose */
 	for (chan=g_posebuf->chanbase.first; chan; chan=chan->next) {
@@ -936,18 +942,46 @@
 			if (pchan) {
 				/* only loc rot size */
 				/* only copies transform info for the pose */
+				pchan->flag= chan->flag;
 				VECCOPY(pchan->loc, chan->loc);
 				VECCOPY(pchan->size, chan->size);
-				QUATCOPY(pchan->quat, chan->quat);
-				pchan->flag= chan->flag;
 				
+				/* check if rotation modes are compatible (i.e. do they need any conversions) */
+				if (pchan->rotmode == chan->rotmode) {
+					/* copy the type of rotation in use */
+					if (pchan->rotmode) {
+						VECCOPY(pchan->eul, chan->eul);
+					}
+					else {
+						QUATCOPY(pchan->quat, chan->quat);
+					}
+				}
+				else if (pchan->rotmode) {
+					/* quat to euler */
+					QuatToEul(chan->quat, pchan->eul);
+				}
+				else {
+					/* euler to quat */
+					EulToQuat(chan->eul, pchan->quat);
+				}
+				
+				/* paste flipped pose? */
 				if (flip) {
 					pchan->loc[0]*= -1;
 					
-					QuatToEul(pchan->quat, eul);
-					eul[1]*= -1;
-					eul[2]*= -1;
-					EulToQuat(eul, pchan->quat);
+					/* has to be done as eulers... */
+					if (pchan->rotmode) {
+						pchan->eul[1] *= -1;
+						pchan->eul[2] *= -1;
+					}
+					else {
+						float eul[3];
+						
+						QuatToEul(pchan->quat, eul);
+						eul[1]*= -1;
+						eul[2]*= -1;
+						EulToQuat(eul, pchan->quat);
+					}
 				}
 				
 				if (autokeyframe_cfra_can_key(ob)) {
@@ -955,30 +989,38 @@
 					
 					/* Set keys on pose */
 					if (chan->flag & POSE_ROT) {
-						insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
+						if (pchan->rotmode) {
+							insertkey(id, ID_PO, pchan->name, NULL, AC_EUL_X, flag);
+							insertkey(id, ID_PO, pchan->name, NULL, AC_EUL_Y, flag);
+							insertkey(id, ID_PO, pchan->name, NULL, AC_EUL_Z, flag);
+
+						}
+						else {
+							insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, flag);
+							insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, flag);
+							insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, flag);
+							insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, flag);
+						}
 					}
 					if (chan->flag & POSE_SIZE) {
-						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, flag);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, flag);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, flag);
 					}
 					if (chan->flag & POSE_LOC) {
-						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
-						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, flag);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, flag);
+						insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, flag);
 					}
 					
 					/* clear any unkeyed tags */
-					if (chan->bone)
-						chan->bone->flag &= ~BONE_UNKEYED;
+					if (pchan->bone)
+						pchan->bone->flag &= ~BONE_UNKEYED;
 				}
 				else {
 					/* add unkeyed tags */
-					if (chan->bone)
-						chan->bone->flag |= BONE_UNKEYED;
+					if (pchan->bone)
+						pchan->bone->flag |= BONE_UNKEYED;
 				}
 			}
 		}





More information about the Bf-blender-cvs mailing list