[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