diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-07-18 11:45:56 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-07-18 12:12:09 +0300 |
commit | c6c9e168e272a0fe31b9a6f8704adb067fb9f88f (patch) | |
tree | a34bc4047ed2de935b58616f305c60ffaa152a27 /source/blender/blenkernel/intern/action.c | |
parent | 20c725ed62f86aebf555221731c8e7b7dbd05120 (diff) |
Fix T58447: Unselected bone used for constraint target
Diffstat (limited to 'source/blender/blenkernel/intern/action.c')
-rw-r--r-- | source/blender/blenkernel/intern/action.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 3e3a533275b..a7159f85dc2 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -43,6 +43,7 @@ #include "BLT_translation.h" #include "BKE_action.h" +#include "BKE_armature.h" #include "BKE_anim.h" #include "BKE_animsys.h" #include "BKE_constraint.h" @@ -525,6 +526,38 @@ bPoseChannel *BKE_pose_channel_active(Object *ob) } /** + * Use this when detecting the "other selected bone", + * when we have multiple armatures in pose mode. + * + * In this case the active-selected is an obvious choice when finding the target for a + * constraint for eg. however from the users perspective the active pose bone of the + * active object is the _real_ active bone, so any other non-active selected bone + * is a candidate for being the other selected bone, see: T58447. + */ +bPoseChannel *BKE_pose_channel_active_or_first_selected(struct Object *ob) +{ + bArmature *arm = (ob) ? ob->data : NULL; + + if (ELEM(NULL, ob, ob->pose, arm)) { + return NULL; + } + + bPoseChannel *pchan = BKE_pose_channel_active(ob); + if (pchan && (pchan->bone->flag & BONE_SELECTED) && PBONE_VISIBLE(arm, pchan->bone)) { + return pchan; + } + + for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) { + if (pchan->bone != NULL) { + if ((pchan->bone->flag & BONE_SELECTED) && PBONE_VISIBLE(arm, pchan->bone)) { + return pchan; + } + } + } + return NULL; +} + +/** * \see #ED_armature_ebone_get_mirrored (edit-mode, matching function) */ bPoseChannel *BKE_pose_channel_get_mirrored(const bPose *pose, const char *name) |