[Bf-blender-cvs] [6c67d808b74] xr-actions-D9124: XR: Add raycast option to ignore non-selectables

Peter Kim noreply at git.blender.org
Sun Nov 22 11:42:23 CET 2020


Commit: 6c67d808b744131f455239795e1150701a1d03fc
Author: Peter Kim
Date:   Sun Nov 22 19:35:16 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB6c67d808b744131f455239795e1150701a1d03fc

XR: Add raycast option to ignore non-selectables

Useful when user does not want non-selectable objects to block
selectable objects in raycast result.

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

M	source/blender/editors/include/ED_transform_snap_object_context.h
M	source/blender/editors/transform/transform_snap_object.c
M	source/blender/windowmanager/xr/intern/wm_xr_operators.c

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

diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h
index 63cc07f42c5..eb91d20117f 100644
--- a/source/blender/editors/include/ED_transform_snap_object_context.h
+++ b/source/blender/editors/include/ED_transform_snap_object_context.h
@@ -45,6 +45,7 @@ typedef enum eSnapSelect {
   SNAP_NOT_SELECTED = 1,
   SNAP_NOT_ACTIVE = 2,
   SNAP_SELECTED = 3,
+  SNAP_SELECTABLE = 4,
 } eSnapSelect;
 
 /** used for storing multiple hits */
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 91ad615d60f..46725911f7f 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -418,6 +418,11 @@ static void iter_snap_objects(SnapObjectContext *sctx,
         continue;
       }
     }
+    else if (snap_select == SNAP_SELECTABLE) {
+      if (!(base->flag & BASE_SELECTABLE)) {
+        continue;
+      }
+    }
 
     Object *obj_eval = DEG_get_evaluated_object(depsgraph, base->object);
     if (obj_eval->transflag & OB_DUPLI) {
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index ed9124f4e6f..54aede1b01a 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -330,7 +330,8 @@ static bool wm_xr_select_raycast(bContext *C,
                                  const float direction[3],
                                  float *ray_dist,
                                  eSelectOp select_op,
-                                 bool deselect_all)
+                                 bool deselect_all,
+                                 bool selectable_only)
 {
   /* Uses same raycast method as Scene.ray_cast(). */
   Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
@@ -346,19 +347,19 @@ static bool wm_xr_select_raycast(bContext *C,
 
   SnapObjectContext *sctx = ED_transform_snap_object_context_create(vc.scene, 0);
 
-  ED_transform_snap_object_project_ray_ex(sctx,
-                                          depsgraph,
-                                          &(const struct SnapObjectParams){
-                                              .snap_select = vc.em ? SNAP_SELECTED : SNAP_ALL,
-                                          },
-                                          origin,
-                                          direction,
-                                          ray_dist,
-                                          location,
-                                          normal,
-                                          &index,
-                                          &ob,
-                                          obmat);
+  ED_transform_snap_object_project_ray_ex(
+      sctx,
+      depsgraph,
+      &(const struct SnapObjectParams){
+          .snap_select = vc.em ? SNAP_SELECTED : (selectable_only ? SNAP_SELECTABLE : SNAP_ALL)},
+      origin,
+      direction,
+      ray_dist,
+      location,
+      normal,
+      &index,
+      &ob,
+      obmat);
 
   ED_transform_snap_object_context_destroy(sctx);
 
@@ -557,7 +558,7 @@ static int wm_xr_select_raycast_modal_3d(bContext *C, wmOperator *op, const wmEv
   else if (event->val == KM_RELEASE) {
     float ray_dist;
     eSelectOp select_op = SEL_OP_SET;
-    bool deselect_all;
+    bool deselect_all, selectable_only;
     bool ret;
 
     prop = RNA_struct_find_property(op->ptr, "distance");
@@ -579,8 +580,11 @@ static int wm_xr_select_raycast_modal_3d(bContext *C, wmOperator *op, const wmEv
     prop = RNA_struct_find_property(op->ptr, "deselect_all");
     deselect_all = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
 
+    prop = RNA_struct_find_property(op->ptr, "selectable_only");
+    selectable_only = prop ? RNA_property_boolean_get(op->ptr, prop) : true;
+
     ret = wm_xr_select_raycast(
-        C, data->origin, data->direction, &ray_dist, select_op, deselect_all);
+        C, data->origin, data->direction, &ray_dist, select_op, deselect_all, selectable_only);
 
     wm_xr_select_raycast_uninit(op);
 
@@ -633,6 +637,11 @@ static void WM_OT_xr_select_raycast(wmOperatorType *ot)
                        "Raycast axis in controller space",
                        -1.0f,
                        1.0f);
+  RNA_def_boolean(ot->srna,
+                  "selectable_only",
+                  true,
+                  "Selectable Only",
+                  "Only allow selectable objects to influence raycast result");
 }
 
 /** \} */



More information about the Bf-blender-cvs mailing list