Previous fix for [#29484] wasn't working right (did work in report file though).
authorCampbell Barton <ideasman42@gmail.com>
Wed, 1 Feb 2012 05:59:50 +0000 (05:59 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 1 Feb 2012 05:59:50 +0000 (05:59 +0000)
this now shares code with RNA's 'pchan.matrix = matrix'

tested with parent scale/rot/translation

source/blender/blenkernel/BKE_armature.h
source/blender/blenkernel/intern/armature.c
source/blender/blenkernel/intern/constraint.c
source/blender/makesrna/intern/rna_pose.c

index 11ab981822e443e34ac978affb874006f73f5561..07d8d69f44ef35aaa33eb671ec107c0ee57861e6 100644 (file)
@@ -109,6 +109,8 @@ void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], flo
 void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
 
+void armature_mat_pose_to_bone_ex(struct Object *ob, struct bPoseChannel *pchan, float inmat[][4], float outmat[][4]);
+
 void pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[][3], short use_compat);
 void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4], short use_comat);
 void pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]);
index 64ea862477f595828dea59bfe45dcfc28db194c6..02b9330d5882ed451727864b97f8ed48db90c45a 100644 (file)
@@ -1319,6 +1319,23 @@ void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
        copy_v3_v3(outloc, nLocMat[3]);
 }
 
+void armature_mat_pose_to_bone_ex(Object *ob, bPoseChannel *pchan, float inmat[][4], float outmat[][4])
+{
+       bPoseChannel work_pchan = *pchan;
+
+       /* recalculate pose matrix with only parent transformations,
+        * bone loc/sca/rot is ignored, scene and frame are not used. */
+       where_is_pose_bone(NULL, ob, &work_pchan, 0.0f, FALSE);
+
+       /* find the matrix, need to remove the bone transforms first so this is
+        * calculated as a matrix to set rather then a difference ontop of whats
+        * already there. */
+       unit_m4(outmat);
+       pchan_apply_mat4(&work_pchan, outmat, FALSE);
+
+       armature_mat_pose_to_bone(&work_pchan, inmat, outmat);
+}
+
 /* same as object_mat3_to_rot() */
 void pchan_mat3_to_rot(bPoseChannel *pchan, float mat[][3], short use_compat)
 {
index 571c6c631a9f4b2688d190cfd3f6d2e20a598fe8..596677435205518851e60bcc5ccad813e224befa 100644 (file)
@@ -302,7 +302,8 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
 
                                                /* override with local location */
                                                if ((pchan->parent) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION)) {
-                                                       sub_v3_v3v3(mat[3], tempmat[3], pchan->bone->arm_mat[3]);
+                                                       armature_mat_pose_to_bone_ex(ob, pchan, pchan->pose_mat, tempmat);
+                                                       copy_v3_v3(mat[3], tempmat[3]);
                                                }
                                        }
                                }
index 0315352f2c8283f04daf3cb281ead88ddce6657d..9ed3f8f186f2dd9c5835a8b43d53acf58779a451 100644 (file)
@@ -613,18 +613,10 @@ static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values)
 {
        bPoseChannel *pchan= (bPoseChannel*)ptr->data;
        Object *ob= (Object*)ptr->id.data;
-       float umat[4][4]= MAT4_UNITY;
        float tmat[4][4];
 
-       /* recalculate pose matrix with only parent transformations,
-        * bone loc/sca/rot is ignored, scene and frame are not used. */
-       where_is_pose_bone(NULL, ob, pchan, 0.0f, FALSE);
+       armature_mat_pose_to_bone_ex(ob, pchan, (float (*)[4])values, tmat);
 
-       /* find the matrix, need to remove the bone transforms first so this is
-        * calculated as a matrix to set rather then a difference ontop of whats
-        * already there. */
-       pchan_apply_mat4(pchan, umat, FALSE);
-       armature_mat_pose_to_bone(pchan, (float (*)[4])values, tmat);
        pchan_apply_mat4(pchan, tmat, FALSE); /* no compat for predictable result */
 }