diff options
author | Campbell Barton <campbell@blender.org> | 2022-07-07 07:57:43 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-07-07 08:24:48 +0300 |
commit | 34c701abbdbfa6143c11e1b6f8d7797257c70237 (patch) | |
tree | 9544bea46f711d22a14ad0fe6ea1bba7d4f13109 /source/blender/blenkernel/intern/armature.c | |
parent | 3f657e7ef19a39d7dca64ed5fdee57336f445c62 (diff) |
Fix T99270: bones using empties as custom shapes can't be selected
Regression in [0] which didn't account for the bounds of empty objects.
Add support support calculating bounds from empty draw-type to use in
pose-bone culling.
[0]: 3267c91b4d5caab7da8aef071a446dd2e86f86a9
Diffstat (limited to 'source/blender/blenkernel/intern/armature.c')
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index dfe3d9cc310..622ecde6a91 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -2661,13 +2661,30 @@ BoundBox *BKE_armature_boundbox_get(Object *ob) return ob->runtime.bb; } -void BKE_pchan_minmax(const Object *ob, const bPoseChannel *pchan, float r_min[3], float r_max[3]) +void BKE_pchan_minmax(const Object *ob, + const bPoseChannel *pchan, + const bool use_empty_drawtype, + float r_min[3], + float r_max[3]) { const bArmature *arm = ob->data; const bPoseChannel *pchan_tx = (pchan->custom && pchan->custom_tx) ? pchan->custom_tx : pchan; - const BoundBox *bb_custom = ((pchan->custom) && !(arm->flag & ARM_NO_CUSTOM)) ? - BKE_object_boundbox_get(pchan->custom) : - NULL; + const BoundBox *bb_custom = NULL; + BoundBox bb_custom_buf; + + if ((pchan->custom) && !(arm->flag & ARM_NO_CUSTOM)) { + float min[3], max[3]; + if (use_empty_drawtype && (pchan->custom->type == OB_EMPTY) && + BKE_object_minmax_empty_drawtype(pchan->custom, min, max)) { + memset(&bb_custom_buf, 0x0, sizeof(bb_custom_buf)); + BKE_boundbox_init_from_minmax(&bb_custom_buf, min, max); + bb_custom = &bb_custom_buf; + } + else { + bb_custom = BKE_object_boundbox_get(pchan->custom); + } + } + if (bb_custom) { float mat[4][4], smat[4][4], rmat[4][4], tmp[4][4]; scale_m4_fl(smat, PCHAN_CUSTOM_BONE_LENGTH(pchan)); @@ -2704,7 +2721,7 @@ bool BKE_pose_minmax(Object *ob, float r_min[3], float r_max[3], bool use_hidden if (pchan->bone && (!((use_hidden == false) && (PBONE_VISIBLE(arm, pchan->bone) == false)) && !((use_select == true) && ((pchan->bone->flag & BONE_SELECTED) == 0)))) { - BKE_pchan_minmax(ob, pchan, r_min, r_max); + BKE_pchan_minmax(ob, pchan, false, r_min, r_max); changed = true; } } |