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 {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to