diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-10-11 17:31:56 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-10-17 12:59:48 +0300 |
commit | f45127c6cb34f1f44c7b34862127d8986bf72fe8 (patch) | |
tree | 655b6a34f5c8ed4242133b58bc85fd7d107ac58c /source/blender/blenkernel | |
parent | 5115759fdd8700ac973a8da10112ea2f56f3f8b5 (diff) |
Fix T70740: Clicking on proxy bone makes original one jump to initial location
Caused by what appears to be a missing flush from evaluated bone back to
original, which then makes it so copy-on-write operation happening after
click (to synchronize selection flags) pushes original bone to its initial
position.
Differential Revision: https://developer.blender.org/D6051
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/armature_update.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/armature_update.c b/source/blender/blenkernel/intern/armature_update.c index b6a2efb37b8..7c68c8319a5 100644 --- a/source/blender/blenkernel/intern/armature_update.c +++ b/source/blender/blenkernel/intern/armature_update.c @@ -728,6 +728,21 @@ void BKE_pose_constraints_evaluate(struct Depsgraph *depsgraph, } } +static void pose_channel_flush_to_orig_if_needed(struct Depsgraph *depsgraph, + struct Object *object, + bPoseChannel *pchan) +{ + if (!DEG_is_active(depsgraph)) { + return; + } + const bArmature *armature = (bArmature *)object->data; + if (armature->edbo != NULL) { + return; + } + bPoseChannel *pchan_orig = pchan->orig_pchan; + BKE_pose_copy_pchan_result(pchan_orig, pchan); +} + void BKE_pose_bone_done(struct Depsgraph *depsgraph, struct Object *object, int pchan_index) { const bArmature *armature = (bArmature *)object->data; @@ -745,13 +760,9 @@ void BKE_pose_bone_done(struct Depsgraph *depsgraph, struct Object *object, int mat4_to_dquat(&pchan->runtime.deform_dual_quat, pchan->bone->arm_mat, pchan->chan_mat); } } - if (DEG_is_active(depsgraph) && armature->edbo == NULL) { + pose_channel_flush_to_orig_if_needed(depsgraph, object, pchan); + if (DEG_is_active(depsgraph)) { bPoseChannel *pchan_orig = pchan->orig_pchan; - copy_m4_m4(pchan_orig->pose_mat, pchan->pose_mat); - copy_m4_m4(pchan_orig->chan_mat, pchan->chan_mat); - copy_v3_v3(pchan_orig->pose_head, pchan->pose_mat[3]); - copy_m4_m4(pchan_orig->constinv, pchan->constinv); - BKE_pose_where_is_bone_tail(pchan_orig); if (pchan->bone == NULL || pchan->bone->segments <= 1) { BKE_pose_channel_free_bbone_cache(&pchan_orig->runtime); } @@ -912,4 +923,6 @@ void BKE_pose_eval_proxy_copy_bone(struct Depsgraph *depsgraph, Object *object, BKE_pose_copy_pchan_result(pchan, pchan_from); copy_dq_dq(&pchan->runtime.deform_dual_quat, &pchan_from->runtime.deform_dual_quat); BKE_pchan_bbone_segments_cache_copy(pchan, pchan_from); + + pose_channel_flush_to_orig_if_needed(depsgraph, object, pchan); } |