Blender V5.0
wm_xr_operators.cc File Reference
#include "BLI_kdopbvh.hh"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_math_rotation.h"
#include "BLI_math_vector.h"
#include "BLI_time.h"
#include "BLT_translation.hh"
#include "BKE_context.hh"
#include "BKE_global.hh"
#include "BKE_idprop.hh"
#include "BKE_main.hh"
#include "BKE_screen.hh"
#include "DEG_depsgraph.hh"
#include "ED_screen.hh"
#include "ED_space_api.hh"
#include "ED_transform_snap_object_context.hh"
#include "ED_view3d.hh"
#include "GHOST_Types.h"
#include "GPU_immediate.hh"
#include "GPU_state.hh"
#include "GPU_batch_presets.hh"
#include "GPU_matrix.hh"
#include "GPU_xr_defines.hh"
#include "MEM_guardedalloc.h"
#include "RNA_access.hh"
#include "RNA_define.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "wm_xr_intern.hh"

Go to the source code of this file.

Classes

struct  XrGrabData
struct  XrRaycastData
struct  XrFlyData

Functions

Operator Conditions
static bool wm_xr_operator_sessionactive (bContext *C)
static bool wm_xr_operator_test_event (const wmOperator *op, const wmEvent *event)
XR Session Toggle

Toggles an XR session, creating an XR context if necessary.

static void wm_xr_session_update_screen (Main *bmain, const wmXrData *xr_data)
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 void WM_OT_xr_session_toggle (wmOperatorType *ot)
XR Grab Utilities
static void wm_xr_grab_init (wmOperator *op)
static void wm_xr_grab_uninit (wmOperator *op)
static void wm_xr_grab_update (wmOperator *op, const wmXrActionData *actiondata)
static void orient_mat_z_normalized (float R[4][4], const float z_axis[3])
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 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_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])
XR Navigation Grab

Navigates the scene by grabbing with XR controllers.

