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...
This commit is contained in:
Joshua Leung 2011-02-07 11:38:57 +00:00
parent cddaa815d6
commit fd422e58a8

@ -642,10 +642,10 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
if (strstr(identifier, "location")) { if (strstr(identifier, "location")) {
return ob->obmat[3][array_index]; return ob->obmat[3][array_index];
} }
else if (strstr(identifier, "rotation")) { else if (strstr(identifier, "rotation_euler")) {
float eul[3]; float eul[3];
mat4_to_eul( eul,ob->obmat); mat4_to_eulO(eul, ob->rotmode, ob->obmat);
return eul[array_index]; 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) { else if (ptr->type == &RNA_PoseBone) {
Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */ Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
bPoseChannel *pchan= (bPoseChannel *)ptr->data; bPoseChannel *pchan= (bPoseChannel *)ptr->data;
float tmat[4][4]; bPoseChannel tchan;
/* Although it is not strictly required for this particular space conversion, /* make a copy of pchan so that we can apply and decompose its chan_mat, thus getting the
* arg1 must not be null, as there is a null check for the other conversions to * rest-pose to pose-mode transform that got stored there at the end of posing calculations
* be safe. Therefore, the active object is passed here, and in many cases, this * for B-Bone deforms to use
* will be what owns the pose-channel that is getting this anyway. * - 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); memcpy(&tchan, pchan, sizeof(bPoseChannel));
constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL); pchan_apply_mat4(&tchan, pchan->chan_mat);
/* Loc, Rot/Quat keyframes are supported... */ /* Loc, Rot/Quat keyframes are supported... */
if (strstr(identifier, "location")) { if (strstr(identifier, "location")) {
/* only use for non-connected bones */ /* only use for non-connected bones */
if ((pchan->bone->parent) && !(pchan->bone->flag & BONE_CONNECTED)) 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) else if (pchan->bone->parent == NULL)
return tmat[3][array_index]; return tchan.loc[array_index];
} }
else if (strstr(identifier, "rotation_euler")) { else if (strstr(identifier, "rotation_euler")) {
float eul[3]; return tchan.eul[array_index];
/* euler-rotation test before standard rotation, as standard rotation does quats */
mat4_to_eulO( eul, pchan->rotmode,tmat);
return eul[array_index];
} }
else if (strstr(identifier, "rotation_quaternion")) { else if (strstr(identifier, "rotation_quaternion")) {
float trimat[3][3], quat[4]; return tchan.quat[array_index];
}
copy_m3_m4(trimat, tmat); else if (strstr(identifier, "rotation_axisangle")) {
mat3_to_quat_is_ok( quat,trimat); /* w = 0, x,y,z = 1,2,3 */
if (array_index == 0)
return quat[array_index]; 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 */ /* as the function hasn't returned yet, read value from system in the default way */