[Bf-blender-cvs] [d834dcf1da3] xr-dev: Merge branch 'master' into xr-dev

Peter Kim noreply at git.blender.org
Fri Mar 25 07:35:48 CET 2022


Commit: d834dcf1da3c2fce89459dbf22da77435feb48aa
Author: Peter Kim
Date:   Fri Mar 25 15:34:46 2022 +0900
Branches: xr-dev
https://developer.blender.org/rBd834dcf1da3c2fce89459dbf22da77435feb48aa

Merge branch 'master' into xr-dev

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



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

diff --cc source/blender/editors/space_view3d/view3d_select.c
index 52b4fc1d8aa,30282df8026..d9388bc82ef
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@@ -2485,63 -2737,75 +2736,75 @@@ static bool ed_object_select_pick(bCont
      }
    }
  
-   if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) {
-     /* Disallow switching modes,
-      * special exception for edit-mode - vertex-parent operator. */
-     if (is_obedit == false) {
-       if (oldbasact && basact) {
-         if ((oldbasact->object->mode != basact->object->mode) &&
-             (oldbasact->object->mode & basact->object->mode) == 0) {
-           basact = NULL;
+   /* Ensure code above doesn't change the active base. This code is already fairly involved,
+    * it's best if changing the active object is localized to a single place. */
+   BLI_assert(oldbasact == (vc.obact ? BASACT(view_layer) : NULL));
+ 
+   bool found = (basact != NULL);
+   if ((handled == false) && (vc.obedit == NULL)) {
+     /* Object-mode (pose mode will have been handled already). */
+     if (params->sel_op == SEL_OP_SET) {
+       if ((found && params->select_passthrough) && (basact->flag & BASE_SELECTED)) {
+         found = false;
+         /* NOTE(@campbellbarton): Experimental behavior to set active even keeping the selection
+          * without this it's inconvenient to set the active object. */
+         if (basact != oldbasact) {
+           use_activate_selected_base = true;
+         }
+       }
+       else if (found || params->deselect_all) {
+         /* Deselect everything. */
+         /* `basact` may be NULL. */
 -        if (object_deselect_all_except(view_layer, basact)) {
++        if (ED_view3d_object_deselect_all_except(view_layer, basact)) {
+           changed_object = true;
          }
        }
      }
    }
  
-   /* Ensure code above doesn't change the active base. */
-   BLI_assert(oldbasact == (vc.obact ? BASACT(view_layer) : NULL));
- 
-   /* so, do we have something selected? */
-   if (basact) {
-     retval = true;
+   if ((handled == false) && found) {
  
      if (vc.obedit) {
-       /* only do select */
+       /* Only do the select (use for setting vertex parents & hooks).
+        * In edit-mode do not activate. */
 -      object_deselect_all_except(view_layer, basact);
 +      ED_view3d_object_deselect_all_except(view_layer, basact);
        ED_object_base_select(basact, BA_SELECT);
+ 
+       changed_object = true;
      }
-     /* also prevent making it active on mouse selection */
+     /* Also prevent making it active on mouse selection. */
      else if (BASE_SELECTABLE(v3d, basact)) {
-       const bool use_activate_selected_base = (oldbasact != basact) && (is_obedit == false);
-       if (extend) {
-         ED_object_base_select(basact, BA_SELECT);
-       }
-       else if (deselect) {
-         ED_object_base_select(basact, BA_DESELECT);
-       }
-       else if (toggle) {
-         if (basact->flag & BASE_SELECTED) {
-           /* Keep selected if the base is to be activated. */
-           if (use_activate_selected_base == false) {
-             ED_object_base_select(basact, BA_DESELECT);
-           }
-         }
-         else {
+       use_activate_selected_base |= (oldbasact != basact) && (is_obedit == false);
+ 
+       switch (params->sel_op) {
+         case SEL_OP_ADD: {
            ED_object_base_select(basact, BA_SELECT);
+           break;
          }
-       }
-       else {
-         /* When enabled, this puts other objects out of multi pose-mode. */
-         if (is_pose_mode == false || (basact->object->mode & OB_MODE_POSE) == 0) {
+         case SEL_OP_SUB: {
+           ED_object_base_select(basact, BA_DESELECT);
+           break;
+         }
+         case SEL_OP_XOR: {
+           if (basact->flag & BASE_SELECTED) {
+             /* Keep selected if the base is to be activated. */
+             if (use_activate_selected_base == false) {
+               ED_object_base_select(basact, BA_DESELECT);
+             }
+           }
+           else {
+             ED_object_base_select(basact, BA_SELECT);
+           }
+           break;
+         }
+         case SEL_OP_SET: {
 -          object_deselect_all_except(view_layer, basact);
 +          ED_view3d_object_deselect_all_except(view_layer, basact);
            ED_object_base_select(basact, BA_SELECT);
+           break;
          }
-       }
- 
-       if (use_activate_selected_base) {
-         ED_object_base_activate(C, basact); /* adds notifier */
-         if ((scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) == 0) {
-           WM_toolsystem_update_from_context_view3d(C);
+         case SEL_OP_AND: {
+           BLI_assert_unreachable(); /* Doesn't make sense for picking. */
+           break;
          }
        }



More information about the Bf-blender-cvs mailing list