static wmOperatorStatus wm_xr_navigation_grab_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_grab_exec (bContext *, wmOperator *)
static bool wm_xr_navigation_grab_can_do_bimanual (const wmXrActionData *actiondata, const XrGrabData *data)
static bool wm_xr_navigation_grab_is_bimanual_ending (const wmXrActionData *actiondata, const XrGrabData *data)
static bool wm_xr_navigation_grab_is_locked (const XrGrabData *data, const bool bimanual)
static void wm_xr_navigation_grab_apply (wmXrData *xr, const wmXrActionData *actiondata, const XrGrabData *data, bool bimanual)
static void wm_xr_navigation_grab_bimanual_state_update (const wmXrActionData *actiondata, XrGrabData *data)
static void wm_xr_navigation_grab_cancel (bContext *, wmOperator *op)
static wmOperatorStatus wm_xr_navigation_grab_modal (bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_grab (wmOperatorType *ot)
XR Navigation Teleport

Casts a ray from an XR controller's pose and teleports to any hit geometry.

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 bool wm_xr_navigation_teleport_ground_plane (float points[XR_MAX_RAYCASTS+1][4], int *num_points, float *ray_dist)
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 wmOperatorStatus wm_xr_navigation_teleport_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_teleport_exec (bContext *, wmOperator *)
static void wm_xr_navigation_teleport_cancel (bContext *, wmOperator *op)
static wmOperatorStatus wm_xr_navigation_teleport_modal (bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_teleport (wmOperatorType *ot)
XR Navigation Reset

Resets XR navigation deltas relative to session base pose.

static wmOperatorStatus wm_xr_navigation_reset_exec (bContext *C, wmOperator *op)
static void WM_OT_xr_navigation_reset (wmOperatorType *ot)
XR Navigation Swap Hands

Resets XR navigation deltas relative to session base pose.

static wmOperatorStatus wm_xr_navigation_swap_hands_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_swap_hands_exec (bContext *, wmOperator *)
static wmOperatorStatus wm_xr_navigation_swap_hands_modal (bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_swap_hands (wmOperatorType *ot)
Operator Registration
void wm_xr_operatortypes_register ()

XR Raycast Utilities

enum  XrRaycastResult : uint8_t { XR_RAYCAST_MISS , XR_RAYCAST_HIT , XR_RAYCAST_FALLBACK }
static const float g_xr_default_raycast_axis [3] = {0.0f, 0.0f, -1.0f}
static const float g_xr_default_raycast_hit_color [4] = {0.35f, 0.35f, 1.0f, 1.0f}
static const float g_xr_default_raycast_miss_color [4] = {1.0f, 0.35f, 0.35f, 1.0f}
static const float g_xr_default_raycast_fallback_color [4] = {0.35f, 0.35f, 1.0f, 1.0f}
static void wm_xr_raycast_destination_draw (const XrRaycastData *data)
static void wm_xr_raycast_draw (const bContext *, ARegion *, void *customdata)
static void wm_xr_raycast_init (wmOperator *op)
static void wm_xr_raycast_uninit (wmOperator *op)
static void wm_xr_raycast_update (wmOperator *op, const wmXrData *xr, 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])

XR Navigation Fly

Navigates the scene by moving/turning relative to navigation space or the XR viewer or controller.

enum  eXrFlyMode {
  XR_FLY_FORWARD = 0 , XR_FLY_BACK = 1 , XR_FLY_LEFT = 2 , XR_FLY_RIGHT = 3 ,
  XR_FLY_UP = 4 , XR_FLY_DOWN = 5 , XR_FLY_TURNLEFT = 6 , XR_FLY_TURNRIGHT = 7 ,
  XR_FLY_VIEWER_FORWARD = 8 , XR_FLY_VIEWER_BACK = 9 , XR_FLY_VIEWER_LEFT = 10 , XR_FLY_VIEWER_RIGHT = 11 ,
  XR_FLY_CONTROLLER_FORWARD = 12
}
static void wm_xr_fly_init (wmOperator *op, const wmXrData *xr)
static void wm_xr_fly_uninit (wmOperator *op)
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_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])
static void wm_xr_basenav_rotation_calc (const wmXrData *xr, const float nav_rotation[4], float r_rotation[4])
static wmOperatorStatus wm_xr_navigation_fly_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_fly_exec (bContext *, wmOperator *)
static void wm_xr_navigation_fly_cancel (bContext *, wmOperator *op)
static wmOperatorStatus wm_xr_navigation_fly_modal (bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_fly (wmOperatorType *ot)

Enumeration Type Documentation

◆ eXrFlyMode

enum eXrFlyMode
Enumerator
XR_FLY_FORWARD 
XR_FLY_BACK 
XR_FLY_LEFT 
XR_FLY_RIGHT 
XR_FLY_UP 
XR_FLY_DOWN 
XR_FLY_TURNLEFT 
XR_FLY_TURNRIGHT 
XR_FLY_VIEWER_FORWARD 
XR_FLY_VIEWER_BACK 
XR_FLY_VIEWER_LEFT 
XR_FLY_VIEWER_RIGHT 
XR_FLY_CONTROLLER_FORWARD 

Definition at line 845 of file wm_xr_operators.cc.

◆ XrRaycastResult

enum XrRaycastResult : uint8_t
Enumerator
XR_RAYCAST_MISS 
XR_RAYCAST_HIT 
XR_RAYCAST_FALLBACK 

Definition at line 632 of file wm_xr_operators.cc.

Function Documentation

◆ orient_mat_z_normalized()

void orient_mat_z_normalized ( float R[4][4],
const float z_axis[3] )
static

Definition at line 211 of file wm_xr_operators.cc.

References cross_v3_v3v3(), len_v3(), mul_v3_v3fl(), normalize_v3(), and R.

Referenced by wm_xr_navlocks_apply().

◆ WM_OT_xr_navigation_fly()

◆ WM_OT_xr_navigation_grab()

◆ WM_OT_xr_navigation_reset()

void WM_OT_xr_navigation_reset ( wmOperatorType * ot)
static

◆ WM_OT_xr_navigation_swap_hands()

◆ WM_OT_xr_navigation_teleport()

◆ WM_OT_xr_session_toggle()

void WM_OT_xr_session_toggle ( wmOperatorType * ot)
static

◆ wm_xr_basenav_rotation_calc()

void wm_xr_basenav_rotation_calc ( const wmXrData * xr,
const float nav_rotation[4],
float r_rotation[4] )
static

◆ wm_xr_fly_compute_move()

◆ wm_xr_fly_compute_turn()

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] )
static

◆ wm_xr_fly_init()

void wm_xr_fly_init ( wmOperator * op,
const wmXrData * xr )
static

◆ wm_xr_fly_uninit()

void wm_xr_fly_uninit ( wmOperator * op)
static

◆ wm_xr_grab_compute()

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

Compute transformation delta for a one-handed grab interaction.

Parameters
actiondataContains current controller pose in world space.
dataContains previous controller pose in world space.

The delta is computed as the difference between the current and previous controller poses i.e. delta = curr * prev^-1.

Definition at line 267 of file wm_xr_operators.cc.

References copy_m4_m4(), copy_v3_v3(), data, invert_m4(), mul_m4_m4m4(), quat_to_mat4(), unit_m4(), wm_xr_navlocks_apply(), and zero_v3().

Referenced by wm_xr_navigation_grab_apply().

◆ wm_xr_grab_compute_bimanual()

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

Compute transformation delta for a two-handed (bimanual) grab interaction.

