Fix T60807: Can't select when active pose object is hidden

Object mode locking wasn't accounting for the 3D view context
which doesn't have an active object once its hidden.
This commit is contained in:
Campbell Barton 2019-01-24 23:06:29 +11:00
parent 4162b83590
commit 7b35ef23a0
Notes: blender-bot 2023-02-14 03:58:35 +01:00
Referenced by issue #60820, Render artifacts; NoAA or 5, 11 Samples viewport render
Referenced by issue #60807, Can't select things after hiding rig which has been in pose mode
2 changed files with 10 additions and 6 deletions

View File

@ -1585,11 +1585,15 @@ static bool ed_object_select_pick(
bool extend, bool deselect, bool toggle, bool obcenter, bool enumerate, bool object)
{
ViewContext vc;
/* setup view context for argument to callbacks */
ED_view3d_viewcontext_init(C, &vc);
ARegion *ar = CTX_wm_region(C);
Scene *scene = CTX_data_scene(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
View3D *v3d = CTX_wm_view3d(C);
const Base *oldbasact = BASACT(view_layer);
/* Don't set when the context has no active object (hidden), see: T60807. */
const Base *oldbasact = vc.obact ? BASACT(view_layer) : NULL;
Base *base, *startbase = NULL, *basact = NULL;
const eObjectMode object_mode = oldbasact ? oldbasact->object->mode : OB_MODE_OBJECT;
bool is_obedit;
@ -1598,8 +1602,6 @@ static bool ed_object_select_pick(
int hits;
const float mval_fl[2] = {(float)mval[0], (float)mval[1]};
/* setup view context for argument to callbacks */
ED_view3d_viewcontext_init(C, &vc);
is_obedit = (vc.obedit != NULL);
if (object) {
@ -1820,7 +1822,7 @@ static bool ed_object_select_pick(
}
/* Ensure code above doesn't change the active base. */
BLI_assert(oldbasact == BASACT(view_layer));
BLI_assert(oldbasact == (vc.obact ? BASACT(view_layer) : NULL));
/* so, do we have something selected? */
if (basact) {

View File

@ -984,6 +984,8 @@ int view3d_opengl_select(
}
}
/* Important to use 'vc->obact', not 'OBACT(vc->view_layer)' below,
* so it will be NULL when hidden. */
struct {
DRW_ObjectFilterFn fn;
void *user_data;
@ -991,7 +993,7 @@ int view3d_opengl_select(
switch (select_filter) {
case VIEW3D_SELECT_FILTER_OBJECT_MODE_LOCK:
{
Object *obact = OBACT(vc->view_layer);
Object *obact = vc->obact;
if (obact && obact->mode != OB_MODE_OBJECT) {
object_filter.fn = drw_select_filter_object_mode_lock;
object_filter.user_data = obact;
@ -1000,7 +1002,7 @@ int view3d_opengl_select(
}
case VIEW3D_SELECT_FILTER_WPAINT_POSE_MODE_LOCK:
{
Object *obact = OBACT(vc->view_layer);
Object *obact = vc->obact;
BLI_assert(obact && (obact->mode & OB_MODE_WEIGHT_PAINT));
Object *ob_pose = BKE_object_pose_armature_get(obact);