Blender  V3.3
Typedefs | Enumerations | Functions | Variables
wm_xr_session.c File Reference
#include "BKE_callbacks.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_main.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "DNA_camera_types.h"
#include "DNA_space_types.h"
#include "DRW_engine.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "GHOST_C-api.h"
#include "GPU_batch.h"
#include "GPU_viewport.h"
#include "MEM_guardedalloc.h"
#include "PIL_time.h"
#include "WM_api.h"
#include "WM_types.h"
#include "wm_event_system.h"
#include "wm_surface.h"
#include "wm_window.h"
#include "wm_xr_intern.h"

Go to the source code of this file.

Typedefs

typedef enum wmXrSessionStateEvent wmXrSessionStateEvent
 

Enumerations

enum  wmXrSessionStateEvent { SESSION_STATE_EVENT_NONE = 0 , SESSION_STATE_EVENT_START , SESSION_STATE_EVENT_RESET_TO_BASE_POSE , SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE }
 

Functions

static void wm_xr_session_create_cb (void)
 
static void wm_xr_session_controller_data_free (wmXrSessionState *state)
 
void wm_xr_session_data_free (wmXrSessionState *state)
 
static void wm_xr_session_exit_cb (void *customdata)
 
static void wm_xr_session_begin_info_create (wmXrData *xr_data, GHOST_XrSessionBeginInfo *r_begin_info)
 
void wm_xr_session_toggle (wmWindowManager *wm, wmWindow *session_root_win, wmXrSessionExitFn session_exit_fn)
 
bool WM_xr_session_exists (const wmXrData *xr)
 
void WM_xr_session_base_pose_reset (wmXrData *xr)
 
bool WM_xr_session_is_ready (const wmXrData *xr)
 
static void wm_xr_session_base_pose_calc (const Scene *scene, const XrSessionSettings *settings, GHOST_XrPose *r_base_pose, float *r_base_scale)
 
static void wm_xr_session_draw_data_populate (wmXrData *xr_data, Scene *scene, Depsgraph *depsgraph, wmXrDrawData *r_draw_data)
 
wmWindowwm_xr_session_root_window_or_fallback_get (const wmWindowManager *wm, const wmXrRuntimeData *runtime_data)
 
static void wm_xr_session_scene_and_depsgraph_get (const wmWindowManager *wm, Scene **r_scene, Depsgraph **r_depsgraph)
 
static bool wm_xr_session_draw_data_needs_reset_to_base_pose (const wmXrSessionState *state, const XrSessionSettings *settings)
 
static wmXrSessionStateEvent wm_xr_session_state_to_event (const wmXrSessionState *state, const XrSessionSettings *settings)
 
void wm_xr_session_draw_data_update (wmXrSessionState *state, const XrSessionSettings *settings, const GHOST_XrDrawViewInfo *draw_view, wmXrDrawData *draw_data)
 
void wm_xr_session_state_update (const XrSessionSettings *settings, const wmXrDrawData *draw_data, const GHOST_XrDrawViewInfo *draw_view, wmXrSessionState *state)
 
wmXrSessionStateWM_xr_session_state_handle_get (const wmXrData *xr)
 
ScrAreaWM_xr_session_area_get (const wmXrData *xr)
 
bool WM_xr_session_state_viewer_pose_location_get (const wmXrData *xr, float r_location[3])
 
bool WM_xr_session_state_viewer_pose_rotation_get (const wmXrData *xr, float r_rotation[4])
 
bool WM_xr_session_state_viewer_pose_matrix_info_get (const wmXrData *xr, float r_viewmat[4][4], float *r_focal_len)
 
bool WM_xr_session_state_controller_grip_location_get (const wmXrData *xr, unsigned int subaction_idx, float r_location[3])
 
bool WM_xr_session_state_controller_grip_rotation_get (const wmXrData *xr, unsigned int subaction_idx, float r_rotation[4])
 