Parameters
actiondataContains current controller poses in world space.
dataContains previous controller poses in world space.

The delta is computed as the difference (delta = curr * prev^-1) between the current and previous transformations, where the transformations themselves are determined as follows:

  • Translation: Averaged controller positions.
  • Rotation: Rotation of axis line between controllers.
  • Scale: Distance between controllers.

Definition at line 319 of file wm_xr_operators.cc.

References add_v3_v3v3(), cross_v3_v3v3(), data, invert_m4(), len_v3(), mul_m4_m4m4(), mul_v3_fl(), normalize_v3_v3(), quat_to_mat3(), sub_v3_v3v3(), unit_m4(), v, and wm_xr_navlocks_apply().

Referenced by wm_xr_navigation_grab_apply().

◆ wm_xr_grab_init()

void wm_xr_grab_init ( wmOperator * op)
static

Definition at line 180 of file wm_xr_operators.cc.

References BLI_assert, wmOperator::customdata, and MEM_callocN().

Referenced by wm_xr_navigation_grab_invoke().

◆ wm_xr_grab_uninit()

void wm_xr_grab_uninit ( wmOperator * op)
static

◆ wm_xr_grab_update()

void wm_xr_grab_update ( wmOperator * op,
const wmXrActionData * actiondata )
static

Definition at line 194 of file wm_xr_operators.cc.

References copy_v3_v3(), wmOperator::customdata, data, and quat_to_mat4().

Referenced by wm_xr_navigation_grab_invoke().

◆ wm_xr_navigation_fly_cancel()

void wm_xr_navigation_fly_cancel ( bContext * ,
wmOperator * op )
static

Definition at line 1013 of file wm_xr_operators.cc.

References wm_xr_fly_uninit().

Referenced by WM_OT_xr_navigation_fly().

◆ wm_xr_navigation_fly_exec()

wmOperatorStatus wm_xr_navigation_fly_exec ( bContext * ,
wmOperator *  )
static

Definition at line 1008 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_fly().

◆ wm_xr_navigation_fly_invoke()

◆ wm_xr_navigation_fly_modal()

wmOperatorStatus wm_xr_navigation_fly_modal ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

Definition at line 1018 of file wm_xr_operators.cc.

References XrSessionSettings::base_scale, BLI_assert_unreachable, BLI_time_now_seconds(), C, copy_qt_qt(), CTX_wm_manager(), wmOperator::customdata, data, ELEM, fabsf, XrSessionSettings::fly_speed, interp_v2_v2v2v2v2_cubic(), KM_PRESS, KM_RELEASE, len_v2(), mat4_to_quat(), mul_m4_m4m4(), OPERATOR_CANCELLED, OPERATOR_FINISHED, OPERATOR_PASS_THROUGH, OPERATOR_RUNNING_MODAL, out, wmOperator::ptr, RNA_boolean_get(), RNA_enum_get(), RNA_float_get(), RNA_property_float_get_array(), RNA_property_is_set(), RNA_struct_find_property(), wmXrData::runtime, wmXrData::session_settings, wmXrRuntimeData::session_state, wmXrSessionState::swap_hands, U, unit_m4(), USER_XR_NAV_INVERT_ROTATION, USER_XR_NAV_SNAP_TURN, wmEvent::val, wm_xr_basenav_rotation_calc(), wm_xr_fly_compute_move(), wm_xr_fly_compute_turn(), wm_xr_fly_uninit(), wm_xr_operator_test_event(), wm_xr_pose_to_imat(), wm_xr_pose_to_mat(), WM_xr_session_state_nav_location_get(), WM_xr_session_state_nav_location_set(), WM_xr_session_state_nav_rotation_get(), WM_xr_session_state_nav_rotation_set(), WM_xr_session_state_nav_scale_get(), WM_xr_session_state_viewer_pose_location_get(), WM_xr_session_state_viewer_pose_rotation_get(), WM_xr_session_state_vignette_activate(), wmWindowManager::xr, XR_BOOLEAN_INPUT, XR_FLOAT_INPUT, XR_FLY_BACK, XR_FLY_CONTROLLER_FORWARD, XR_FLY_DOWN, XR_FLY_FORWARD, XR_FLY_LEFT, XR_FLY_RIGHT, XR_FLY_TURNLEFT, XR_FLY_TURNRIGHT, XR_FLY_UP, XR_FLY_VIEWER_BACK, XR_FLY_VIEWER_FORWARD, XR_FLY_VIEWER_LEFT, XR_FLY_VIEWER_RIGHT, XR_POSE_INPUT, XR_VECTOR2F_INPUT, and XR_VIBRATION_OUTPUT.

Referenced by WM_OT_xr_navigation_fly().

◆ wm_xr_navigation_grab_apply()

