diff options
author | Joshua Leung <aligorith@gmail.com> | 2011-02-07 14:38:57 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2011-02-07 14:38:57 +0300 |
commit | fd422e58a890f827c03609fda6308040e5b48b7a (patch) | |
tree | 509d2f4ffc0e3f38e32b507620ba249531bb8a53 /source | |
parent | cddaa815d6b46e900f2f475ceb1b379efeb6b8e4 (diff) |
Visual Keying Code Tweaks:
Moving this code to the same method as is used for Apply Visual
Transform (for bones case), which uses standardised decomposition
methods instead of the improvised ones used here before. This was in
an attempt to get IK chains Visual Keyed correctly, though this
doesn't seem to have improved the situation much.
Also, the decompositon for objects here now takes care of euler
rotation modes.
TODO: other rotation modes should get included here too...
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/animation/keyframing.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index d535481d154..8dc813d940b 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -642,10 +642,10 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_ if (strstr(identifier, "location")) { return ob->obmat[3][array_index]; } - else if (strstr(identifier, "rotation")) { + else if (strstr(identifier, "rotation_euler")) { float eul[3]; - mat4_to_eul( eul,ob->obmat); + mat4_to_eulO(eul, ob->rotmode, ob->obmat); return eul[array_index]; } } @@ -653,40 +653,37 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_ 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; - float tmat[4][4]; + bPoseChannel tchan; - /* 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. + /* 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 */ - copy_m4_m4(tmat, pchan->pose_mat); - constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL); + memcpy(&tchan, pchan, sizeof(bPoseChannel)); + pchan_apply_mat4(&tchan, pchan->chan_mat); /* 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 tmat[3][array_index]; + return tchan.loc[array_index]; else if (pchan->bone->parent == NULL) - return tmat[3][array_index]; + return tchan.loc[array_index]; } else if (strstr(identifier, "rotation_euler")) { - float eul[3]; - - /* euler-rotation test before standard rotation, as standard rotation does quats */ - mat4_to_eulO( eul, pchan->rotmode,tmat); - return eul[array_index]; + return tchan.eul[array_index]; } else if (strstr(identifier, "rotation_quaternion")) { - float trimat[3][3], quat[4]; - - copy_m3_m4(trimat, tmat); - mat3_to_quat_is_ok( quat,trimat); - - return quat[array_index]; + return tchan.quat[array_index]; + } + else if (strstr(identifier, "rotation_axisangle")) { + /* w = 0, x,y,z = 1,2,3 */ + if (array_index == 0) + return tchan.rotAngle; + else + return tchan.rotAxis[array_index - 1]; } - // TODO: axis-angle... } /* as the function hasn't returned yet, read value from system in the default way */ |