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:
-rw-r--r--source/blender/blenkernel/BKE_armature.h2
-rw-r--r--source/blender/blenkernel/intern/armature.c17
-rw-r--r--source/blender/blenkernel/intern/constraint.c3
-rw-r--r--source/blender/makesrna/intern/rna_pose.c10
4 files changed, 22 insertions, 10 deletions
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 11ab981822e..07d8d69f44e 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -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]);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 64ea862477f..02b9330d588 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -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)
{
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 571c6c631a9..59667743520 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -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]);
}
}
}
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index 0315352f2c8..9ed3f8f186f 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -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 */
}