◆ wm_xr_navigation_grab_bimanual_state_update()

void wm_xr_navigation_grab_bimanual_state_update ( const wmXrActionData * actiondata,
XrGrabData * data )
static

Definition at line 515 of file wm_xr_operators.cc.

References copy_v3_v3(), data, and quat_to_mat4().

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_can_do_bimanual()

bool wm_xr_navigation_grab_can_do_bimanual ( const wmXrActionData * actiondata,
const XrGrabData * data )
static

Definition at line 433 of file wm_xr_operators.cc.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_cancel()

void wm_xr_navigation_grab_cancel ( bContext * ,
wmOperator * op )
static

Definition at line 536 of file wm_xr_operators.cc.

References wm_xr_grab_uninit().

Referenced by WM_OT_xr_navigation_grab().

◆ wm_xr_navigation_grab_exec()

wmOperatorStatus wm_xr_navigation_grab_exec ( bContext * ,
wmOperator *  )
static

Definition at line 428 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_grab().

◆ wm_xr_navigation_grab_invoke()

◆ wm_xr_navigation_grab_is_bimanual_ending()

bool wm_xr_navigation_grab_is_bimanual_ending ( const wmXrActionData * actiondata,
const XrGrabData * data )
static

Definition at line 444 of file wm_xr_operators.cc.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_is_locked()

bool wm_xr_navigation_grab_is_locked ( const XrGrabData * data,
const bool bimanual )
static

Definition at line 450 of file wm_xr_operators.cc.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_modal()

◆ wm_xr_navigation_reset_exec()

◆ wm_xr_navigation_swap_hands_exec()

wmOperatorStatus wm_xr_navigation_swap_hands_exec ( bContext * ,
wmOperator *  )
static

Definition at line 1953 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_swap_hands().

◆ wm_xr_navigation_swap_hands_invoke()

◆ wm_xr_navigation_swap_hands_modal()

◆ wm_xr_navigation_teleport()

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

◆ wm_xr_navigation_teleport_cancel()

void wm_xr_navigation_teleport_cancel ( bContext * ,
wmOperator * op )
static

Definition at line 1614 of file wm_xr_operators.cc.

References wm_xr_raycast_uninit().

Referenced by WM_OT_xr_navigation_teleport().

◆ wm_xr_navigation_teleport_exec()

wmOperatorStatus wm_xr_navigation_teleport_exec ( bContext * ,
wmOperator *  )
static

Definition at line 1609 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_teleport().

◆ wm_xr_navigation_teleport_ground_plane()

bool wm_xr_navigation_teleport_ground_plane ( float points[XR_MAX_RAYCASTS+1][4],
int * num_points,
float * ray_dist )
static

Definition at line 1415 of file wm_xr_operators.cc.

References i, interp_v3_v3v3(), len_v3v3(), XR_MAX_RAYCASTS, and z().

Referenced by wm_xr_navigation_teleport().

◆ wm_xr_navigation_teleport_invoke()

◆ wm_xr_navigation_teleport_modal()

◆ wm_xr_navigation_teleport_pose_calc()

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

◆ wm_xr_navlocks_apply()

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

◆ wm_xr_operator_sessionactive()

◆ wm_xr_operator_test_event()

◆ wm_xr_operatortypes_register()

◆ wm_xr_raycast()

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

◆ wm_xr_raycast_destination_draw()

◆ wm_xr_raycast_draw()

◆ wm_xr_raycast_init()

◆ wm_xr_raycast_uninit()

◆ wm_xr_raycast_update()

◆ wm_xr_session_toggle_exec()

◆ wm_xr_session_update_screen()

◆ wm_xr_session_update_screen_on_exit_cb()

void wm_xr_session_update_screen_on_exit_cb ( const wmXrData * xr_data)
static

Definition at line 121 of file wm_xr_operators.cc.

References G_MAIN, and wm_xr_session_update_screen().

Referenced by wm_xr_session_toggle_exec().

Variable Documentation

◆ g_xr_default_raycast_axis

const float g_xr_default_raycast_axis[3] = {0.0f, 0.0f, -1.0f}
static

Definition at line 627 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().

◆ g_xr_default_raycast_fallback_color

const float g_xr_default_raycast_fallback_color[4] = {0.35f, 0.35f, 1.0f, 1.0f}
static

Definition at line 630 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().

◆ g_xr_default_raycast_hit_color

const float g_xr_default_raycast_hit_color[4] = {0.35f, 0.35f, 1.0f, 1.0f}
static

Definition at line 628 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().

◆ g_xr_default_raycast_miss_color

const float g_xr_default_raycast_miss_color[4] = {1.0f, 0.35f, 0.35f, 1.0f}
static

Definition at line 629 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().