From 7b35ef23a0468525b17ee45cb474847a431c2f58 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 24 Jan 2019 23:06:29 +1100 Subject: 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. --- source/blender/editors/space_view3d/view3d_select.c | 10 ++++++---- source/blender/editors/space_view3d/view3d_view.c | 6 ++++-- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 8f7882d1d59..b36f52899b8 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -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) { diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index 9abc0d4f553..1ebf344a46d 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -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); -- cgit v1.2.3