[Bf-blender-cvs] [9d037153f70] blender2.8: Object Modes: disable mode switching on selection

Campbell Barton noreply at git.blender.org
Tue May 29 15:47:51 CEST 2018


Commit: 9d037153f70c9bcc665fffa4971d1517044dbf29
Author: Campbell Barton
Date:   Tue May 29 15:43:53 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB9d037153f70c9bcc665fffa4971d1517044dbf29

Object Modes: disable mode switching on selection

See T55246

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/editors/space_view3d/view3d_select.c

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index f71a15f511f..a7cdef06268 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -83,6 +83,7 @@ bool BKE_object_is_in_editmode(const struct Object *ob);
 bool BKE_object_is_in_editmode_vgroup(const struct Object *ob);
 bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob);
 bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode);
+bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode);
 
 typedef enum eObjectVisibilityCheck {
 	OB_VISIBILITY_CHECK_FOR_VIEWPORT,
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 1b6916a2d55..02e0d46e5c1 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -550,6 +550,12 @@ bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode)
 	return false;
 }
 
+bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode)
+{
+	return ((ob->mode == object_mode) ||
+	        (ob->mode & object_mode) != 0);
+}
+
 /**
  * Return if the object is visible, as evaluated by depsgraph
  */
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 652fdd4b449..16b3cb7b28f 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -426,16 +426,18 @@ static void do_lasso_select_objects(
 
 	for (base = vc->view_layer->object_bases.first; base; base = base->next) {
 		if (BASE_SELECTABLE(base)) { /* use this to avoid un-needed lasso lookups */
-			if (ED_view3d_project_base(vc->ar, base) == V3D_PROJ_RET_OK) {
+			if (
+#ifdef USE_OBJECT_MODE_STRICT
+			    (is_pose_mode == false) &&
+#endif
+			    ED_view3d_project_base(vc->ar, base) == V3D_PROJ_RET_OK)
+			{
 				if (BLI_lasso_is_point_inside(mcords, moves, base->sx, base->sy, IS_CLIPPED)) {
 
 					ED_object_base_select(base, select ? BA_SELECT : BA_DESELECT);
 				}
 			}
-			if (is_pose_mode &&
-			    ((vc->obact == base->object) || (base->flag & BASE_SELECTED)) &&
-			    (base->object->mode & OB_MODE_POSE))
-			{
+			if (is_pose_mode && (base->object->mode & OB_MODE_POSE)) {
 				do_lasso_select_pose(vc, base->object, mcords, moves, select);
 			}
 		}
@@ -1411,7 +1413,7 @@ static bool ed_object_select_pick(
 	ARegion *ar = CTX_wm_region(C);
 	Scene *scene = CTX_data_scene(C);
 	ViewLayer *view_layer = CTX_data_view_layer(C);
-	Base *base, *startbase = NULL, *basact = NULL, *oldbasact = NULL;
+	Base *base, *startbase = NULL, *basact = NULL, *oldbasact = BASACT(view_layer);
 	bool is_obedit;
 	float dist = ED_view3d_select_dist_px() * 1.3333f;
 	bool retval = false;
@@ -1466,6 +1468,15 @@ static bool ed_object_select_pick(
 				if (base == startbase) break;
 			}
 		}
+#ifdef USE_OBJECT_MODE_STRICT
+		if (is_obedit == false) {
+			if (basact && !BKE_object_is_mode_compat(
+			            basact->object, oldbasact ? oldbasact->object->mode : OB_MODE_OBJECT))
+			{
+				basact = NULL;
+			}
+		}
+#endif
 	}
 	else {
 		unsigned int buffer[MAXPICKBUF];
@@ -1490,6 +1501,16 @@ static bool ed_object_select_pick(
 				basact = mouse_select_eval_buffer(&vc, buffer, hits, startbase, has_bones, do_nearest);
 			}
 
+#ifdef USE_OBJECT_MODE_STRICT
+			if (is_obedit == false) {
+				if (basact && !BKE_object_is_mode_compat(
+				            basact->object, oldbasact ? oldbasact->object->mode : OB_MODE_OBJECT))
+				{
+					basact = NULL;
+				}
+			}
+#endif
+
 			if (has_bones && basact) {
 				if (basact->object->type == OB_CAMERA) {
 					if (BASACT(view_layer) == basact) {
@@ -1581,7 +1602,6 @@ static bool ed_object_select_pick(
 	/* Disallow switching modes,
 	 * special exception for edit-mode - vertex-parent operator. */
 	if (is_obedit == false) {
-		oldbasact = BASACT(view_layer);
 		if (oldbasact && basact) {
 			if ((oldbasact->object->mode != basact->object->mode) &&
 			    (oldbasact->object->mode & basact->object->mode) == 0)
@@ -1603,9 +1623,6 @@ static bool ed_object_select_pick(
 		}
 		/* also prevent making it active on mouse selection */
 		else if (BASE_SELECTABLE(basact)) {
-
-			oldbasact = BASACT(view_layer);
-			
 			if (extend) {
 				ED_object_base_select(basact, BA_SELECT);
 			}



More information about the Bf-blender-cvs mailing list