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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to