bool WM_xr_session_state_controller_aim_location_get (const wmXrData *xr, unsigned int subaction_idx, float r_location[3])
 
bool WM_xr_session_state_controller_aim_rotation_get (const wmXrData *xr, unsigned int subaction_idx, float r_rotation[4])
 
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_state_nav_rotation_get (const wmXrData *xr, float r_rotation[4])
 
void WM_xr_session_state_nav_rotation_set (wmXrData *xr, const float rotation[4])
 
bool WM_xr_session_state_nav_scale_get (const wmXrData *xr, float *r_scale)
 
void WM_xr_session_state_nav_scale_set (wmXrData *xr, float scale)
 
void WM_xr_session_state_navigation_reset (wmXrSessionState *state)
 
XR-Session Actions

XR action processing and event dispatching.

void wm_xr_session_actions_init (wmXrData *xr)
 
static void wm_xr_session_controller_pose_calc (const GHOST_XrPose *raw_pose, const float view_ofs[3], const float base_mat[4][4], const float nav_mat[4][4], GHOST_XrPose *r_pose, float r_mat[4][4], float r_mat_base[4][4])
 
static void wm_xr_session_controller_data_update (const XrSessionSettings *settings, const wmXrAction *grip_action, const wmXrAction *aim_action, GHOST_XrContextHandle xr_context, wmXrSessionState *state)
 
static const GHOST_XrPose * wm_xr_session_controller_aim_pose_find (const wmXrSessionState *state, const char *subaction_path)
 
BLI_INLINE bool test_float_state (const float *state, float threshold, eXrAxisFlag flag)
 
BLI_INLINE bool test_vec2f_state (const float state[2], float threshold, eXrAxisFlag flag)
 
static bool wm_xr_session_modal_action_test (const ListBase *active_modal_actions, const wmXrAction *action, bool *r_found)
 
static void wm_xr_session_modal_action_test_add (ListBase *active_modal_actions, const wmXrAction *action)
 
static void wm_xr_session_modal_action_remove (ListBase *active_modal_actions, const wmXrAction *action)
 
static wmXrHapticActionwm_xr_session_haptic_action_find (ListBase *active_haptic_actions, const wmXrAction *action, const char *subaction_path)
 
static void wm_xr_session_haptic_action_add (ListBase *active_haptic_actions, const wmXrAction *action, const char *subaction_path, int64_t time_now)
 
static void wm_xr_session_haptic_action_remove (ListBase *active_haptic_actions, const wmXrAction *action)
 
static void wm_xr_session_haptic_timers_check (ListBase *active_haptic_actions, int64_t time_now)
 
static void wm_xr_session_action_states_interpret (wmXrData *xr, const char *action_set_name, wmXrAction *action, unsigned int subaction_idx, ListBase *active_modal_actions, ListBase *active_haptic_actions, int64_t time_now, bool modal, bool haptic, short *r_val)
 
static bool wm_xr_session_action_test_bimanual (const wmXrSessionState *session_state, wmXrAction *action, unsigned int subaction_idx, unsigned int *r_subaction_idx_other, const GHOST_XrPose **r_aim_pose_other)
 
static wmXrActionData * wm_xr_session_event_create (const char *action_set_name, const wmXrAction *action, const GHOST_XrPose *controller_aim_pose, const GHOST_XrPose *controller_aim_pose_other, unsigned int subaction_idx, unsigned int subaction_idx_other, bool bimanual)
 
static void wm_xr_session_events_dispatch (wmXrData *xr, GHOST_XrContextHandle xr_context, wmXrActionSet *action_set, wmXrSessionState *session_state, wmWindow *win)
 
void wm_xr_session_actions_update (wmWindowManager *wm)
 
void wm_xr_session_controller_data_populate (const wmXrAction *grip_action, const wmXrAction *aim_action, wmXrData *xr)
 
void wm_xr_session_controller_data_clear (wmXrSessionState *state)
 
XR-Session Surface

A wmSurface is used to manage drawing of the VR viewport. It's created and destroyed with the session.

