Blender V4.3
wm_xr_operators.cc File Reference
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_math_rotation.h"
#include "BLI_math_vector.h"
#include "BLI_time.h"
#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 "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 int 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 int wm_xr_navigation_grab_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
static int 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 int 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 int wm_xr_navigation_teleport_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
static int wm_xr_navigation_teleport_exec (bContext *, wmOperator *)
 
static int 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 int 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
 
#define XR_DEFAULT_FLY_SPEED_TURN   0.03f
 
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 int wm_xr_navigation_fly_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
static int wm_xr_navigation_fly_exec (bContext *, wmOperator *)
 
static int 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 769 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_fly().

◆ XR_DEFAULT_FLY_SPEED_TURN

#define XR_DEFAULT_FLY_SPEED_TURN   0.03f

Definition at line 770 of file wm_xr_operators.cc.

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 772 of file wm_xr_operators.cc.

Function Documentation

◆ orient_mat_z_normalized()

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

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

◆ WM_OT_xr_navigation_teleport()

◆ WM_OT_xr_session_toggle()

◆ wm_xr_basenav_rotation_calc()

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

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

◆ wm_xr_fly_init()

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

◆ wm_xr_fly_uninit()

static void wm_xr_fly_uninit ( wmOperator * op)
static

Definition at line 804 of file wm_xr_operators.cc.

References wmOperator::customdata, and MEM_SAFE_FREE.

Referenced by wm_xr_navigation_fly_modal().

◆ wm_xr_grab_compute()

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

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 258 of file wm_xr_operators.cc.

References copy_m4_m4(), copy_v3_v3(), 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()

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

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 310 of file wm_xr_operators.cc.

References add_v3_v3v3(), cross_v3_v3v3(), 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()

static void wm_xr_grab_init ( wmOperator * op)
static

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

static void wm_xr_grab_uninit ( wmOperator * op)
static

Definition at line 180 of file wm_xr_operators.cc.

References wmOperator::customdata, and MEM_SAFE_FREE.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_grab_update()

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

Definition at line 185 of file wm_xr_operators.cc.

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

Referenced by wm_xr_navigation_grab_invoke().

◆ wm_xr_navigation_fly_exec()

static int wm_xr_navigation_fly_exec ( bContext * ,
wmOperator *  )
static

Definition at line 928 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_fly().

◆ wm_xr_navigation_fly_invoke()

static int wm_xr_navigation_fly_invoke ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

◆ wm_xr_navigation_fly_modal()

static int 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()

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

Definition at line 504 of file wm_xr_operators.cc.

References copy_v3_v3(), and quat_to_mat4().

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_can_do_bimanual()

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

Definition at line 422 of file wm_xr_operators.cc.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_exec()

static int wm_xr_navigation_grab_exec ( bContext * ,
wmOperator *  )
static

Definition at line 417 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_grab().

◆ wm_xr_navigation_grab_invoke()

static int wm_xr_navigation_grab_invoke ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

◆ wm_xr_navigation_grab_is_bimanual_ending()

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

Definition at line 433 of file wm_xr_operators.cc.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_is_locked()

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

Definition at line 439 of file wm_xr_operators.cc.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_modal()

◆ wm_xr_navigation_reset_exec()

◆ wm_xr_navigation_teleport()

◆ wm_xr_navigation_teleport_exec()

static int wm_xr_navigation_teleport_exec ( bContext * ,
wmOperator *  )
static

Definition at line 1301 of file wm_xr_operators.cc.

References OPERATOR_CANCELLED.

Referenced by WM_OT_xr_navigation_teleport().

◆ wm_xr_navigation_teleport_invoke()

static int wm_xr_navigation_teleport_invoke ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

◆ wm_xr_navigation_teleport_modal()

◆ wm_xr_navlocks_apply()

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

◆ wm_xr_operator_sessionactive()

static bool wm_xr_operator_sessionactive ( bContext * C)
static

◆ wm_xr_operator_test_event()

◆ wm_xr_operatortypes_register()

◆ wm_xr_raycast()

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

◆ 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()

static void wm_xr_session_update_screen_on_exit_cb ( const wmXrData * xr_data)
static

Definition at line 114 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 606 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 607 of file wm_xr_operators.cc.

Referenced by WM_OT_xr_navigation_teleport().