diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-01 09:59:50 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-01 09:59:50 +0400 |
commit | a834007a9b9b7adca2e57bf6ff575524bee80804 (patch) | |
tree | 527913e721ecee8b87095ebbf29ebeb2b099018d /source | |
parent | 7836069775a688cceb40d3892d84886e80c437fd (diff) |
Previous fix for [#29484] wasn't working right (did work in report file though).
this now shares code with RNA's 'pchan.matrix = matrix'
tested with parent scale/rot/translation
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_armature.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 17 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_pose.c | 10 |
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 */ } |