Blender V4.5
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 "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 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 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 wmOperatorStatus wm_xr_navigation_teleport_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus wm_xr_navigation_teleport_exec (bContext *, wmOperator *)
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)
Operator Registration
void wm_xr_operatortypes_register ()

XR Navigation Fly

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

#define XR_DEFAULT_FLY_SPEED_MOVE   0.054f
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 wmOperatorStatus wm_xr_navigation_fly_modal (bContext *C, wmOperator *op, const wmEvent *event)
static void WM_OT_xr_navigation_fly (wmOperatorType *ot)

XR Raycast Utilities

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

Macro Definition Documentation

◆ XR_DEFAULT_FLY_SPEED_MOVE

#define XR_DEFAULT_FLY_SPEED_MOVE   0.054f

Definition at line 781 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_fly().

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 783 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 207 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_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

Definition at line 815 of file wm_xr_operators.cc.

References wmOperator::customdata, data, and MEM_SAFE_FREE.

Referenced by wm_xr_navigation_fly_modal().

◆ 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 263 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 315 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 176 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

Definition at line 183 of file wm_xr_operators.cc.

References wmOperator::customdata, data, and MEM_SAFE_FREE.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_grab_update()

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

Definition at line 190 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_exec()

wmOperatorStatus wm_xr_navigation_fly_exec ( bContext * ,
wmOperator *  )
static

Definition at line 943 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

◆ 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 511 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 429 of file wm_xr_operators.cc.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_exec()

wmOperatorStatus wm_xr_navigation_grab_exec ( bContext * ,
wmOperator *  )
static

Definition at line 424 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 440 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 446 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_teleport()

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

◆ wm_xr_navigation_teleport_exec()

wmOperatorStatus wm_xr_navigation_teleport_exec ( bContext * ,
wmOperator *  )
static

Definition at line 1325 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_teleport().

◆ wm_xr_navigation_teleport_invoke()

◆ wm_xr_navigation_teleport_modal()

◆ 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_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 117 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 615 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().

◆ g_xr_default_raycast_color

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

Definition at line 616 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().