67 wmXrActionData *actiondata =
static_cast<wmXrActionData *
>(
event->customdata);
68 return (actiondata->ot == op->
type &&
85 screen =
static_cast<bScreen *
>(screen->id.next))
93 ED_view3d_xr_mirror_update(area, v3d, session_exists);
100 ED_view3d_xr_shading_update(wm, v3d, scene);
145 ot->
name =
"Toggle VR Session";
146 ot->
idname =
"WM_OT_xr_session_toggle";
148 "Open a view for use with virtual reality headsets, or close it if already "
189 quat_to_mat4(data->mat_prev, actiondata->controller_rot);
190 copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
192 if (actiondata->bimanual) {
193 quat_to_mat4(data->mat_other_prev, actiondata->controller_rot_other);
194 copy_v3_v3(data->mat_other_prev[3], actiondata->controller_loc_other);
195 data->bimanual_prev =
true;
198 data->bimanual_prev =
false;
204 const float scale =
len_v3(
R[0]);
205 float x_axis[3], y_axis[3];
219 const float nav_inv[4][4],
227 float prev_base[4][4], curr_base[4][4];
233 const float z_axis[3] = {0.0f, 0.0f, 1.0f};
241 else if (locz_lock) {
242 curr_base[3][2] = prev_base[3][2];
260 const float nav_mat[4][4],
261 const float nav_inv[4][4],
265 const bool nav_lock = (nav_mat && nav_inv);
266 float prev[4][4], curr[4][4];
268 if (!data->rot_lock) {
278 if (!data->loc_lock || nav_lock) {
280 copy_v3_v3(curr[3], actiondata->controller_loc);
285 nav_mat, nav_inv, data->loc_lock, data->locz_lock, data->rotz_lock, prev, curr);
312 const float nav_mat[4][4],
313 const float nav_inv[4][4],
317 const bool nav_lock = (nav_mat && nav_inv);
318 float prev[4][4], curr[4][4];
322 if (!data->rot_lock) {
324 float x_axis_prev[3], x_axis_curr[3], y_axis_prev[3], y_axis_curr[3], z_axis_prev[3],
326 float m0[3][3], m1[3][3];
331 sub_v3_v3v3(x_axis_prev, data->mat_prev[3], data->mat_other_prev[3]);
332 sub_v3_v3v3(x_axis_curr, actiondata->controller_loc, actiondata->controller_loc_other);
334 add_v3_v3v3(y_axis_prev, data->mat_prev[1], data->mat_other_prev[1]);
353 if (!data->loc_lock || nav_lock) {
355 add_v3_v3v3(prev[3], data->mat_prev[3], data->mat_other_prev[3]);
357 add_v3_v3v3(curr[3], actiondata->controller_loc, actiondata->controller_loc_other);
361 if (!data->scale_lock) {
365 sub_v3_v3v3(
v, data->mat_prev[3], data->mat_other_prev[3]);
371 sub_v3_v3v3(
v, actiondata->controller_loc, actiondata->controller_loc_other);
380 nav_mat, nav_inv, data->loc_lock, data->locz_lock, data->rotz_lock, prev, curr);
407 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
430 return (actiondata->bimanual && data->bimanual_prev);
436 return (!actiondata->bimanual && data->bimanual_prev);
442 return data->loc_lock && data->rot_lock && data->scale_lock;
445 return data->loc_lock && data->rot_lock;
449 const wmXrActionData *actiondata,
453 GHOST_XrPose nav_pose;
455 float nav_mat[4][4], nav_inv[4][4], delta[4][4], out[4][4];
457 const bool need_navinv = (data->loc_lock || data->locz_lock || data->rotz_lock);
471 need_navinv ? nav_mat :
nullptr,
472 need_navinv ? nav_inv :
nullptr,
479 need_navinv ? nav_mat :
nullptr,
480 need_navinv ? nav_inv :
nullptr,
488 nav_scale =
len_v3(out[0]);
493 if (!data->rot_lock) {
498 if (!data->scale_lock && bimanual) {
507 if (actiondata->bimanual) {
508 if (!data->bimanual_prev) {
509 quat_to_mat4(data->mat_prev, actiondata->controller_rot);
510 copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
511 quat_to_mat4(data->mat_other_prev, actiondata->controller_rot_other);
512 copy_v3_v3(data->mat_other_prev[3], actiondata->controller_loc_other);
514 data->bimanual_prev =
true;
517 if (data->bimanual_prev) {
518 quat_to_mat4(data->mat_prev, actiondata->controller_rot);
519 copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
521 data->bimanual_prev =
false;
531 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
559 switch (event->
val) {
575 ot->
name =
"XR Navigation Grab";
576 ot->
idname =
"WM_OT_xr_navigation_grab";
577 ot->
description =
"Navigate the VR scene by grabbing with controllers";
587 ot->
srna,
"lock_location",
false,
"Lock Location",
"Prevent changes to viewer location");
589 ot->
srna,
"lock_location_z",
false,
"Lock Elevation",
"Prevent changes to viewer elevation");
591 ot->
srna,
"lock_rotation",
false,
"Lock Rotation",
"Prevent changes to viewer rotation");
595 "Lock Up Orientation",
596 "Prevent changes to viewer up orientation");
625 if (data->from_viewer) {
700 const wmXrActionData *actiondata)
703 float ray_length, axis[3];
709 if (data->from_viewer) {
717 copy_v3_v3(data->origin, actiondata->controller_loc);
718 mul_qt_v3(actiondata->controller_rot, axis);
723 madd_v3_v3v3fl(data->end, data->origin, data->direction, ray_length);
728 const float origin[3],
729 const float direction[3],
731 bool selectable_only,
769#define XR_DEFAULT_FLY_SPEED_MOVE 0.054f
770#define XR_DEFAULT_FLY_SPEED_TURN 0.03f
811 const float ref_quat[4],
812 const float nav_mat[4][4],
816 float ref_axes[3][3];
864 float z_axis[3], projected[3];
878 const float viewer_mat[4][4],
879 const float nav_mat[4][4],
880 const float nav_inv[4][4],
885 float z_axis[3], m[3][3], prev[4][4], curr[4][4];
903 const float nav_rotation[4],
907 float base_eul[3], base_quatz[4];
944 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
949 bool turn, locz_lock, dir_lock, speed_frame_based;
950 bool speed_interp_cubic =
false;
951 float speed, speed_max, speed_p0[2], speed_p1[2];
952 GHOST_XrPose nav_pose;
953 float nav_mat[4][4], delta[4][4], out[4][4];
969 speed_interp_cubic =
true;
972 speed_p0[0] = speed_p0[1] = 0.0f;
978 speed_interp_cubic =
true;
981 speed_p1[0] = speed_p1[1] = 1.0f;
985 if (speed_max < speed) {
990 switch (actiondata->type) {
997 len_v2(actiondata->state);
998 float speed_t = (actiondata->float_threshold < 1.0f) ?
999 (
state - actiondata->float_threshold) /
1000 (1.0f - actiondata->float_threshold) :
1002 if (speed_interp_cubic) {
1003 float start[2], end[2], p[2];
1007 speed_p0[1] = speed + speed_p0[1] * (speed_max - speed);
1008 speed_p1[1] = speed + speed_p1[1] * (speed_max - speed);
1016 speed += speed_t * (speed_max - speed);
1026 if (!speed_frame_based) {
1028 speed *= time_now - data->time_prev;
1030 data->time_prev = time_now;
1041 GHOST_XrPose viewer_pose;
1042 float viewer_mat[4][4], nav_inv[4][4];
1053 float nav_scale, ref_quat[4];
1083 copy_qt_qt(ref_quat, actiondata->controller_rot);
1116 ot->
name =
"XR Navigation Fly";
1117 ot->
idname =
"WM_OT_xr_navigation_fly";
1118 ot->
description =
"Move/turn relative to the VR viewer or controller";
1128 {
XR_FLY_FORWARD,
"FORWARD", 0,
"Forward",
"Move along navigation forward axis"},
1129 {
XR_FLY_BACK,
"BACK", 0,
"Back",
"Move along navigation back axis"},
1130 {
XR_FLY_LEFT,
"LEFT", 0,
"Left",
"Move along navigation left axis"},
1131 {
XR_FLY_RIGHT,
"RIGHT", 0,
"Right",
"Move along navigation right axis"},
1132 {
XR_FLY_UP,
"UP", 0,
"Up",
"Move along navigation up axis"},
1133 {
XR_FLY_DOWN,
"DOWN", 0,
"Down",
"Move along navigation down axis"},
1138 "Turn counter-clockwise around navigation up axis"},
1139 {
XR_FLY_TURNRIGHT,
"TURNRIGHT", 0,
"Turn Right",
"Turn clockwise around navigation up axis"},
1144 "Move along viewer's forward axis"},
1145 {
XR_FLY_VIEWER_BACK,
"VIEWER_BACK", 0,
"Viewer Back",
"Move along viewer's back axis"},
1146 {
XR_FLY_VIEWER_LEFT,
"VIEWER_LEFT", 0,
"Viewer Left",
"Move along viewer's left axis"},
1147 {
XR_FLY_VIEWER_RIGHT,
"VIEWER_RIGHT", 0,
"Viewer Right",
"Move along viewer's right axis"},
1149 "CONTROLLER_FORWARD",
1151 "Controller Forward",
1152 "Move along controller's forward axis"},
1153 {0,
nullptr, 0,
nullptr,
nullptr},
1156 static const float default_speed_p0[2] = {0.0f, 0.0f};
1157 static const float default_speed_p1[2] = {1.0f, 1.0f};
1161 ot->
srna,
"lock_location_z",
false,
"Lock Elevation",
"Prevent changes to viewer elevation");
1166 "Limit movement to viewer's initial direction");
1168 "speed_frame_based",
1170 "Frame Based Speed",
1171 "Apply fixed movement deltas every update");
1178 "Minimum move (turn) speed in meters (radians) per second or frame",
1187 "Maximum move (turn) speed in meters (radians) per second or frame",
1191 "speed_interpolation0",
1196 "Speed Interpolation 0",
1197 "First cubic spline control point between min/max speeds",
1201 "speed_interpolation1",
1206 "Speed Interpolation 1",
1207 "Second cubic spline control point between min/max speeds",
1222 const float origin[3],
1223 const float direction[3],
1225 bool selectable_only,
1226 const bool teleport_axes[3],
1235 const Object *ob =
nullptr;
1252 float nav_location[3], nav_rotation[4], viewer_location[3];
1253 float nav_axes[3][3], projected[3], v0[3], v1[3];
1254 float out[3] = {0.0f, 0.0f, 0.0f};
1264 for (
int a = 0; a < 3; ++a) {
1266 if (teleport_axes[a]) {
1292 int retval = op->
type->
modal(C, op, event);
1312 const wmXrActionData *actiondata =
static_cast<const wmXrActionData *
>(
event->customdata);
1318 switch (event->
val) {
1323 bool selectable_only, teleport_axes[3];
1324 float teleport_t, teleport_ofs, ray_dist;
1357 ot->
name =
"XR Navigation Teleport";
1358 ot->
idname =
"WM_OT_xr_navigation_teleport";
1359 ot->
description =
"Set VR viewer location to controller raycast hit location";
1368 static const bool default_teleport_axes[3] = {
true,
true,
true};
1373 default_teleport_axes,
1375 "Enabled teleport axes in navigation space");
1382 "Interpolation factor between viewer and hit locations",
1391 "Offset along hit normal to subtract from final location",
1398 "Only allow selectable objects to influence raycast result");
1405 "Maximum raycast distance",
1409 ot->
srna,
"from_viewer",
false,
"From Viewer",
"Use viewer pose as raycast origin");
1417 "Raycast axis in controller/viewer space",
1444 bool reset_loc, reset_rot, reset_scale;
1453 float nav_rotation[4], nav_scale;
1478 float nav_location[3], nav_rotation[4], nav_scale;
1479 float nav_axes[3][3],
v[3];
1507 ot->
name =
"XR Navigation Reset";
1508 ot->
idname =
"WM_OT_xr_navigation_reset";
1509 ot->
description =
"Reset VR navigation deltas relative to session base pose";
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)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void unit_m4(float m[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 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 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 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 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)
@ SCE_SNAP_TARGET_ONLY_SELECTABLE
@ V3D_RUNTIME_XR_SESSION_ROOT
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)
bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_loc[3], float r_no[3], int *r_index, const Object **r_ob, float r_obmat[4][4])
SnapObjectContext * ED_transform_snap_object_context_create(Scene *scene, int flag)
void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx)
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_SHADER_3D_POLYLINE_FLAT_COLOR
void GPU_point_size(float size)
void GPU_depth_test(eGPUDepthTest test)
void GPU_viewport_size_get_f(float coords[4])
Read Guarded memory(de)allocation.
#define ND_XR_DATA_CHANGED
ATTR_WARN_UNUSED_RESULT const BMVert * v
const Depsgraph * depsgraph
void MEM_freeN(void *vmemh)
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)
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)
float mat_other_prev[4][4]
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
struct wmOperatorType * type
XrSessionSettings session_settings
struct wmXrRuntimeData * runtime
wmXrSessionState session_state
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_navigation_teleport(bContext *C, wmXrData *xr, const float origin[3], const float direction[3], float *ray_dist, bool selectable_only, const bool teleport_axes[3], float teleport_t, float teleport_ofs)
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 int wm_xr_navigation_grab_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int wm_xr_navigation_fly_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int wm_xr_navigation_teleport_exec(bContext *, wmOperator *)
static void wm_xr_grab_uninit(wmOperator *op)
static void WM_OT_xr_navigation_fly(wmOperatorType *ot)
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 int wm_xr_navigation_reset_exec(bContext *C, wmOperator *op)
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 void wm_xr_fly_uninit(wmOperator *op)
static bool wm_xr_operator_sessionactive(bContext *C)
#define XR_DEFAULT_FLY_SPEED_MOVE
static void wm_xr_raycast_uninit(wmOperator *op)
static int wm_xr_navigation_grab_exec(bContext *, wmOperator *)
static int wm_xr_navigation_fly_exec(bContext *, wmOperator *)
void wm_xr_operatortypes_register()
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 void wm_xr_session_update_screen_on_exit_cb(const wmXrData *xr_data)
static int wm_xr_navigation_teleport_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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(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 const float g_xr_default_raycast_color[4]
static int wm_xr_navigation_grab_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int wm_xr_session_toggle_exec(bContext *C, wmOperator *)
static void WM_OT_xr_navigation_reset(wmOperatorType *ot)
static const float g_xr_default_raycast_axis[3]
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 int wm_xr_navigation_teleport_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int wm_xr_navigation_fly_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_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])