Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2008-10-29 14:40:29 +0300
committerJoshua Leung <aligorith@gmail.com>2008-10-29 14:40:29 +0300
commit5e71d21b3a22f772d39a77ffdd3c0cd5df268986 (patch)
treee476829e6ab2d8da131d84d0334215891fde7a5d
parentc608a1542011d80a27f78447823c4067a81e3be9 (diff)
AnimSys2 - Copy/Paste Poses now works with the new rotation options
-rw-r--r--source/blender/src/poseobject.c84
1 files changed, 63 insertions, 21 deletions
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 9327d592da6..72c678bc446 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -905,8 +905,8 @@ void paste_posebuf (int flip)
{
Object *ob= OBACT;
bPoseChannel *chan, *pchan;
- float eul[4];
char name[32];
+ short flag = 0;
if (!ob || !ob->pose)
return;
@@ -922,6 +922,12 @@ void paste_posebuf (int flip)
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 @@ void paste_posebuf (int flip)
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 @@ void paste_posebuf (int flip)
/* 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;
}
}
}