74 wmXrActionData *actiondata =
static_cast<wmXrActionData *
>(
event->customdata);
75 return (actiondata->ot == op->
type &&
92 screen =
static_cast<bScreen *
>(screen->id.next))
100 ED_view3d_xr_mirror_update(area, v3d, session_exists);
103 if (session_exists) {
107 ED_view3d_xr_shading_update(wm, v3d, scene);
152 ot->name =
"Toggle VR Session";
153 ot->idname =
"WM_OT_xr_session_toggle";
155 "Open a view for use with virtual reality headsets, or close it if already "
201 if (actiondata->bimanual) {
203 copy_v3_v3(
data->mat_other_prev[3], actiondata->controller_loc_other);
204 data->bimanual_prev =
true;
207 data->bimanual_prev =
false;
213 const float scale =
len_v3(
R[0]);
214 float x_axis[3], y_axis[3];
228 const float nav_inv[4][4],
236 float prev_base[4][4], curr_base[4][4];
242 const float z_axis[3] = {0.0f, 0.0f, 1.0f};
250 else if (locz_lock) {
251 curr_base[3][2] = prev_base[3][2];
269 const float nav_mat[4][4],
270 const float nav_inv[4][4],
274 const bool nav_lock = (nav_mat && nav_inv);
275 float prev[4][4], curr[4][4];
277 if (!
data->rot_lock) {
287 if (!
data->loc_lock || nav_lock) {
289 copy_v3_v3(curr[3], actiondata->controller_loc);
294 nav_mat, nav_inv,
data->loc_lock,
data->locz_lock,
data->rotz_lock, prev, curr);
321 const float nav_mat[4][4],
322 const float nav_inv[4][4],
326 const bool nav_lock = (nav_mat && nav_inv);
327 float prev[4][4], curr[4][4];
331 if (!
data->rot_lock) {
333 float x_axis_prev[3], x_axis_curr[3], y_axis_prev[3], y_axis_curr[3], z_axis_prev[3],
335 float m0[3][3], m1[3][3];
341 sub_v3_v3v3(x_axis_curr, actiondata->controller_loc, actiondata->controller_loc_other);
362 if (!
data->loc_lock || nav_lock) {
366 add_v3_v3v3(curr[3], actiondata->controller_loc, actiondata->controller_loc_other);
370 if (!
data->scale_lock) {
380 sub_v3_v3v3(
v, actiondata->controller_loc, actiondata->controller_loc_other);
389 nav_mat, nav_inv,
data->loc_lock,
data->locz_lock,
data->rotz_lock, prev, curr);
418 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
441 return (actiondata->bimanual &&
data->bimanual_prev);
447 return (!actiondata->bimanual &&
data->bimanual_prev);
453 return data->loc_lock &&
data->rot_lock &&
data->scale_lock;
456 return data->loc_lock &&
data->rot_lock;
460 const wmXrActionData *actiondata,
464 GHOST_XrPose nav_pose;
466 float nav_mat[4][4], nav_inv[4][4], delta[4][4],
out[4][4];
468 const bool need_navinv = (
data->loc_lock ||
data->locz_lock ||
data->rotz_lock);
482 need_navinv ? nav_mat :
nullptr,
483 need_navinv ? nav_inv :
nullptr,
490 need_navinv ? nav_mat :
nullptr,
491 need_navinv ? nav_inv :
nullptr,
504 if (!
data->rot_lock) {
509 if (!
data->scale_lock && bimanual) {
518 if (actiondata->bimanual) {
519 if (!
data->bimanual_prev) {
523 copy_v3_v3(
data->mat_other_prev[3], actiondata->controller_loc_other);
525 data->bimanual_prev =
true;
528 if (
data->bimanual_prev) {
532 data->bimanual_prev =
false;
549 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
579 switch (event->
val) {
595 ot->name =
"XR Navigation Grab";
596 ot->idname =
"WM_OT_xr_navigation_grab";
597 ot->description =
"Navigate the VR scene by grabbing with controllers";
608 ot->srna,
"lock_location",
false,
"Lock Location",
"Prevent changes to viewer location");
610 ot->srna,
"lock_location_z",
false,
"Lock Elevation",
"Prevent changes to viewer elevation");
612 ot->srna,
"lock_rotation",
false,
"Lock Rotation",
"Prevent changes to viewer rotation");
616 "Lock Up Orientation",
617 "Prevent changes to viewer up orientation");
618 RNA_def_boolean(
ot->srna,
"lock_scale",
false,
"Lock Scale",
"Prevent changes to viewer scale");
685 if (
data->from_viewer) {
694 for (
int i = 1;
i <
data->num_points; ++
i) {
768 const wmXrActionData *actiondata)
771 float axis[3], nav_scale;
780 if (
data->from_viewer) {
795 mul_qt_v3(actiondata->controller_rot, axis);
803 const float origin[3],
804 const float direction[3],
806 bool selectable_only,
889 const float ref_quat[4],
890 const float nav_mat[4][4],
894 float ref_axes[3][3];
942 float z_axis[3], projected[3];
956 const float viewer_mat[4][4],
957 const float nav_mat[4][4],
958 const float nav_inv[4][4],
963 float z_axis[3], m[3][3], prev[4][4], curr[4][4];
981 const float nav_rotation[4],
985 float base_eul[3], base_quatz[4];
1031 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
1036 bool turn, snap_turn, invert_rotation, swap_hands, locz_lock, dir_lock, speed_frame_based;
1037 bool speed_interp_cubic =
false;
1038 float speed, speed_max, speed_p0[2], speed_p1[2], button_state;
1039 GHOST_XrPose nav_pose;
1040 float nav_mat[4][4], delta[4][4],
out[4][4];
1043 data->time_prev = time_now;
1051 locz_lock =
RNA_boolean_get(op->
ptr, swap_hands ?
"alt_lock_location_z" :
"lock_location_z");
1052 dir_lock =
RNA_boolean_get(op->
ptr, swap_hands ?
"alt_lock_direction" :
"lock_direction");
1055 speed_frame_based =
false;
1058 speed_max =
U.xr_navigation.turn_amount;
1062 speed_max =
U.xr_navigation.turn_speed;
1075 speed_interp_cubic =
true;
1078 speed_p0[0] = speed_p0[1] = 0.0f;
1084 speed_interp_cubic =
true;
1087 speed_p1[0] = speed_p1[1] = 1.0f;
1091 if (speed_max < speed) {
1096 switch (actiondata->type) {
1098 button_state = 1.0f;
1104 len_v2(actiondata->state);
1105 float speed_t = (actiondata->float_threshold < 1.0f) ?
1106 (button_state - actiondata->float_threshold) /
1107 (1.0f - actiondata->float_threshold) :
1109 if (speed_interp_cubic) {
1110 float start[2], end[2], p[2];
1114 speed_p0[1] = speed + speed_p0[1] * (speed_max - speed);
1115 speed_p1[1] = speed + speed_p1[1] * (speed_max - speed);
1123 speed += speed_t * (speed_max - speed);
1138 if (dir_lock || (snap_turn &&
data->is_finished) ||
1139 (snap_turn && button_state <
RNA_float_get(op->
ptr,
"snap_turn_threshold")))
1146 speed *= delta_time;
1149 data->is_finished =
true;
1152 if (invert_rotation) {
1156 GHOST_XrPose viewer_pose;
1157 float viewer_mat[4][4], nav_inv[4][4];
1168 float nav_scale, ref_quat[4];
1176 if (!speed_frame_based) {
1177 speed *= delta_time;
1204 copy_qt_qt(ref_quat, actiondata->controller_rot);
1239 ot->name =
"XR Navigation Fly";
1240 ot->idname =
"WM_OT_xr_navigation_fly";
1241 ot->description =
"Move/turn relative to the VR viewer or controller";
1252 {
XR_FLY_FORWARD,
"FORWARD", 0,
"Forward",
"Move along navigation forward axis"},
1253 {
XR_FLY_BACK,
"BACK", 0,
"Back",
"Move along navigation back axis"},
1254 {
XR_FLY_LEFT,
"LEFT", 0,
"Left",
"Move along navigation left axis"},
1255 {
XR_FLY_RIGHT,
"RIGHT", 0,
"Right",
"Move along navigation right axis"},
1256 {
XR_FLY_UP,
"UP", 0,
"Up",
"Move along navigation up axis"},
1257 {
XR_FLY_DOWN,
"DOWN", 0,
"Down",
"Move along navigation down axis"},
1262 "Turn counter-clockwise around navigation up axis"},
1263 {
XR_FLY_TURNRIGHT,
"TURNRIGHT", 0,
"Turn Right",
"Turn clockwise around navigation up axis"},
1268 "Move along viewer's forward axis"},
1269 {
XR_FLY_VIEWER_BACK,
"VIEWER_BACK", 0,
"Viewer Back",
"Move along viewer's back axis"},
1270 {
XR_FLY_VIEWER_LEFT,
"VIEWER_LEFT", 0,
"Viewer Left",
"Move along viewer's left axis"},
1271 {
XR_FLY_VIEWER_RIGHT,
"VIEWER_RIGHT", 0,
"Viewer Right",
"Move along viewer's right axis"},
1273 "CONTROLLER_FORWARD",
1275 "Controller Forward",
1276 "Move along controller's forward axis"},
1277 {0,
nullptr, 0,
nullptr,
nullptr},
1280 static const float default_speed_p0[2] = {0.0f, 0.0f};
1281 static const float default_speed_p1[2] = {1.0f, 1.0f};
1287 "snap_turn_threshold",
1291 "Snap Turn Threshold",
1292 "Input state threshold when using snap turn",
1296 ot->srna,
"lock_location_z",
false,
"Lock Elevation",
"Prevent changes to viewer elevation");
1301 "Limit movement to viewer's initial direction");
1303 "speed_frame_based",
1305 "Frame Based Speed",
1306 "Apply fixed movement deltas every update");
1308 "turn_speed_factor",
1312 "Turn Speed Factor",
1313 "Ratio between the min and max turn speed",
1322 "Ratio between the min and max fly speed",
1326 "speed_interpolation0",
1331 "Speed Interpolation 0",
1332 "First cubic spline control point between min/max speeds",
1336 "speed_interpolation1",
1341 "Speed Interpolation 1",
1342 "Second cubic spline control point between min/max speeds",
1351 "Fly mode when hands are swapped");
1353 "alt_lock_location_z",
1355 "Lock Elevation (Alt)",
1356 "When hands are swapped, prevent changes to viewer elevation");
1358 "alt_lock_direction",
1360 "Lock Direction (Alt)",
1361 "When hands are swapped, limit movement to viewer's initial direction");
1373 float nav_destination[3],
1374 const float destination[4],
1375 const float normal[3],
1376 const bool teleport_axes[3],
1381 float nav_location[3], nav_rotation[4], viewer_location[3];
1386 float nav_axes[3][3], projected[3], v0[3], v1[3], destination_with_ofs[3];
1389 copy_v3_v3(destination_with_ofs, destination);
1390 destination_with_ofs[2] += vertical_ofs;
1396 for (
int a = 0; a < 3; ++a) {
1398 if (teleport_axes[a]) {
1412 return len_v3v3(viewer_location, destination);
1419 constexpr uint z = 2;
1420 for (
int i = 1;
i < *num_points; ++
i) {
1421 float *startpoint = points[
i - 1], *endpoint = points[
i];
1423 if ((startpoint[
z] < 0) == (endpoint[
z] < 0)) {
1427 if (startpoint[
z] == endpoint[
z]) {
1431 float segment_ray_dist =
len_v3v3(startpoint, endpoint);
1432 float alpha = startpoint[
z] / (startpoint[
z] - endpoint[
z]);
1435 *ray_dist = segment_ray_dist * (
i - 1) +
len_v3v3(startpoint, endpoint);
1436 *num_points =
i + 1;
1445 float nav_destination[3],
1447 const float direction[3],
1450 float *destination_dist,
1451 bool selectable_only,
1452 const bool teleport_axes[3],
1461 const Object *ob =
nullptr;
1464 float normal[3], segment_direction[3];
1465 float vertical_ofs = 0;
1472 if (*ray_dist <= 0.0f) {
1476 const float segment_length = *ray_dist / (*num_points - 1);
1477 float segment_ray_dist = 0.0f;
1480 for (
int i = 1;
i < *num_points; ++
i) {
1481 segment_ray_dist = segment_length;
1494 *ray_dist += segment_ray_dist;
1497 *num_points =
i + 1;
1500 if (
dot_v3v3(segment_direction, normal) > 0) {
1508 madd_v3_v3v3fl(points[
i], points[
i - 1], segment_direction, segment_length);
1511 segment_direction[2] -= gravity;
1517 vertical_ofs = head_height;
1525 float origin[3], dummy_dest[3], dummy_normal[3];
1532 madd_v3_v3fl(origin, segment_direction, -vertical_ofs);
1534 segment_ray_dist = head_height;
1550 vertical_ofs = head_height - segment_ray_dist;
1556 segment_ray_dist = vertical_ofs;
1571 vertical_ofs =
max_ff(0.0f, segment_ray_dist - teleport_ofs);
1578 points[*num_points - 1],
1627 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
1635 float nav_scale, ray_dist, destination_dist, nav_destination[3];
1636 bool teleport_axes[3];
1665 sqrt(destination_dist / nav_scale) * nav_scale;
1667 switch (
data->result) {
1682 switch (event->
val) {
1706 ot->name =
"XR Navigation Teleport";
1707 ot->idname =
"WM_OT_xr_navigation_teleport";
1708 ot->description =
"Set VR viewer location to controller raycast hit location";
1718 static const bool default_teleport_axes[3] = {
true,
true,
true};
1723 default_teleport_axes,
1725 "Enabled teleport axes in navigation space");
1732 "Interpolation factor between viewer and hit locations",
1741 "Offset along hit normal to subtract from final location",
1748 "Only allow selectable objects to influence raycast result");
1755 "Maximum raycast distance",
1764 "Downward curvature applied to raycast",
1773 "Width of the raycast visualization",
1777 "destination_scale",
1781 "Destination Scale",
1782 "Width of the destination visualization",
1791 "Number of interpolation samples for the raycast visualization",
1795 ot->srna,
"from_viewer",
false,
"From Viewer",
"Use viewer pose as raycast origin");
1803 "Raycast axis in controller/viewer space",
1813 "Color of raycast when it succeeds",
1823 "Color of raycast when it misses",
1833 "Color of raycast when a fallback case succeeds",
1850 bool reset_loc, reset_rot, reset_scale;
1859 float nav_rotation[4], nav_scale;
1884 float nav_location[3], nav_rotation[4], nav_scale;
1885 float nav_axes[3][3],
v[3];
1913 ot->name =
"XR Navigation Reset";
1914 ot->idname =
"WM_OT_xr_navigation_reset";
1915 ot->description =
"Reset VR navigation deltas relative to session base pose";
1922 RNA_def_boolean(
ot->srna,
"location",
true,
"Location",
"Reset location deltas");
1923 RNA_def_boolean(
ot->srna,
"rotation",
true,
"Rotation",
"Reset rotation deltas");
1969 switch (event->
val) {
1984 ot->name =
"XR Navigation Swap Hands";
1985 ot->idname =
"WM_OT_xr_navigation_swap_hands";
1986 ot->description =
"Swap VR navigation controls between left / right controllers";
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
bool IDP_EqualsProperties(const IDProperty *prop1, const IDProperty *prop2) ATTR_WARN_UNUSED_RESULT
SpaceType * BKE_spacetype_from_id(int spaceid)
ARegionType * BKE_regiontype_from_id(const SpaceType *st, int regionid)
#define BLI_assert_unreachable()
#define BVH_RAYCAST_DIST_MAX
#define LISTBASE_FOREACH(type, var, list)
MINLINE float max_ff(float a, float b)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4(float mat[4][4])
void unit_m4(float m[4][4])
void quat_to_mat3(float m[3][3], const float q[4])
void axis_angle_normalized_to_mat3(float R[3][3], const float axis[3], float angle)
void axis_angle_to_quat_single(float q[4], char axis, float angle)
float normalize_qt(float q[4])
void quat_to_mat4(float m[4][4], const float q[4])
void mul_qt_v3(const float q[4], float r[3])
void quat_to_eul(float eul[3], const float quat[4])
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
void mat4_to_quat(float q[4], const float mat[4][4])
void copy_qt_qt(float q[4], const float a[4])
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void sub_v3_v3(float r[3], const float a[3])
void interp_v2_v2v2v2v2_cubic(float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2], float u)
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3_v3(float r[3], const float a[3])
void project_v3_v3v3_normalized(float out[3], const float p[3], const float v_proj[3])
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void negate_v3(float r[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
Platform independent time functions.
double BLI_time_now_seconds(void)
#define BLT_I18NCONTEXT_NAVIGATION
@ SCE_SNAP_TARGET_ONLY_SELECTABLE
@ USER_XR_NAV_INVERT_ROTATION
@ V3D_RUNTIME_XR_SESSION_ROOT
#define OPERATOR_RETVAL_CHECK(ret)
bool ED_operator_view3d_active(bContext *C)
void * ED_region_draw_cb_activate(ARegionType *art, void(*draw)(const bContext *, ARegion *, void *), void *customdata, int type)
#define REGION_DRAW_POST_VIEW
bool ED_region_draw_cb_exit(ARegionType *art, void *handle)
#define GPU_batch_uniform_1f(batch, name, x)
void GPU_batch_program_set_builtin(blender::gpu::Batch *batch, GPUBuiltinShader shader_id)
#define GPU_batch_uniform_4fv_array(batch, name, len, val)
#define GPU_batch_uniform_3fv(batch, name, val)
void GPU_batch_draw(blender::gpu::Batch *batch)
#define GPU_batch_uniform_4fv(batch, name, val)
blender::gpu::Batch * GPU_batch_create_procedural(GPUPrimType primitive_type, int32_t vertex_count)
#define GPU_batch_uniform_1i(batch, name, x)
blender::gpu::Batch * GPU_batch_preset_sphere(int lod) ATTR_WARN_UNUSED_RESULT
void GPU_matrix_scale_1f(float factor)
void GPU_matrix_translate_3fv(const float vec[3])
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_depth_test(GPUDepthTest test)
void GPU_point_size(float size)
Read Guarded memory(de)allocation.
#define ND_XR_DATA_CHANGED
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
BPy_StructRNA * depsgraph
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
void * MEM_callocN(size_t len, const char *str)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
void RNA_boolean_get_array(PointerRNA *ptr, const char *name, bool *values)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float_color(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const bool *default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
float mat_other_prev[4][4]
blender::gpu::Batch * raycast_model
float points[XR_MAX_RAYCASTS+1][4]
wmOperatorStatus(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
struct wmOperatorType * type
XrSessionSettings session_settings
struct wmXrRuntimeData * runtime
wmXrSessionState session_state
GHOST_XrPose prev_local_pose
blender::gpu::Batch * raycast_model
GHOST_XrPose prev_base_pose
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operatortype_append(void(*opfunc)(wmOperatorType *))
Scene * WM_windows_scene_get_from_screen(const wmWindowManager *wm, const bScreen *screen)
bool wm_xr_init(wmWindowManager *wm)
void wm_xr_pose_to_mat(const GHOST_XrPose *pose, float r_mat[4][4])
void wm_xr_pose_scale_to_mat(const GHOST_XrPose *pose, float scale, float r_mat[4][4])
void wm_xr_pose_scale_to_imat(const GHOST_XrPose *pose, float scale, float r_imat[4][4])
void wm_xr_pose_to_imat(const GHOST_XrPose *pose, float r_imat[4][4])
static void orient_mat_z_normalized(float R[4][4], const float z_axis[3])
static void wm_xr_grab_init(wmOperator *op)
static void wm_xr_fly_init(wmOperator *op, const wmXrData *xr)
static void wm_xr_navigation_grab_bimanual_state_update(const wmXrActionData *actiondata, XrGrabData *data)
static void wm_xr_basenav_rotation_calc(const wmXrData *xr, const float nav_rotation[4], float r_rotation[4])
static wmOperatorStatus wm_xr_navigation_swap_hands_exec(bContext *, wmOperator *)
static wmOperatorStatus wm_xr_navigation_reset_exec(bContext *C, wmOperator *op)
static wmOperatorStatus wm_xr_navigation_swap_hands_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void wm_xr_grab_uninit(wmOperator *op)
static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
static wmOperatorStatus wm_xr_navigation_teleport_exec(bContext *, wmOperator *)
static void wm_xr_navigation_grab_apply(wmXrData *xr, const wmXrActionData *actiondata, const XrGrabData *data, bool bimanual)
static void wm_xr_navlocks_apply(const float nav_mat[4][4], const float nav_inv[4][4], bool loc_lock, bool locz_lock, bool rotz_lock, float r_prev[4][4], float r_curr[4][4])
static bool wm_xr_navigation_grab_is_bimanual_ending(const wmXrActionData *actiondata, const XrGrabData *data)
static wmOperatorStatus wm_xr_navigation_fly_exec(bContext *, wmOperator *)
static void wm_xr_grab_compute_bimanual(const wmXrActionData *actiondata, const XrGrabData *data, const float nav_mat[4][4], const float nav_inv[4][4], bool reverse, float r_delta[4][4])
static float wm_xr_navigation_teleport_pose_calc(wmXrData *xr, float nav_destination[3], const float destination[4], const float normal[3], const bool teleport_axes[3], float teleport_t, float teleport_ofs, float vertical_ofs)
static void wm_xr_fly_uninit(wmOperator *op)
static bool wm_xr_operator_sessionactive(bContext *C)
static void wm_xr_raycast_uninit(wmOperator *op)
static wmOperatorStatus wm_xr_navigation_fly_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void wm_xr_navigation_fly_cancel(bContext *, wmOperator *op)
void wm_xr_operatortypes_register()
static void WM_OT_xr_navigation_swap_hands(wmOperatorType *ot)
static void wm_xr_raycast_update(wmOperator *op, const wmXrData *xr, const wmXrActionData *actiondata)
static bool wm_xr_navigation_grab_is_locked(const XrGrabData *data, const bool bimanual)
static const float g_xr_default_raycast_miss_color[4]
static void wm_xr_session_update_screen_on_exit_cb(const wmXrData *xr_data)
static wmOperatorStatus wm_xr_session_toggle_exec(bContext *C, wmOperator *)
static const float g_xr_default_raycast_hit_color[4]
static const float g_xr_default_raycast_fallback_color[4]
static wmOperatorStatus wm_xr_navigation_swap_hands_modal(bContext *C, wmOperator *op, const wmEvent *event)
static XrRaycastResult wm_xr_navigation_teleport(bContext *C, wmXrData *xr, float nav_destination[3], float points[XR_MAX_RAYCASTS+1][4], const float direction[3], int *num_points, float *ray_dist, float *destination_dist, bool selectable_only, const bool teleport_axes[3], float teleport_t, float teleport_ofs, float gravity, float head_height)
static void wm_xr_session_update_screen(Main *bmain, const wmXrData *xr_data)
static bool wm_xr_operator_test_event(const wmOperator *op, const wmEvent *event)
static bool wm_xr_navigation_grab_can_do_bimanual(const wmXrActionData *actiondata, const XrGrabData *data)
static void WM_OT_xr_navigation_teleport(wmOperatorType *ot)
static void wm_xr_grab_update(wmOperator *op, const wmXrActionData *actiondata)
static void wm_xr_raycast_destination_draw(const XrRaycastData *data)
static void wm_xr_raycast(Scene *scene, Depsgraph *depsgraph, const float origin[3], const float direction[3], float *ray_dist, bool selectable_only, float r_location[3], float r_normal[3], int *r_index, const Object **r_ob, float r_obmat[4][4])
static void wm_xr_navigation_teleport_cancel(bContext *, wmOperator *op)
static bool wm_xr_navigation_teleport_ground_plane(float points[XR_MAX_RAYCASTS+1][4], int *num_points, float *ray_dist)
static wmOperatorStatus wm_xr_navigation_grab_modal(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_teleport_modal(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_fly_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_reset(wmOperatorType *ot)
static void wm_xr_navigation_grab_cancel(bContext *, wmOperator *op)
static wmOperatorStatus wm_xr_navigation_teleport_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static const float g_xr_default_raycast_axis[3]
static wmOperatorStatus wm_xr_navigation_grab_exec(bContext *, wmOperator *)
static void WM_OT_xr_navigation_grab(wmOperatorType *ot)
@ XR_FLY_CONTROLLER_FORWARD
static void wm_xr_raycast_init(wmOperator *op)
static void wm_xr_raycast_draw(const bContext *, ARegion *, void *customdata)
static void wm_xr_grab_compute(const wmXrActionData *actiondata, const XrGrabData *data, const float nav_mat[4][4], const float nav_inv[4][4], bool reverse, float r_delta[4][4])
static void wm_xr_fly_compute_move(eXrFlyMode mode, float speed, const float ref_quat[4], const float nav_mat[4][4], bool locz_lock, float r_delta[4][4])
static void WM_OT_xr_session_toggle(wmOperatorType *ot)
static wmOperatorStatus wm_xr_navigation_grab_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void wm_xr_fly_compute_turn(eXrFlyMode mode, float speed, const float viewer_mat[4][4], const float nav_mat[4][4], const float nav_inv[4][4], float r_delta[4][4])
void WM_xr_session_state_vignette_activate(wmXrData *xr)
void WM_xr_session_state_nav_scale_set(wmXrData *xr, float scale)
bool WM_xr_session_state_nav_scale_get(const wmXrData *xr, float *r_scale)
void wm_xr_session_toggle(wmWindowManager *wm, wmWindow *session_root_win, wmXrSessionExitFn session_exit_fn)
bool WM_xr_session_state_nav_location_get(const wmXrData *xr, float r_location[3])
void WM_xr_session_state_nav_location_set(wmXrData *xr, const float location[3])
bool WM_xr_session_is_ready(const wmXrData *xr)
bool WM_xr_session_state_viewer_pose_location_get(const wmXrData *xr, float r_location[3])
bool WM_xr_session_exists(const wmXrData *xr)
void WM_xr_session_state_nav_rotation_set(wmXrData *xr, const float rotation[4])
bool WM_xr_session_state_viewer_pose_rotation_get(const wmXrData *xr, float r_rotation[4])
bool WM_xr_session_state_nav_rotation_get(const wmXrData *xr, float r_rotation[4])