Blender V4.3
wm_xr_session.cc File Reference
#include "BKE_callbacks.hh"
#include "BKE_context.hh"
#include "BKE_global.hh"
#include "BKE_idprop.hh"
#include "BKE_main.hh"
#include "BKE_scene.hh"
#include "BKE_screen.hh"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_math_rotation.h"
#include "BLI_math_vector.h"
#include "BLI_string.h"
#include "BLI_time.h"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_query.hh"
#include "DNA_camera_types.h"
#include "DNA_space_types.h"
#include "DRW_engine.hh"
#include "ED_screen.hh"
#include "ED_space_api.hh"
#include "GHOST_C-api.h"
#include "GPU_batch.hh"
#include "GPU_viewport.hh"
#include "MEM_guardedalloc.h"
#include "WM_api.hh"
#include "WM_types.hh"
#include "wm_event_system.hh"
#include "wm_surface.hh"
#include "wm_window.hh"
#include "wm_xr_intern.hh"

Go to the source code of this file.

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 ()
 
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, uint subaction_idx, float r_location[3])
 
bool WM_xr_session_state_controller_grip_rotation_get (const wmXrData *xr, uint subaction_idx, float r_rotation[4])
 
bool WM_xr_session_state_controller_aim_location_get (const wmXrData *xr, uint subaction_idx, float r_location[3])
 
bool WM_xr_session_state_controller_aim_rotation_get (const wmXrData *xr, uint 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, uint 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, uint subaction_idx, uint *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, uint subaction_idx, uint 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.
 
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 * wm_xr_session_gpu_binding_context_create ()
 
void wm_xr_session_gpu_binding_context_destroy (GHOST_ContextHandle)
 
ARegionTypeWM_xr_surface_controller_region_type_get ()
 

Variables

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

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 252 of file wm_xr_session.cc.

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

◆ wm_xr_session_action_test_bimanual()

◆ wm_xr_session_actions_init()

void wm_xr_session_actions_init ( wmXrData * xr)

Definition at line 584 of file wm_xr_session.cc.

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

Referenced by wm_xr_session_create_cb().

◆ wm_xr_session_actions_update()

◆ WM_xr_session_area_get()

ScrArea * WM_xr_session_area_get ( const wmXrData * xr)

Definition at line 394 of file wm_xr_session.cc.

References wmXrRuntimeData::area, 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 109 of file wm_xr_session.cc.

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

◆ wm_xr_session_controller_data_free()

static void wm_xr_session_controller_data_free ( wmXrSessionState * state)
static

◆ wm_xr_session_controller_data_populate()

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

◆ wm_xr_session_data_free()

void wm_xr_session_data_free ( wmXrSessionState * state)

Definition at line 87 of file wm_xr_session.cc.

References state, and wm_xr_session_controller_data_free().

Referenced by wm_xr_runtime_data_free().

◆ wm_xr_session_do_depsgraph()

◆ 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

Definition at line 259 of file wm_xr_session.cc.

References state, and XR_SESSION_USE_POSITION_TRACKING.

Referenced by wm_xr_session_state_to_event().

◆ wm_xr_session_draw_data_populate()

◆ wm_xr_session_draw_data_update()

◆ 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,
uint subaction_idx,
uint subaction_idx_other,
bool bimanual )
static

◆ wm_xr_session_events_dispatch()

◆ WM_xr_session_exists()

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

◆ wm_xr_session_gpu_binding_context_destroy()

void wm_xr_session_gpu_binding_context_destroy ( GHOST_ContextHandle context)

◆ 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 806 of file wm_xr_session.cc.

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 817 of file wm_xr_session.cc.

References BLI_freelinkN(), and LISTBASE_FOREACH_MUTABLE.

Referenced by wm_xr_session_events_dispatch().

◆ WM_xr_session_is_ready()

◆ 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 763 of file wm_xr_session.cc.

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 its own depsgraph, which is an expense we should avoid.

Definition at line 236 of file wm_xr_session.cc.

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,
uint 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,
uint 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,
uint 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,
uint 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 389 of file wm_xr_session.cc.

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

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

◆ WM_xr_session_state_navigation_reset()

void WM_xr_session_state_navigation_reset ( wmXrSessionState * state)

Definition at line 569 of file wm_xr_session.cc.

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

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

Update information that is only stored for external state queries. E.g. for Python API to request the current (as in, last known) viewer pose. Controller data and action sets will be updated separately via wm_xr_session_actions_update().

Definition at line 338 of file wm_xr_session.cc.

References wmXrDrawData::base_pose, wmXrDrawData::base_scale, copy_qt_qt(), copy_v3_v3(), DEFAULT_SENSOR_WIDTH, draw_view, wmXrDrawData::eye_position_ofs, fov_to_focallength(), mat4_to_loc_quat(), mul_m4_m4m4(), state, sub_v3_v3(), wm_xr_pose_scale_to_imat(), wm_xr_pose_scale_to_mat(), wm_xr_pose_to_mat(), XR_SESSION_USE_ABSOLUTE_TRACKING, XR_SESSION_USE_POSITION_TRACKING, and zero_v3().

Referenced by wm_xr_draw_view().

◆ WM_xr_session_state_viewer_pose_location_get()

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

◆ wm_xr_session_surface_create()

◆ 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 1325 of file wm_xr_session.cc.

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

◆ wm_xr_session_toggle()

◆ WM_xr_surface_controller_region_type_get()

ARegionType * WM_xr_surface_controller_region_type_get ( )

Variable Documentation

◆ g_xr_surface

◆ LOG

CLG_LogRef LOG = {"wm.xr"}
static

Definition at line 51 of file wm_xr_session.cc.

Referenced by wm_xr_session_surface_offscreen_ensure().