static void wm_xr_session_surface_draw (bContext *C)
 Call Ghost-XR to draw a frame. More...
 
static void wm_xr_session_do_depsgraph (bContext *C)
 
bool wm_xr_session_surface_offscreen_ensure (wmXrSurfaceData *surface_data, const GHOST_XrDrawViewInfo *draw_view)
 
static void wm_xr_session_surface_free_data (wmSurface *surface)
 
static wmSurfacewm_xr_session_surface_create (void)
 
voidwm_xr_session_gpu_binding_context_create (void)
 
void wm_xr_session_gpu_binding_context_destroy (GHOST_ContextHandle UNUSED(context))
 
ARegionTypeWM_xr_surface_controller_region_type_get (void)
 

Variables

static wmSurfaceg_xr_surface = NULL
 
static CLG_LogRef LOG = {"wm.xr"}
 

Typedef Documentation

◆ wmXrSessionStateEvent

Enumeration Type Documentation

◆ wmXrSessionStateEvent

Enumerator
SESSION_STATE_EVENT_NONE 
SESSION_STATE_EVENT_START 
SESSION_STATE_EVENT_RESET_TO_BASE_POSE 
SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE 

Definition at line 249 of file wm_xr_session.c.

Function Documentation

◆ test_float_state()

BLI_INLINE bool test_float_state ( const float state,
float  threshold,
eXrAxisFlag  flag 
)

◆ test_vec2f_state()

BLI_INLINE bool test_vec2f_state ( const float  state[2],
float  threshold,
eXrAxisFlag  flag 
)

◆ wm_xr_session_action_states_interpret()

static void wm_xr_session_action_states_interpret ( wmXrData xr,
const char *  action_set_name,
wmXrAction action,
unsigned int  subaction_idx,
ListBase active_modal_actions,
ListBase active_haptic_actions,
int64_t  time_now,
bool  modal,
bool  haptic,
short *  r_val 
)
static

◆ wm_xr_session_action_test_bimanual()

static bool wm_xr_session_action_test_bimanual ( const wmXrSessionState session_state,
wmXrAction action,
unsigned int  subaction_idx,
unsigned int *  r_subaction_idx_other,
const GHOST_XrPose **  r_aim_pose_other 
)
static

◆ wm_xr_session_actions_init()

void wm_xr_session_actions_init ( wmXrData xr)

Definition at line 577 of file wm_xr_session.c.

References wmXrRuntimeData::context, and wmXrData::runtime.

Referenced by wm_xr_session_create_cb().

◆ wm_xr_session_actions_update()

void wm_xr_session_actions_update ( wmWindowManager wm)

◆ WM_xr_session_area_get()

ScrArea* WM_xr_session_area_get ( const wmXrData xr)

Definition at line 391 of file wm_xr_session.c.

References wmXrRuntimeData::area, NULL, and wmXrData::runtime.

◆ wm_xr_session_base_pose_calc()

static void wm_xr_session_base_pose_calc ( const Scene scene,
const XrSessionSettings settings,
GHOST_XrPose *  r_base_pose,
float r_base_scale 
)
static

◆ WM_xr_session_base_pose_reset()

void WM_xr_session_base_pose_reset ( wmXrData xr)

◆ wm_xr_session_begin_info_create()

static void wm_xr_session_begin_info_create ( wmXrData xr_data,
GHOST_XrSessionBeginInfo *  r_begin_info 
)
static

Definition at line 107 of file wm_xr_session.c.

References wm_xr_session_create_cb(), and wm_xr_session_exit_cb().

Referenced by wm_xr_session_toggle().

◆ wm_xr_session_controller_aim_pose_find()

static const GHOST_XrPose* wm_xr_session_controller_aim_pose_find ( const wmXrSessionState state,
const char *  subaction_path 
)
static

◆ wm_xr_session_controller_data_clear()

void wm_xr_session_controller_data_clear ( wmXrSessionState state)

◆ wm_xr_session_controller_data_free()

