Visual Keying Code Tweaks:
[blender-staging.git] / source / blender / editors / animation / keyframing.c
index d535481d15405f36b343fc99da6c681b1e99e2c7..8dc813d940b023723d8bbdd3e072bd2329057029 100644 (file)
@@ -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];
                        }
                        if (strstr(identifier, "location")) {
                                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) {
                Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
                bPoseChannel *pchan= (bPoseChannel *)ptr->data;
        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))
                
                /* 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)
                        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];
-                       
-                       /* 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")) {
                }
                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 */
        }
        
        /* as the function hasn't returned yet, read value from system in the default way */