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:
authorCampbell Barton <ideasman42@gmail.com>2019-11-28 21:05:22 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-11-28 21:15:18 +0300
commit9325e5d593ecdfc69ef6d4e129f2fbcae633af43 (patch)
treec6322312e3be4388126a08e3df94f4086c692146 /source/blender/blenkernel/intern/armature.c
parent4e42a98edd8ca259c9b13c5548a62b46f0261d60 (diff)
Fix T71990: Apply bone transform results differ in edit/object mode
When negative scaled matrices were used, the roll calculation didn't match, when calling Armature.transform().
Diffstat (limited to 'source/blender/blenkernel/intern/armature.c')
-rw-r--r--source/blender/blenkernel/intern/armature.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 58b0c9b41ea..7d10bce60ef 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -281,22 +281,16 @@ static void armature_transform_recurse(ListBase *bonebase,
{
for (Bone *bone = bonebase->first; bone; bone = bone->next) {
- /* Transform the bone's roll. */
- if (bone_parent == NULL) {
-
- float roll_mat[3][3];
- {
- float delta[3];
- sub_v3_v3v3(delta, bone->tail, bone->head);
- vec_roll_to_mat3(delta, bone->roll, roll_mat);
+ float roll_mat3_pre[3][3];
+ {
+ float delta[3];
+ sub_v3_v3v3(delta, bone->tail, bone->head);
+ vec_roll_to_mat3(delta, bone->roll, roll_mat3_pre);
+ if (bone->parent == NULL) {
+ mul_m3_m3m3(roll_mat3_pre, mat3, roll_mat3_pre);
}
-
- /* Transform the roll matrix. */
- mul_m3_m3m3(roll_mat, mat3, roll_mat);
-
- /* Apply the transformed roll back. */
- mat3_to_vec_roll(roll_mat, NULL, &bone->roll);
}
+ bone->roll = 0.0f;
mul_m4_v3(mat, bone->arm_head);
mul_m4_v3(mat, bone->arm_tail);
@@ -314,6 +308,20 @@ static void armature_transform_recurse(ListBase *bonebase,
copy_v3_v3(bone->tail, bone->arm_tail);
}
+ {
+ float roll_mat3_post[3][3];
+ float delta_mat3[3][3];
+ float delta[3];
+ sub_v3_v3v3(delta, bone->tail, bone->head);
+ vec_roll_to_mat3(delta, bone->roll, roll_mat3_post);
+ normalize_v3(delta);
+
+ invert_m3(roll_mat3_post);
+ mul_m3_m3m3(delta_mat3, roll_mat3_post, roll_mat3_pre);
+
+ bone->roll = atan2f(delta_mat3[2][0], delta_mat3[2][2]);
+ }
+
BKE_armature_where_is_bone(bone, bone_parent, false);
{