static void wm_xr_session_controller_data_free ( wmXrSessionState state)
static

◆ wm_xr_session_controller_data_populate()

void wm_xr_session_controller_data_populate ( const wmXrAction grip_action,
const wmXrAction aim_action,
wmXrData xr 
)

◆ wm_xr_session_controller_data_update()

static void wm_xr_session_controller_data_update ( const XrSessionSettings settings,
const wmXrAction grip_action,
const wmXrAction aim_action,
GHOST_XrContextHandle  xr_context,
wmXrSessionState state 
)
static

◆ wm_xr_session_controller_pose_calc()

static void wm_xr_session_controller_pose_calc ( const GHOST_XrPose *  raw_pose,
const float  view_ofs[3],
const float  base_mat[4][4],
const float  nav_mat[4][4],
GHOST_XrPose *  r_pose,
float  r_mat[4][4],
float  r_mat_base[4][4] 
)
static

◆ wm_xr_session_create_cb()

static void wm_xr_session_create_cb ( void  )
static

◆ wm_xr_session_data_free()

void wm_xr_session_data_free ( wmXrSessionState state)

Definition at line 85 of file wm_xr_session.c.

References state, and wm_xr_session_controller_data_free().

Referenced by wm_xr_runtime_data_free().

◆ wm_xr_session_do_depsgraph()

static void wm_xr_session_do_depsgraph ( bContext C)
static

◆ wm_xr_session_draw_data_needs_reset_to_base_pose()

static bool wm_xr_session_draw_data_needs_reset_to_base_pose ( const wmXrSessionState state,
const XrSessionSettings settings 
)
static

◆ wm_xr_session_draw_data_populate()

static void wm_xr_session_draw_data_populate ( wmXrData xr_data,
Scene scene,
Depsgraph depsgraph,
wmXrDrawData r_draw_data 
)
static

◆ wm_xr_session_draw_data_update()

void wm_xr_session_draw_data_update ( wmXrSessionState state,
const XrSessionSettings settings,
const GHOST_XrDrawViewInfo *  draw_view,
wmXrDrawData draw_data 
)

◆ wm_xr_session_event_create()

static wmXrActionData* wm_xr_session_event_create ( const char *  action_set_name,
const wmXrAction action,
const GHOST_XrPose *  controller_aim_pose,
const GHOST_XrPose *  controller_aim_pose_other,
unsigned int  subaction_idx,
unsigned int  subaction_idx_other,
bool  bimanual 
)
static

◆ wm_xr_session_events_dispatch()

static void wm_xr_session_events_dispatch ( wmXrData xr,
GHOST_XrContextHandle  xr_context,
wmXrActionSet action_set,
wmXrSessionState session_state,
wmWindow win 
)
static

◆ WM_xr_session_exists()

bool WM_xr_session_exists ( const wmXrData xr)

◆ wm_xr_session_exit_cb()

static void wm_xr_session_exit_cb ( void customdata)
static

◆ wm_xr_session_gpu_binding_context_create()

void* wm_xr_session_gpu_binding_context_create ( void  )

◆ wm_xr_session_gpu_binding_context_destroy()

void wm_xr_session_gpu_binding_context_destroy ( GHOST_ContextHandle   UNUSEDcontext)

◆ wm_xr_session_haptic_action_add()

static void wm_xr_session_haptic_action_add ( ListBase active_haptic_actions,
const wmXrAction action,
const char *  subaction_path,
int64_t  time_now 
)
static

◆ wm_xr_session_haptic_action_find()

static wmXrHapticAction* wm_xr_session_haptic_action_find ( ListBase active_haptic_actions,
const wmXrAction action,
const char *  subaction_path 
)
static

◆ wm_xr_session_haptic_action_remove()

static void wm_xr_session_haptic_action_remove ( ListBase active_haptic_actions,
const wmXrAction action 
)
static

Definition at line 796 of file wm_xr_session.c.

References BLI_freelinkN(), and LISTBASE_FOREACH.

