[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26455] trunk/blender/source/blender/ blenkernel/intern/fcurve.c: Bugfix #20870: Local rotation drivers behave weird
Joshua Leung
aligorith at gmail.com
Sat Jan 30 22:21:40 CET 2010
Revision: 26455
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26455
Author: aligorith
Date: 2010-01-30 22:21:36 +0100 (Sat, 30 Jan 2010)
Log Message:
-----------
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.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/fcurve.c
Modified: trunk/blender/source/blender/blenkernel/intern/fcurve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/fcurve.c 2010-01-30 21:11:46 UTC (rev 26454)
+++ trunk/blender/source/blender/blenkernel/intern/fcurve.c 2010-01-30 21:21:36 UTC (rev 26455)
@@ -1010,7 +1010,8 @@
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 @@
/* 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 @@
}
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 @@
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 {
More information about the Bf-blender-cvs
mailing list