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>2010-01-31 00:21:36 +0300
committerJoshua Leung <aligorith@gmail.com>2010-01-31 00:21:36 +0300
commit515ecc0f97c099cf866622cf4b3788aa31bf0fcc (patch)
tree9748a3a013a4e8699cdc38cec2e9061b3592e85f /source/blender/blenkernel/intern/fcurve.c
parent96daa3348d2ab3bdcc0fbbd3fa685eefe1d01067 (diff)
Bugfix #20870: Local rotation drivers behave weird
Use euler rotations for local rotation drivers if the object/bone uses euler rotations. Otherwise, fall back to matrix-based conversions again.
Diffstat (limited to 'source/blender/blenkernel/intern/fcurve.c')
-rw-r--r--source/blender/blenkernel/intern/fcurve.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 2084dc7ede7..ee84b8e010c 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1010,7 +1010,8 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
Object *ob= (Object *)dtar->id;
bPoseChannel *pchan;
float mat[4][4];
- short rotOrder = 0;
+ float eul[3] = {0.0f,0.0f,0.0f};
+ short useEulers=0, rotOrder=ROT_MODE_EUL;
/* check if this target has valid data */
if ((ob == NULL) || (GS(dtar->id->name) != ID_OB)) {
@@ -1025,7 +1026,11 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
/* check if object or bone, and get transform matrix accordingly */
if (pchan) {
/* bone */
- rotOrder= (pchan->rotmode > 0) ? pchan->rotmode : ROT_MODE_EUL;
+ if (pchan->rotmode > 0) {
+ VECCOPY(eul, pchan->eul);
+ rotOrder= pchan->rotmode;
+ useEulers = 1;
+ }
if (dtar->flag & DTAR_FLAG_LOCALSPACE)
copy_m4_m4(mat, pchan->chan_mat);
@@ -1034,7 +1039,11 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
}
else {
/* object */
- rotOrder= (ob->rotmode > 0) ? ob->rotmode : ROT_MODE_EUL;
+ if (ob->rotmode > 0) {
+ VECCOPY(eul, ob->rot);
+ rotOrder= ob->rotmode;
+ useEulers = 1;
+ }
if (dtar->flag & DTAR_FLAG_LOCALSPACE)
object_to_mat4(ob, mat);
@@ -1055,10 +1064,10 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
return scale[dtar->transChan - DTAR_TRANSCHAN_SCALEX];
}
else if (dtar->transChan >= DTAR_TRANSCHAN_ROTX) {
- /* extract euler rotation, and choose the right axis */
- float eul[3];
+ /* extract euler rotation (if needed), and choose the right axis */
+ if ((dtar->flag & DTAR_FLAG_LOCALSPACE)==0 || (useEulers == 0))
+ mat4_to_eulO(eul, rotOrder, mat);
- mat4_to_eulO(eul, rotOrder, mat);
return eul[dtar->transChan - DTAR_TRANSCHAN_ROTX];
}
else {