[Bf-blender-cvs] [e8926d40c8d] xr-controller-support: XR: Add option to raycast from viewer pose
Peter Kim
noreply at git.blender.org
Fri Jul 2 11:18:49 CEST 2021
Commit: e8926d40c8de7f292a43da3b4f41dda4a3f7ef79
Author: Peter Kim
Date: Fri Jul 2 18:07:55 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rBe8926d40c8de7f292a43da3b4f41dda4a3f7ef79
XR: Add option to raycast from viewer pose
Useful when using a gamepad or for systems without motion
controllers.
===================================================================
M source/blender/windowmanager/xr/intern/wm_xr_operators.c
===================================================================
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index a53edc6b090..94fd5d74285 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -584,6 +584,7 @@ static const float g_xr_default_raycast_axis[3] = {0.0f, 0.0f, -1.0f};
static const float g_xr_default_raycast_color[4] = {0.35f, 0.35f, 1.0f, 1.0f};
typedef struct XrRaycastData {
+ bool from_viewer;
float origin[3];
float direction[3];
float end[3];
@@ -602,13 +603,23 @@ static void wm_xr_raycast_draw(const bContext *UNUSED(C),
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformColor4fv(data->color);
- GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
- GPU_line_width(3.0f);
+ if (data->from_viewer) {
+ GPU_depth_test(GPU_DEPTH_NONE);
+ GPU_point_size(7.0f);
- immBegin(GPU_PRIM_LINES, 2);
- immVertex3fv(pos, data->origin);
- immVertex3fv(pos, data->end);
- immEnd();
+ immBegin(GPU_PRIM_POINTS, 1);
+ immVertex3fv(pos, data->end);
+ immEnd();
+ }
+ else {
+ GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
+ GPU_line_width(3.0f);
+
+ immBegin(GPU_PRIM_LINES, 2);
+ immVertex3fv(pos, data->origin);
+ immVertex3fv(pos, data->end);
+ immEnd();
+ }
immUnbindProgram();
}
@@ -649,9 +660,12 @@ static void wm_xr_raycast_update(wmOperator *op,
const wmXrActionData *actiondata)
{
XrRaycastData *data = op->customdata;
- float axis[3];
+ float ray_length, axis[3];
+
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "from_viewer");
+ data->from_viewer = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "axis");
+ prop = RNA_struct_find_property(op->ptr, "axis");
if (prop) {
RNA_property_float_get_array(op->ptr, prop, axis);
normalize_v3(axis);
@@ -668,13 +682,21 @@ static void wm_xr_raycast_update(wmOperator *op,
copy_v4_v4(data->color, g_xr_default_raycast_color);
}
- copy_v3_v3(data->origin, actiondata->controller_loc);
+ if (data->from_viewer) {
+ float viewer_rot[4];
+ WM_xr_session_state_viewer_pose_location_get(xr, data->origin);
+ WM_xr_session_state_viewer_pose_rotation_get(xr, viewer_rot);
+ mul_qt_v3(viewer_rot, axis);
+ ray_length = (xr->session_settings.clip_start + xr->session_settings.clip_end) / 2.0f;
+ }
+ else {
+ copy_v3_v3(data->origin, actiondata->controller_loc);
+ mul_qt_v3(actiondata->controller_rot, axis);
+ ray_length = xr->session_settings.clip_end;
+ }
- mul_qt_v3(actiondata->controller_rot, axis);
copy_v3_v3(data->direction, axis);
-
- mul_v3_v3fl(data->end, data->direction, xr->session_settings.clip_end);
- add_v3_v3(data->end, data->origin);
+ madd_v3_v3v3fl(data->end, data->origin, data->direction, ray_length);
}
static void wm_xr_raycast(Depsgraph *depsgraph,
@@ -1254,6 +1276,8 @@ static void WM_OT_xr_navigation_teleport(wmOperatorType *ot)
"Maximum raycast distance",
0.0,
BVH_RAYCAST_DIST_MAX);
+ RNA_def_boolean(
+ ot->srna, "from_viewer", false, "From Viewer", "Use viewer pose as raycast origin");
RNA_def_float_vector(ot->srna,
"axis",
3,
@@ -1261,7 +1285,7 @@ static void WM_OT_xr_navigation_teleport(wmOperatorType *ot)
-1.0f,
1.0f,
"Axis",
- "Raycast axis in controller space",
+ "Raycast axis in controller/viewer space",
-1.0f,
1.0f);
RNA_def_float_color(ot->srna,
@@ -1651,6 +1675,8 @@ static void WM_OT_xr_select_raycast(wmOperatorType *ot)
"Maximum raycast distance",
0.0,
BVH_RAYCAST_DIST_MAX);
+ RNA_def_boolean(
+ ot->srna, "from_viewer", false, "From Viewer", "Use viewer pose as raycast origin");
RNA_def_float_vector(ot->srna,
"axis",
3,
@@ -1658,7 +1684,7 @@ static void WM_OT_xr_select_raycast(wmOperatorType *ot)
-1.0f,
1.0f,
"Axis",
- "Raycast axis in controller space",
+ "Raycast axis in controller/viewer space",
-1.0f,
1.0f);
RNA_def_float_color(ot->srna,
More information about the Bf-blender-cvs
mailing list