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:
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
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue