From f041d2f1163c36d9831b223d61e5740f43c00a13 Mon Sep 17 00:00:00 2001 From: Demeter Dzadik Date: Wed, 21 Aug 2019 09:59:11 +0200 Subject: Fix T65671: Armature X-Mirror inconsistencies This fixes bendy bone properties not being mirrored correctly Reviewed By: Brecht Differential Revision: http://developer.blender.org/D5408 --- source/blender/editors/armature/armature_utils.c | 42 ++++++++++++++++-------- 1 file changed, 29 insertions(+), 13 deletions(-) (limited to 'source/blender/editors/armature/armature_utils.c') diff --git a/source/blender/editors/armature/armature_utils.c b/source/blender/editors/armature/armature_utils.c index d8777b7e0b7..63b55a3f1b8 100644 --- a/source/blender/editors/armature/armature_utils.c +++ b/source/blender/editors/armature/armature_utils.c @@ -381,23 +381,33 @@ void armature_tag_unselect(bArmature *arm) void ED_armature_ebone_transform_mirror_update(bArmature *arm, EditBone *ebo, bool check_select) { + /* TODO When this function is called by property updates, cancelling the value change will not restore mirrored bone correctly. */ + /* Currently check_select==true when this function is called from a transform operator, eg. from 3d viewport. */ /* no layer check, correct mirror is more important */ if (!check_select || ebo->flag & (BONE_TIPSEL | BONE_ROOTSEL)) { EditBone *eboflip = ED_armature_ebone_get_mirrored(arm->edbo, ebo); if (eboflip) { - /* we assume X-axis flipping for now */ - if (check_select && ebo->flag & BONE_TIPSEL) { - EditBone *children; + /* We assume X-axis flipping for now. */ + + /* Always mirror roll, since it can be changed by moving either head or tail. */ + eboflip->roll = -ebo->roll; + + if (!check_select || ebo->flag & BONE_TIPSEL) { + /* Mirror tail properties. */ eboflip->tail[0] = -ebo->tail[0]; eboflip->tail[1] = ebo->tail[1]; eboflip->tail[2] = ebo->tail[2]; eboflip->rad_tail = ebo->rad_tail; - eboflip->roll = -ebo->roll; eboflip->curve_out_x = -ebo->curve_out_x; + eboflip->curve_out_y = ebo->curve_out_y; + eboflip->scale_out_x = ebo->scale_out_x; + eboflip->scale_out_y = ebo->scale_out_y; + eboflip->ease2 = ebo->ease2; eboflip->roll2 = -ebo->roll2; - /* Also move connected children, in case children's name aren't mirrored properly */ + /* Also move connected children, in case children's name aren't mirrored properly. */ + EditBone *children; for (children = arm->edbo->first; children; children = children->next) { if (children->parent == eboflip && children->flag & BONE_CONNECTED) { copy_v3_v3(children->head, eboflip->tail); @@ -405,32 +415,38 @@ void ED_armature_ebone_transform_mirror_update(bArmature *arm, EditBone *ebo, bo } } } + if (!check_select || ebo->flag & BONE_ROOTSEL) { + /* Mirror head properties. */ eboflip->head[0] = -ebo->head[0]; eboflip->head[1] = ebo->head[1]; eboflip->head[2] = ebo->head[2]; eboflip->rad_head = ebo->rad_head; - eboflip->roll = -ebo->roll; + eboflip->curve_in_x = -ebo->curve_in_x; + eboflip->curve_in_y = ebo->curve_in_y; + eboflip->scale_in_x = ebo->scale_in_x; + eboflip->scale_in_y = ebo->scale_in_y; + eboflip->ease1 = ebo->ease1; eboflip->roll1 = -ebo->roll1; - /* Also move connected parent, in case parent's name isn't mirrored properly */ + /* Also move connected parent, in case parent's name isn't mirrored properly. */ if (eboflip->parent && eboflip->flag & BONE_CONNECTED) { EditBone *parent = eboflip->parent; copy_v3_v3(parent->tail, eboflip->head); parent->rad_tail = ebo->rad_head; } } + if (!check_select || ebo->flag & BONE_SELECTED) { + /* Mirror bone body properties (both head and tail are selected). */ + /* TODO: These values can also be changed from pose mode, so only mirroring them in edit mode is not ideal. */ eboflip->dist = ebo->dist; - eboflip->roll = -ebo->roll; + eboflip->weight = ebo->weight; + + eboflip->segments = ebo->segments; eboflip->xwidth = ebo->xwidth; eboflip->zwidth = ebo->zwidth; - - eboflip->curve_in_x = -ebo->curve_in_x; - eboflip->curve_out_x = -ebo->curve_out_x; - eboflip->roll1 = -ebo->roll1; - eboflip->roll2 = -ebo->roll2; } } } -- cgit v1.2.3