Referenced by wm_xr_session_action_states_interpret().

◆ wm_xr_session_haptic_timers_check()

static void wm_xr_session_haptic_timers_check ( ListBase active_haptic_actions,
int64_t  time_now 
)
static

Definition at line 807 of file wm_xr_session.c.

References BLI_freelinkN(), and LISTBASE_FOREACH_MUTABLE.

Referenced by wm_xr_session_events_dispatch().

◆ WM_xr_session_is_ready()

bool WM_xr_session_is_ready ( const wmXrData xr)

◆ wm_xr_session_modal_action_remove()

static void wm_xr_session_modal_action_remove ( ListBase active_modal_actions,
const wmXrAction action 
)
static

Definition at line 753 of file wm_xr_session.c.

References BLI_freelinkN(), and LISTBASE_FOREACH.

Referenced by wm_xr_session_action_states_interpret().

◆ wm_xr_session_modal_action_test()

static bool wm_xr_session_modal_action_test ( const ListBase active_modal_actions,
const wmXrAction action,
bool r_found 
)
static

◆ wm_xr_session_modal_action_test_add()

static void wm_xr_session_modal_action_test_add ( ListBase active_modal_actions,
const wmXrAction action 
)
static

◆ wm_xr_session_root_window_or_fallback_get()

wmWindow* wm_xr_session_root_window_or_fallback_get ( const wmWindowManager wm,
const wmXrRuntimeData runtime_data 
)

◆ wm_xr_session_scene_and_depsgraph_get()

static void wm_xr_session_scene_and_depsgraph_get ( const wmWindowManager wm,
Scene **  r_scene,
Depsgraph **  r_depsgraph 
)
static

Get the scene and depsgraph shown in the VR session's root window (the window the session was started from) if still available. If it's not available, use some fallback window.

It's important that the VR session follows some existing window, otherwise it would need to have an own depsgraph, which is an expense we should avoid.

Definition at line 233 of file wm_xr_session.c.

References BKE_scene_get_depsgraph(), BLI_assert, depsgraph, wmXrData::runtime, scene, WM_window_get_active_scene(), WM_window_get_active_view_layer(), wm_xr_session_root_window_or_fallback_get(), and wmWindowManager::xr.

Referenced by wm_xr_session_do_depsgraph(), and wm_xr_session_surface_draw().

◆ WM_xr_session_state_controller_aim_location_get()

bool WM_xr_session_state_controller_aim_location_get ( const wmXrData xr,
unsigned int  subaction_idx,
float  r_location[3] 
)

◆ WM_xr_session_state_controller_aim_rotation_get()

bool WM_xr_session_state_controller_aim_rotation_get ( const wmXrData xr,
unsigned int  subaction_idx,
float  r_rotation[4] 
)

◆ WM_xr_session_state_controller_grip_location_get()

bool WM_xr_session_state_controller_grip_location_get ( const wmXrData xr,
unsigned int  subaction_idx,
float  r_location[3] 
)

◆ WM_xr_session_state_controller_grip_rotation_get()

bool WM_xr_session_state_controller_grip_rotation_get ( const wmXrData xr,
unsigned int  subaction_idx,
float  r_rotation[4] 
)

◆ WM_xr_session_state_handle_get()

wmXrSessionState* WM_xr_session_state_handle_get ( const wmXrData xr)

Definition at line 386 of file wm_xr_session.c.

References NULL, wmXrData::runtime, and wmXrRuntimeData::session_state.

◆ WM_xr_session_state_nav_location_get()

bool WM_xr_session_state_nav_location_get ( const wmXrData xr,
float  r_location[3] 
)

◆ WM_xr_session_state_nav_location_set()

void WM_xr_session_state_nav_location_set ( wmXrData xr,
const float  location[3] 
)

◆ WM_xr_session_state_nav_rotation_get()

bool WM_xr_session_state_nav_rotation_get ( const wmXrData xr,
float  r_rotation[4] 
)

