[Bf-blender-cvs] [7b35ef23a04] master: Fix T60807: Can't select when active pose object is hidden

Campbell Barton noreply at git.blender.org
Thu Jan 24 13:23:52 CET 2019


Commit: 7b35ef23a0468525b17ee45cb474847a431c2f58
Author: Campbell Barton
Date:   Thu Jan 24 23:06:29 2019 +1100
Branches: master
https://developer.blender.org/rB7b35ef23a0468525b17ee45cb474847a431c2f58

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.

===================================================================

M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/space_view3d/view3d_view.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list