Blender  V3.3
Classes
wm_xr_operators.c File Reference
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_main.h"
#include "BKE_screen.h"
#include "DEG_depsgraph.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_transform_snap_object_context.h"
#include "ED_view3d.h"
#include "GHOST_Types.h"
#include "GPU_immediate.h"
#include "MEM_guardedalloc.h"
#include "PIL_time.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "WM_api.h"
#include "WM_types.h"
#include "wm_xr_intern.h"

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 *UNUSED(op))
 
static void WM_OT_xr_session_toggle (wmOperatorType *ot)
 
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 *UNUSED(C), wmOperator *UNUSED(op))
 
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 *UNUSED(C), wmOperator *UNUSED(op))
 
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 (void)
 

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
}
 
typedef enum eXrFlyMode eXrFlyMode
 
typedef struct XrFlyData XrFlyData
 
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 *UNUSED(C), wmOperator *UNUSED(op))
 
static int wm_xr_navigation_fly_modal (bContext *C, wmOperator *op, const wmEvent *event)
 
static void WM_OT_xr_navigation_fly (wmOperatorType *ot)
 

XR Grab Utilities

typedef struct XrGrabData XrGrabData
 
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 Raycast Utilities

typedef struct XrRaycastData XrRaycastData
 
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 *UNUSED(C), ARegion *UNUSED(region), 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, 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 758 of file wm_xr_operators.c.

◆ XR_DEFAULT_FLY_SPEED_TURN

#define XR_DEFAULT_FLY_SPEED_TURN   0.03f

Definition at line 759 of file wm_xr_operators.c.

Typedef Documentation

◆ eXrFlyMode

typedef enum eXrFlyMode eXrFlyMode

◆ XrFlyData

typedef struct XrFlyData XrFlyData

◆ XrGrabData

typedef struct XrGrabData XrGrabData

◆ XrRaycastData

typedef struct XrRaycastData XrRaycastData

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 761 of file wm_xr_operators.c.

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 197 of file wm_xr_operators.c.

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

Referenced by wm_xr_navlocks_apply().

◆ WM_OT_xr_navigation_fly()

static void WM_OT_xr_navigation_fly ( wmOperatorType ot)
static

◆ WM_OT_xr_navigation_grab()

static void WM_OT_xr_navigation_grab ( wmOperatorType ot)
static

◆ WM_OT_xr_navigation_reset()

static void WM_OT_xr_navigation_reset ( wmOperatorType ot)
static

◆ WM_OT_xr_navigation_teleport()

static void WM_OT_xr_navigation_teleport ( wmOperatorType ot)
static

◆ WM_OT_xr_session_toggle()

static void WM_OT_xr_session_toggle ( wmOperatorType ot)
static

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

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

◆ 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 792 of file wm_xr_operators.c.

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 253 of file wm_xr_operators.c.

References copy_m4_m4(), copy_v3_v3(), data, invert_m4(), mul_m4_m4m4(), blender::meshintersect::prev(), 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 305 of file wm_xr_operators.c.

References add_v3_v3v3(), cross_v3_v3v3(), data, invert_m4(), len_v3(), mul_m4_m4m4(), mul_v3_fl(), normalize_v3_v3(), blender::meshintersect::prev(), 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 168 of file wm_xr_operators.c.

References BLI_assert, wmOperator::customdata, MEM_callocN, and NULL.

Referenced by wm_xr_navigation_grab_invoke().

◆ wm_xr_grab_uninit()

static void wm_xr_grab_uninit ( wmOperator op)
static

Definition at line 175 of file wm_xr_operators.c.

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 180 of file wm_xr_operators.c.

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

Referenced by wm_xr_navigation_grab_invoke().

◆ wm_xr_navigation_fly_exec()

static int wm_xr_navigation_fly_exec ( bContext UNUSEDC,
wmOperator UNUSEDop 
)
static

Definition at line 916 of file wm_xr_operators.c.

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

static void wm_xr_navigation_grab_apply ( wmXrData xr,
const wmXrActionData *  actiondata,
const XrGrabData data,
bool  bimanual 
)
static

◆ 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 491 of file wm_xr_operators.c.

References copy_v3_v3(), data, 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 417 of file wm_xr_operators.c.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_exec()

static int wm_xr_navigation_grab_exec ( bContext UNUSEDC,
wmOperator UNUSEDop 
)
static

Definition at line 412 of file wm_xr_operators.c.

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 428 of file wm_xr_operators.c.

References data.

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 434 of file wm_xr_operators.c.

References data.

Referenced by wm_xr_navigation_grab_modal().

◆ wm_xr_navigation_grab_modal()

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

◆ wm_xr_navigation_reset_exec()

static int wm_xr_navigation_reset_exec ( bContext C,
wmOperator op 
)
static

◆ wm_xr_navigation_teleport()

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

◆ wm_xr_navigation_teleport_exec()

static int wm_xr_navigation_teleport_exec ( bContext UNUSEDC,
wmOperator UNUSEDop 
)
static

Definition at line 1289 of file wm_xr_operators.c.

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

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

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

static bool wm_xr_operator_test_event ( const wmOperator op,
const wmEvent event 
)
static

◆ wm_xr_operatortypes_register()

void wm_xr_operatortypes_register ( void  )

◆ 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,
Object **  r_ob,
float  r_obmat[4][4] 
)
static

◆ wm_xr_raycast_draw()

static void wm_xr_raycast_draw ( const bContext UNUSEDC,
ARegion UNUSEDregion,
void customdata 
)
static

◆ wm_xr_raycast_init()

static void wm_xr_raycast_init ( wmOperator op)
static

◆ wm_xr_raycast_uninit()

static void wm_xr_raycast_uninit ( wmOperator op)
static

◆ wm_xr_raycast_update()

static void wm_xr_raycast_update ( wmOperator op,
const wmXrData xr,
const wmXrActionData *  actiondata 
)
static

◆ wm_xr_session_toggle_exec()

static int wm_xr_session_toggle_exec ( bContext C,
wmOperator UNUSEDop 
)
static

◆ wm_xr_session_update_screen()

static void wm_xr_session_update_screen ( Main bmain,
const wmXrData xr_data 
)
static

◆ 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 109 of file wm_xr_operators.c.

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 593 of file wm_xr_operators.c.

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 594 of file wm_xr_operators.c.

Referenced by WM_OT_xr_navigation_teleport().