◆ WM_xr_session_state_nav_rotation_set()

void WM_xr_session_state_nav_rotation_set ( wmXrData xr,
const float  rotation[4] 
)

◆ WM_xr_session_state_nav_scale_get()

bool WM_xr_session_state_nav_scale_get ( const wmXrData xr,
float r_scale 
)

◆ WM_xr_session_state_nav_scale_set()

void WM_xr_session_state_nav_scale_set ( wmXrData xr,
float  scale 
)

◆ WM_xr_session_state_navigation_reset()

void WM_xr_session_state_navigation_reset ( wmXrSessionState state)

Definition at line 562 of file wm_xr_session.c.

References state, unit_qt(), and zero_v3().

Referenced by wm_xr_session_create_cb(), and wm_xr_session_draw_data_update().

◆ wm_xr_session_state_to_event()

static wmXrSessionStateEvent wm_xr_session_state_to_event ( const wmXrSessionState state,
const XrSessionSettings settings 
)
static

◆ wm_xr_session_state_update()

void wm_xr_session_state_update ( const XrSessionSettings settings,
const wmXrDrawData draw_data,
const GHOST_XrDrawViewInfo *  draw_view,
wmXrSessionState state 
)

◆ WM_xr_session_state_viewer_pose_location_get()

bool WM_xr_session_state_viewer_pose_location_get ( const wmXrData xr,
float  r_location[3] 
)

◆ WM_xr_session_state_viewer_pose_matrix_info_get()

bool WM_xr_session_state_viewer_pose_matrix_info_get ( const wmXrData xr,
float  r_viewmat[4][4],
float r_focal_len 
)

◆ WM_xr_session_state_viewer_pose_rotation_get()

bool WM_xr_session_state_viewer_pose_rotation_get ( const wmXrData xr,
float  r_rotation[4] 
)

◆ wm_xr_session_surface_create()

static wmSurface* wm_xr_session_surface_create ( void  )
static

◆ wm_xr_session_surface_draw()

static void wm_xr_session_surface_draw ( bContext C)
static

Call Ghost-XR to draw a frame.

Draw callback for the XR-session surface. It's expected to be called on each main loop iteration and tells Ghost-XR to submit a new frame by drawing its views. Note that for drawing each view, wm_xr_draw_view() will be called through Ghost-XR (see GHOST_XrDrawViewFunc()).

Definition at line 1303 of file wm_xr_session.c.

References C, wmXrRuntimeData::context, CTX_wm_manager(), depsgraph, GPU_framebuffer_active_get(), GPU_framebuffer_restore(), wmXrData::runtime, scene, wm_xr_session_draw_data_populate(), WM_xr_session_is_ready(), wm_xr_session_scene_and_depsgraph_get(), and wmWindowManager::xr.

Referenced by wm_xr_session_surface_create().

◆ wm_xr_session_surface_free_data()

static void wm_xr_session_surface_free_data ( wmSurface surface)
static

◆ wm_xr_session_surface_offscreen_ensure()

bool wm_xr_session_surface_offscreen_ensure ( wmXrSurfaceData surface_data,
const GHOST_XrDrawViewInfo *  draw_view 
)

◆ wm_xr_session_toggle()

void wm_xr_session_toggle ( wmWindowManager wm,
wmWindow session_root_win,
wmXrSessionExitFn  session_exit_fn 
)

◆ WM_xr_surface_controller_region_type_get()

ARegionType* WM_xr_surface_controller_region_type_get ( void  )

Definition at line 1492 of file wm_xr_session.c.

References wmSurface::customdata, data, g_xr_surface, and NULL.

Referenced by DRW_draw_callbacks_post_scene().

Variable Documentation

◆ g_xr_surface

wmSurface* g_xr_surface = NULL
static

◆ LOG

CLG_LogRef LOG = {"wm.xr"}
static

Definition at line 47 of file wm_xr_session.c.

Referenced by wm_xr_session_surface_offscreen_ensure().