70 if (settings->base_scale < FLT_EPSILON) {
71 settings->base_scale = 1.0f;
73 state->prev_base_scale = settings->base_scale;
110 GHOST_XrSessionBeginInfo *r_begin_info)
119 r_begin_info->exit_customdata = xr_data;
135 GHOST_XrSessionBeginInfo begin_info;
163 GHOST_XrPose *r_base_pose,
167 settings->base_pose_object) ?
168 settings->base_pose_object :
172 float tmp_quatx[4], tmp_quatz[4];
174 copy_v3_v3(r_base_pose->position, settings->base_pose_location);
177 mul_qt_qtqt(r_base_pose->orientation_quat, tmp_quatz, tmp_quatx);
179 else if (base_pose_object) {
183 mat4_to_loc_quat(r_base_pose->position, tmp_quat, base_pose_object->object_to_world().ptr());
189 eul_to_quat(r_base_pose->orientation_quat, tmp_eul);
196 *r_base_scale = settings->base_scale;
206 memset(r_draw_data, 0,
sizeof(*r_draw_data));
209 r_draw_data->
xr_data = xr_data;
238 Depsgraph **r_depsgraph)
262 if (
state->force_reset_to_base_pose) {
266 ((
state->prev_base_pose_type != settings->base_pose_type) ||
267 (
state->prev_base_pose_object != settings->base_pose_object));
273 if (!
state->is_view_data_set) {
280 const bool position_tracking_toggled = ((
state->prev_settings_flag &
283 if (position_tracking_toggled) {
300 if (use_position_tracking) {
311 if (use_position_tracking) {
322 if (use_position_tracking) {
343 GHOST_XrPose viewer_pose;
344 float viewer_mat[4][4], base_mat[4][4], nav_mat[4][4];
371 state->focal_len = 2.0f *
381 state->prev_settings_flag = settings->flag;
382 state->prev_base_pose_type = settings->base_pose_type;
383 state->prev_base_pose_object = settings->base_pose_object;
384 state->is_view_data_set =
true;
386 state->force_reset_to_base_pose =
false;
422 float r_viewmat[4][4],
573 state->nav_scale = 1.0f;
574 state->is_navigation_dirty =
true;
594 const float view_ofs[3],
595 const float base_mat[4][4],
596 const float nav_mat[4][4],
597 GHOST_XrPose *r_pose,
599 float r_mat_base[4][4])
619 GHOST_XrContextHandle xr_context,
625 uint subaction_idx = 0;
626 float view_ofs[3], base_mat[4][4], nav_mat[4][4];
642 controller->grip_active = ((GHOST_XrPose *)grip_action->
states)[subaction_idx].is_active;
650 controller->aim_active = ((GHOST_XrPose *)aim_action->
states)[subaction_idx].is_active;
663 GHOST_XrLoadControllerModel(xr_context,
controller->subaction_path);
666 GHOST_XrUpdateControllerModelComponents(xr_context,
controller->subaction_path);
672 const char *subaction_path)
682 if (*
state > threshold) {
687 if (*
state < -threshold) {
702 if (
state[0] < 0.0f) {
707 if (
state[0] > 0.0f) {
712 if (
state[1] < 0.0f) {
717 if (
state[1] > 0.0f) {
734 if (action == active_modal_action) {
740 if (action->
ot == active_modal_action->
ot &&
758 ld->
data = (
void *)action;
767 if (action == ld->data) {
776 const char *subaction_path)
779 if ((action == ha->action) && (subaction_path == ha->subaction_path)) {
788 const char *subaction_path,
792 active_haptic_actions, action, subaction_path);
810 if (action == ha->action) {
820 if (time_now - ha->time_start >= ha->action->haptic_duration) {
827 const char *action_set_name,
843 switch (action->
type) {
845 const bool *
state = &((
bool *)action->
states)[subaction_idx];
846 bool *state_prev = &((
bool *)action->
states_prev)[subaction_idx];
853 *state_prev = *
state;
857 const float *
state = &((
float *)action->
states)[subaction_idx];
858 float *state_prev = &((
float *)action->
states_prev)[subaction_idx];
870 *state_prev = *
state;
906 haptic_subaction_path,
912 active_haptic_actions, action, haptic_subaction_path, time_now);
932 haptic_subaction_path,
938 active_haptic_actions, action, haptic_subaction_path, time_now);
959 haptic_subaction_path,
965 active_haptic_actions, action, haptic_subaction_path, time_now);
980 uint *r_subaction_idx_other,
981 const GHOST_XrPose **r_aim_pose_other)
987 bool bimanual =
false;
989 *r_subaction_idx_other = (subaction_idx == 0) ?
993 switch (action->
type) {
995 const bool *
state = &((
bool *)action->
states)[*r_subaction_idx_other];
1002 const float *
state = &((
float *)action->
states)[*r_subaction_idx_other];
1037 const GHOST_XrPose *controller_aim_pose,
1038 const GHOST_XrPose *controller_aim_pose_other,
1040 uint subaction_idx_other,
1043 wmXrActionData *data =
static_cast<wmXrActionData *
>(
1045 STRNCPY(data->action_set, action_set_name);
1051 data->type = action->
type;
1053 switch (action->
type) {
1055 data->state[0] = ((
bool *)action->
states)[subaction_idx] ? 1.0f : 0.0f;
1057 data->state_other[0] = ((
bool *)action->
states)[subaction_idx_other] ? 1.0f : 0.0f;
1061 data->state[0] = ((
float *)action->
states)[subaction_idx];
1063 data->state_other[0] = ((
float *)action->
states)[subaction_idx_other];
1070 copy_v2_v2(data->state_other, ((
float(*)[2])action->
states)[subaction_idx_other]);
1080 if (controller_aim_pose) {
1081 copy_v3_v3(data->controller_loc, controller_aim_pose->position);
1082 copy_qt_qt(data->controller_rot, controller_aim_pose->orientation_quat);
1084 if (bimanual && controller_aim_pose_other) {
1085 copy_v3_v3(data->controller_loc_other, controller_aim_pose_other->position);
1086 copy_qt_qt(data->controller_rot_other, controller_aim_pose_other->orientation_quat);
1089 data->controller_rot_other[0] = 1.0f;
1093 data->controller_rot[0] = 1.0f;
1094 data->controller_rot_other[0] = 1.0f;
1097 data->ot = action->
ot;
1100 data->bimanual = bimanual;
1107 GHOST_XrContextHandle xr_context,
1112 const char *action_set_name = action_set->
name;
1114 const uint count = GHOST_XrGetActionCount(xr_context, action_set_name);
1127 GHOST_XrGetActionCustomdataArray(xr_context, action_set_name, (
void **)actions);
1132 for (
uint action_idx = 0; action_idx <
count; ++action_idx) {
1134 if (action && action->
ot) {
1135 const bool modal = action->
ot->
modal;
1136 const bool haptic = (GHOST_XrGetActionCustomdata(
1137 xr_context, action_set_name, action->
haptic_name) !=
nullptr);
1148 active_modal_actions,
1149 active_haptic_actions,
1156 active_modal_actions, action,
nullptr);
1162 (!modal || (is_active_modal_action && is_active_modal_subaction)))
1166 const GHOST_XrPose *aim_pose_other =
nullptr;
1167 uint subaction_idx_other = 0;
1171 session_state, action, subaction_idx, &subaction_idx_other, &aim_pose_other);
1178 subaction_idx_other,
1180 wm_event_add_xrevent(win, actiondata, val);
1200 if (
state->is_navigation_dirty) {
1201 memcpy(&
state->nav_pose_prev, &
state->nav_pose,
sizeof(
state->nav_pose_prev));
1203 state->is_navigation_dirty =
false;
1207 float m[4][4], viewer_mat[4][4];
1212 &
state->viewer_pose, settings->base_scale *
state->nav_scale,
state->viewer_viewmat);
1216 if (
state->active_action_set_next[0]) {
1218 state->active_action_set_next[0] =
'\0';
1222 const bool synced = GHOST_XrSyncActions(xr_context,
1223 active_action_set ? active_action_set->
name :
nullptr);
1229 if (active_action_set) {
1385 if (!size_changed) {
1392 char err_out[256] =
"unknown";
1393 bool failure =
false;
1399 case GHOST_kXrSwapchainFormatRGBA8:
1402 case GHOST_kXrSwapchainFormatRGBA16:
1405 case GHOST_kXrSwapchainFormatRGBA16F:
1408 case GHOST_kXrSwapchainFormatRGB10_A2:
1445 if (vp->offscreen) {
1451 if (data->controller_art) {
1472 MEM_callocN(
sizeof(*(data->controller_art)),
"XrControllerRegionType"));
1477 surface->activate = DRW_xr_drawing_begin;
1478 surface->deactivate = DRW_xr_drawing_end;
1480 surface->system_gpu_context =
static_cast<GHOST_ContextHandle
>(DRW_system_gpu_context_get());
1481 surface->blender_gpu_context =
static_cast<GPUContext *
>(DRW_xr_blender_gpu_context_get());
1484 surface->customdata =
data;
1501 return surface->system_gpu_context;
void BKE_callback_exec_null(Main *bmain, eCbEvent evt)
@ BKE_CB_EVT_XR_SESSION_START_PRE
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
bool IDP_EqualsProperties(const IDProperty *prop1, const IDProperty *prop2) ATTR_WARN_UNUSED_RESULT
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
Depsgraph * BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer)
#define BLI_assert_unreachable()
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
#define BLI_ASSERT_UNIT_QUAT(q)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void unit_m4(float m[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4])
void axis_angle_to_quat_single(float q[4], char axis, float angle)
void eul_to_quat(float quat[4], const float eul[3])
float fov_to_focallength(float hfov, float sensor)
void quat_to_eul(float eul[3], const float quat[4])
void mul_qt_qtqt(float q[4], const float a[4], const float b[4])
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
#define STRNCPY(dst, src)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define CLOG_ERROR(clg_ref,...)
#define DEFAULT_SENSOR_WIDTH
@ XR_SESSION_USE_ABSOLUTE_TRACKING
@ XR_SESSION_USE_POSITION_TRACKING
@ XR_HAPTIC_MATCHUSERPATHS
ScrArea * ED_area_offscreen_create(wmWindow *win, eSpace_Type space_type)
void * ED_region_draw_cb_activate(ARegionType *art, void(*draw)(const bContext *, ARegion *, void *), void *customdata, int type)
#define REGION_DRAW_POST_VIEW
bool ED_region_draw_cb_exit(ARegionType *art, void *handle)
static Controller * controller
GHOST C-API function and type declarations.
void GPU_batch_discard(blender::gpu::Batch *batch)
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, eGPUTextureFormat format, eGPUTextureUsage usage, char err_out[256])
GPUFrameBuffer * GPU_framebuffer_active_get()
int GPU_offscreen_width(const GPUOffScreen *offscreen)
void GPU_framebuffer_restore()
int GPU_offscreen_height(const GPUOffScreen *offscreen)
void GPU_offscreen_free(GPUOffScreen *offscreen)
@ GPU_TEXTURE_USAGE_SHADER_READ
GPUViewport * GPU_viewport_create()
void GPU_viewport_free(GPUViewport *viewport)
Read Guarded memory(de)allocation.
#define ND_XR_DATA_CHANGED
struct GPUContext GPUContext
const Depsgraph * depsgraph
direct_radiance_1_tx direct_radiance_3_tx indirect_radiance_2_tx radiance_feedback_img draw_fullscreen fragment_source("eevee_deferred_combine_frag.glsl") .specialization_constant(Type out_radiance draw_view
draw_view in_light_buf[] float
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void(* draw)(const bContext *C, ARegion *region)
int object_type_exclude_select
int object_type_exclude_viewport
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
wmXrAction * controller_aim_action
wmXrAction * controller_grip_action
ListBase active_modal_actions
ListBase active_haptic_actions
struct wmOperatorType * ot
unsigned int count_subaction_paths
eXrActionFlag action_flag
const char * active_modal_path
eXrHapticFlag haptic_flag
IDProperty * op_properties
XrSessionSettings session_settings
struct wmXrRuntimeData * runtime
float eye_position_ofs[3]
struct Depsgraph * depsgraph
wmXrSurfaceData * surface_data
const char * subaction_path
GHOST_XrContextHandle context
wmXrSessionExitFn exit_fn
wmXrSessionState session_state
wmWindow * session_root_win
float viewer_viewmat[4][4]
bool force_reset_to_base_pose
struct ARegionType * controller_art
void * controller_draw_handle
struct GPUViewport * viewport
struct GPUOffScreen * offscreen
void WM_main_add_notifier(uint type, void *reference)
void wm_surface_add(wmSurface *surface)
void wm_surface_remove(wmSurface *surface)
void wm_window_reset_drawable()
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)
void wm_xr_runtime_data_free(wmXrRuntimeData **runtime)
void(*)(const wmXrData *xr_data) wmXrSessionExitFn
void WM_xr_haptic_action_stop(wmXrData *xr, const char *action_set_name, const char *action_name, const char *subaction_path)
bool WM_xr_haptic_action_apply(wmXrData *xr, const char *action_set_name, const char *action_name, const char *subaction_path, const int64_t *duration, const float *frequency, const float *amplitude)
bool WM_xr_active_action_set_set(wmXrData *xr, const char *action_set_name, bool delayed)
void wm_xr_pose_to_mat(const GHOST_XrPose *pose, float r_mat[4][4])
void wm_xr_draw_controllers(const bContext *, ARegion *, void *customdata)
void wm_xr_pose_scale_to_mat(const GHOST_XrPose *pose, float scale, float r_mat[4][4])
void wm_xr_pose_scale_to_imat(const GHOST_XrPose *pose, float scale, float r_imat[4][4])
void WM_xr_session_state_nav_scale_set(wmXrData *xr, float scale)
void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle)
BLI_INLINE bool test_float_state(const float *state, float threshold, eXrAxisFlag flag)
void wm_xr_session_actions_update(wmWindowManager *wm)
ScrArea * WM_xr_session_area_get(const wmXrData *xr)
void wm_xr_session_draw_data_update(wmXrSessionState *state, const XrSessionSettings *settings, const GHOST_XrDrawViewInfo *draw_view, wmXrDrawData *draw_data)
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])
void * wm_xr_session_gpu_binding_context_create()
static void wm_xr_session_haptic_timers_check(ListBase *active_haptic_actions, int64_t time_now)
wmXrSessionState * WM_xr_session_state_handle_get(const wmXrData *xr)
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)
void WM_xr_session_base_pose_reset(wmXrData *xr)
bool WM_xr_session_state_nav_scale_get(const wmXrData *xr, float *r_scale)
static void wm_xr_session_haptic_action_remove(ListBase *active_haptic_actions, const wmXrAction *action)
static void wm_xr_session_exit_cb(void *customdata)
bool WM_xr_session_state_controller_aim_location_get(const wmXrData *xr, uint subaction_idx, float r_location[3])
static wmXrSessionStateEvent wm_xr_session_state_to_event(const wmXrSessionState *state, const XrSessionSettings *settings)
static void wm_xr_session_events_dispatch(wmXrData *xr, GHOST_XrContextHandle xr_context, wmXrActionSet *action_set, wmXrSessionState *session_state, wmWindow *win)
static void wm_xr_session_do_depsgraph(bContext *C)
static wmXrHapticAction * wm_xr_session_haptic_action_find(ListBase *active_haptic_actions, const wmXrAction *action, const char *subaction_path)
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_modal_action_test_add(ListBase *active_modal_actions, const wmXrAction *action)
void WM_xr_session_state_navigation_reset(wmXrSessionState *state)
BLI_INLINE bool test_vec2f_state(const float state[2], float threshold, eXrAxisFlag flag)
bool WM_xr_session_state_controller_aim_rotation_get(const wmXrData *xr, uint subaction_idx, float r_rotation[4])
static void wm_xr_session_modal_action_remove(ListBase *active_modal_actions, const wmXrAction *action)
static void wm_xr_session_surface_free_data(wmSurface *surface)
static wmSurface * g_xr_surface
void wm_xr_session_toggle(wmWindowManager *wm, wmWindow *session_root_win, wmXrSessionExitFn session_exit_fn)
void wm_xr_session_controller_data_populate(const wmXrAction *grip_action, const wmXrAction *aim_action, wmXrData *xr)
static void wm_xr_session_surface_draw(bContext *C)
Call Ghost-XR to draw a frame.
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)
wmWindow * wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm, const wmXrRuntimeData *runtime_data)
void wm_xr_session_state_update(const XrSessionSettings *settings, const wmXrDrawData *draw_data, const GHOST_XrDrawViewInfo *draw_view, wmXrSessionState *state)
static bool wm_xr_session_modal_action_test(const ListBase *active_modal_actions, const wmXrAction *action, bool *r_found)
static void wm_xr_session_controller_data_free(wmXrSessionState *state)
void wm_xr_session_controller_data_clear(wmXrSessionState *state)
static bool wm_xr_session_draw_data_needs_reset_to_base_pose(const wmXrSessionState *state, const XrSessionSettings *settings)
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])
static void wm_xr_session_scene_and_depsgraph_get(const wmWindowManager *wm, Scene **r_scene, Depsgraph **r_depsgraph)
static const GHOST_XrPose * wm_xr_session_controller_aim_pose_find(const wmXrSessionState *state, const char *subaction_path)
bool WM_xr_session_state_viewer_pose_matrix_info_get(const wmXrData *xr, float r_viewmat[4][4], float *r_focal_len)
void wm_xr_session_data_free(wmXrSessionState *state)
bool wm_xr_session_surface_offscreen_ensure(wmXrSurfaceData *surface_data, const GHOST_XrDrawViewInfo *draw_view)
@ SESSION_STATE_EVENT_NONE
@ SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE
@ SESSION_STATE_EVENT_START
@ SESSION_STATE_EVENT_RESET_TO_BASE_POSE
bool WM_xr_session_is_ready(const wmXrData *xr)
bool WM_xr_session_state_viewer_pose_location_get(const wmXrData *xr, float r_location[3])
bool WM_xr_session_exists(const wmXrData *xr)
ARegionType * WM_xr_surface_controller_region_type_get()
static wmSurface * wm_xr_session_surface_create()
bool WM_xr_session_state_controller_grip_location_get(const wmXrData *xr, uint subaction_idx, float r_location[3])
void wm_xr_session_actions_init(wmXrData *xr)
bool WM_xr_session_state_controller_grip_rotation_get(const wmXrData *xr, uint subaction_idx, float r_rotation[4])
static void wm_xr_session_begin_info_create(wmXrData *xr_data, GHOST_XrSessionBeginInfo *r_begin_info)
void WM_xr_session_state_nav_rotation_set(wmXrData *xr, const float rotation[4])
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_draw_data_populate(wmXrData *xr_data, Scene *scene, Depsgraph *depsgraph, wmXrDrawData *r_draw_data)
bool WM_xr_session_state_viewer_pose_rotation_get(const wmXrData *xr, float r_rotation[4])
bool WM_xr_session_state_nav_rotation_get(const wmXrData *xr, float r_rotation[4])
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 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 void wm_xr_session_create_cb()