[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