Fix T99364: Unable to select bones when custom shape display is disabled

Regression in [0] which revealed an error in [1].
Logic for pose channel custom transform ignored ARM_NO_CUSTOM.

[0]: 3267c91b4d
[1]: c3fef001ee
This commit is contained in:
Campbell Barton 2022-07-08 11:09:47 +10:00
parent 03173d63c0
commit b98a937db6
Notes: blender-bot 2023-02-14 08:38:14 +01:00
Referenced by issue #99364, Regression: Unable to select bones with custom shape and custom shape transform override, while shape display is turned off
Referenced by issue #98661, 3.2: Potential candidates for corrective releases
2 changed files with 16 additions and 9 deletions

View File

@ -2668,20 +2668,21 @@ void BKE_pchan_minmax(const Object *ob,
float r_max[3])
{
const bArmature *arm = ob->data;
const bPoseChannel *pchan_tx = (pchan->custom && pchan->custom_tx) ? pchan->custom_tx : pchan;
Object *ob_custom = (arm->flag & ARM_NO_CUSTOM) ? NULL : pchan->custom;
const bPoseChannel *pchan_tx = (ob_custom && pchan->custom_tx) ? pchan->custom_tx : pchan;
const BoundBox *bb_custom = NULL;
BoundBox bb_custom_buf;
if ((pchan->custom) && !(arm->flag & ARM_NO_CUSTOM)) {
if (ob_custom) {
float min[3], max[3];
if (use_empty_drawtype && (pchan->custom->type == OB_EMPTY) &&
BKE_object_minmax_empty_drawtype(pchan->custom, min, max)) {
if (use_empty_drawtype && (ob_custom->type == OB_EMPTY) &&
BKE_object_minmax_empty_drawtype(ob_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);
bb_custom = BKE_object_boundbox_get(ob_custom);
}
}

View File

@ -251,12 +251,18 @@ typedef struct bPoseChannel {
/** Motion path cache for this bone. */
bMotionPath *mpath;
/** Draws custom object instead of default bone shape. */
/**
* Draws custom object instead of default bone shape.
*
* \note For the purpose of user interaction (selection, display etc),
* it's important this value is treated as NULL when #ARM_NO_CUSTOM is set.
*/
struct Object *custom;
/**
* Odd feature, display with another bones transform.
* needed in rare cases for advanced rigs,
* since the alternative is highly complicated - campbell
* This is a specific feature to display with another bones transform.
* Needed in rare cases for advanced rigs, since alternative solutions are highly complicated.
*
* \note This depends #bPoseChannel.custom being set and the #ARM_NO_CUSTOM flag being unset.
*/
struct bPoseChannel *custom_tx;
float custom_scale; /* Deprecated */