108 GHOST_XrSessionBeginInfo *r_begin_info)
117 r_begin_info->exit_customdata = xr_data;
133 GHOST_XrSessionBeginInfo begin_info;
161 GHOST_XrPose *r_base_pose,
170 float tmp_quatx[4], tmp_quatz[4];
175 mul_qt_qtqt(r_base_pose->orientation_quat, tmp_quatz, tmp_quatx);
177 else if (base_pose_object) {
187 eul_to_quat(r_base_pose->orientation_quat, tmp_eul);
204 memset(r_draw_data, 0,
sizeof(*r_draw_data));
207 r_draw_data->
xr_data = xr_data;
259 if (
state->force_reset_to_base_pose) {
270 if (!
state->is_view_data_set) {
277 const bool position_tracking_toggled = ((
state->prev_settings_flag &
280 if (position_tracking_toggled) {
289 const GHOST_XrDrawViewInfo *draw_view,
297 if (use_position_tracking) {
308 if (use_position_tracking) {
319 if (use_position_tracking) {
337 const GHOST_XrDrawViewInfo *draw_view,
340 GHOST_XrPose viewer_pose;
341 float viewer_mat[4][4], base_mat[4][4], nav_mat[4][4];
344 copy_qt_qt(viewer_pose.orientation_quat, draw_view->local_pose.orientation_quat);
349 copy_v3_v3(viewer_pose.position, draw_view->local_pose.position);
368 state->focal_len = 2.0f *
375 memcpy(&
state->prev_local_pose, &draw_view->local_pose,
sizeof(
state->prev_local_pose));
378 state->prev_settings_flag = settings->
flag;
381 state->is_view_data_set =
true;
383 state->force_reset_to_base_pose =
false;
419 float r_viewmat[4][4],
435 unsigned int subaction_idx,
452 unsigned int subaction_idx,
469 unsigned int subaction_idx,
486 unsigned int subaction_idx,
566 state->nav_scale = 1.0f;
567 state->is_navigation_dirty =
true;
587 const float view_ofs[3],
588 const float base_mat[4][4],
589 const float nav_mat[4][4],
590 GHOST_XrPose *r_pose,
592 float r_mat_base[4][4])
612 GHOST_XrContextHandle xr_context,
618 unsigned int subaction_idx = 0;
619 float view_ofs[3], base_mat[4][4], nav_mat[4][4];
654 GHOST_XrLoadControllerModel(xr_context,
controller->subaction_path);
657 GHOST_XrUpdateControllerModelComponents(xr_context,
controller->subaction_path);
663 const char *subaction_path)
693 if (
state[0] < 0.0f) {
698 if (
state[0] > 0.0f) {
703 if (
state[1] < 0.0f) {
708 if (
state[1] > 0.0f) {
725 if (action == active_modal_action) {
731 if (action->
ot == active_modal_action->
ot &&
748 ld->
data = (
void *)action;
757 if (action == ld->data) {
766 const char *subaction_path)
769 if ((action == ha->action) && (subaction_path == ha->subaction_path)) {
778 const char *subaction_path,
782 active_haptic_actions, action, subaction_path);
800 if (action == ha->action) {
810 if (time_now - ha->time_start >= ha->action->haptic_duration) {
817 const char *action_set_name,
819 unsigned int subaction_idx,
833 switch (action->
type) {
835 const bool *
state = &((
bool *)action->
states)[subaction_idx];
836 bool *state_prev = &((
bool *)action->
states_prev)[subaction_idx];
843 *state_prev = *
state;
847 const float *
state = &((
float *)action->
states)[subaction_idx];
848 float *state_prev = &((
float *)action->
states_prev)[subaction_idx];
858 *state_prev = *
state;
893 haptic_subaction_path,
898 active_haptic_actions, action, haptic_subaction_path, time_now);
913 active_haptic_actions, action, haptic_subaction_path)) {
918 haptic_subaction_path,
923 active_haptic_actions, action, haptic_subaction_path, time_now);
944 haptic_subaction_path,
949 active_haptic_actions, action, haptic_subaction_path, time_now);
963 unsigned int subaction_idx,
964 unsigned int *r_subaction_idx_other,
965 const GHOST_XrPose **r_aim_pose_other)
971 bool bimanual =
false;
973 *r_subaction_idx_other = (subaction_idx == 0) ?
977 switch (action->
type) {
979 const bool *
state = &((
bool *)action->
states)[*r_subaction_idx_other];
986 const float *
state = &((
float *)action->
states)[*r_subaction_idx_other];
989 action->
axis_flags[*r_subaction_idx_other])) {
998 action->
axis_flags[*r_subaction_idx_other])) {
1019 const GHOST_XrPose *controller_aim_pose,
1020 const GHOST_XrPose *controller_aim_pose_other,
1021 unsigned int subaction_idx,
1022 unsigned int subaction_idx_other,
1026 strcpy(
data->action_set, action_set_name);
1027 strcpy(
data->action, action->
name);
1034 switch (action->
type) {
1036 data->state[0] = ((
bool *)action->
states)[subaction_idx] ? 1.0f : 0.0f;
1038 data->state_other[0] = ((
bool *)action->
states)[subaction_idx_other] ? 1.0f : 0.0f;
1042 data->state[0] = ((
float *)action->
states)[subaction_idx];
1044 data->state_other[0] = ((
float *)action->
states)[subaction_idx_other];
1061 if (controller_aim_pose) {
1063 copy_qt_qt(
data->controller_rot, controller_aim_pose->orientation_quat);
1065 if (bimanual && controller_aim_pose_other) {
1066 copy_v3_v3(
data->controller_loc_other, controller_aim_pose_other->position);
1067 copy_qt_qt(
data->controller_rot_other, controller_aim_pose_other->orientation_quat);
1070 data->controller_rot_other[0] = 1.0f;
1074 data->controller_rot[0] = 1.0f;
1075 data->controller_rot_other[0] = 1.0f;
1081 data->bimanual = bimanual;
1088 GHOST_XrContextHandle xr_context,
1093 const char *action_set_name = action_set->
name;
1095 const unsigned int count = GHOST_XrGetActionCount(xr_context, action_set_name);
1107 GHOST_XrGetActionCustomdataArray(xr_context, action_set_name, (
void **)actions);
1112 for (
unsigned int action_idx = 0; action_idx <
count; ++action_idx) {
1114 if (action && action->
ot) {
1115 const bool modal = action->
ot->
modal;
1116 const bool haptic = (GHOST_XrGetActionCustomdata(
1128 active_modal_actions,
1129 active_haptic_actions,
1136 active_modal_actions, action,
NULL);
1142 (!modal || (is_active_modal_action && is_active_modal_subaction))) {
1145 const GHOST_XrPose *aim_pose_other =
NULL;
1146 unsigned int subaction_idx_other = 0;
1150 session_state, action, subaction_idx, &subaction_idx_other, &aim_pose_other);
1157 subaction_idx_other,
1159 wm_event_add_xrevent(win, actiondata, val);
1179 if (
state->is_navigation_dirty) {
1180 memcpy(&
state->nav_pose_prev, &
state->nav_pose,
sizeof(
state->nav_pose_prev));
1182 state->is_navigation_dirty =
false;
1186 float m[4][4], viewer_mat[4][4];
1195 if (
state->active_action_set_next[0]) {
1197 state->active_action_set_next[0] =
'\0';
1201 const bool synced = GHOST_XrSyncActions(xr_context,
1202 active_action_set ? active_action_set->
name :
NULL);
1208 if (active_action_set) {
1249 for (
unsigned int i = 0; i <
count; ++i) {
1343 const GHOST_XrDrawViewInfo *draw_view)
1357 const bool size_changed = offscreen && (
GPU_offscreen_width(offscreen) != draw_view->width) &&
1362 if (!size_changed) {
1369 char err_out[256] =
"unknown";
1370 bool failure =
false;
1374 switch (draw_view->swapchain_format) {
1375 case GHOST_kXrSwapchainFormatRGBA8:
1378 case GHOST_kXrSwapchainFormatRGBA16:
1381 case GHOST_kXrSwapchainFormatRGBA16F:
1384 case GHOST_kXrSwapchainFormatRGB10_A2:
1391 draw_view->width, draw_view->height,
true,
format, err_out);
1428 if (
data->controller_art) {
1447 data->controller_art =
MEM_callocN(
sizeof(*(
data->controller_art)),
"XrControllerRegionType");
1452 surface->activate = DRW_xr_drawing_begin;
1453 surface->deactivate = DRW_xr_drawing_end;
1455 surface->ghost_ctx = DRW_xr_opengl_context_get();
1456 surface->gpu_ctx = DRW_xr_gpu_context_get();
1496 return data->controller_art;
typedef float(TangentPoint)[2]
void BKE_callback_exec_null(struct Main *bmain, eCbEvent evt)
@ BKE_CB_EVT_XR_SESSION_START_PRE
struct wmWindowManager * CTX_wm_manager(const bContext *C)
struct Main * CTX_data_main(const bContext *C)
bool IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2) ATTR_WARN_UNUSED_RESULT
struct Depsgraph * BKE_scene_get_depsgraph(const struct Scene *scene, const struct ViewLayer *view_layer)
void BKE_scene_graph_evaluated_ensure(struct Depsgraph *depsgraph, struct Main *bmain)
#define BLI_assert_unreachable()
void * BLI_pophead(ListBase *listbase) 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)
#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_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT 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])
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])
float fov_to_focallength(float fov, float sensor)
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
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 float len_v2(const float a[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
#define CLOG_ERROR(clg_ref,...)
struct Depsgraph Depsgraph
#define DEFAULT_SENSOR_WIDTH
@ XR_SESSION_USE_ABSOLUTE_TRACKING
@ XR_SESSION_USE_POSITION_TRACKING
@ XR_HAPTIC_MATCHUSERPATHS
ScrArea * ED_area_offscreen_create(struct wmWindow *win, eSpace_Type space_type)
#define REGION_DRAW_POST_VIEW
void * ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *customdata, int type)
bool ED_region_draw_cb_exit(struct ARegionType *art, void *handle)
static Controller * controller
GHOST C-API function and type declarations.
void GPU_batch_discard(GPUBatch *)
void GPU_framebuffer_restore(void)
GPUFrameBuffer * GPU_framebuffer_active_get(void)
GPUViewport * GPU_viewport_create(void)
void GPU_viewport_free(GPUViewport *viewport)
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position CLAMP
Platform independent time functions.
#define ND_XR_DATA_CHANGED
const Depsgraph * depsgraph
depth_tx normal_tx diffuse_light_tx specular_light_tx volume_light_tx environment_tx ambient_occlusion_tx aov_value_tx in_weight_img GPU_RGBA16F
struct @211::@212 surface
void GPU_offscreen_free(GPUOffScreen *ofs)
GPUOffScreen * GPU_offscreen_create(int width, int height, bool depth, eGPUTextureFormat format, char err_out[256])
int GPU_offscreen_width(const GPUOffScreen *ofs)
int GPU_offscreen_height(const GPUOffScreen *ofs)
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
void(* MEM_freeN)(void *vmemh)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
SymEdge< T > * prev(const SymEdge< T > *se)
int object_type_exclude_select
int object_type_exclude_viewport
int object_type_exclude_select
float base_pose_location[3]
Object * base_pose_object
int object_type_exclude_viewport
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) 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
double PIL_check_seconds_timer(void)
void WM_main_add_notifier(unsigned int type, void *reference)
void wm_surface_add(wmSurface *surface)
void wm_surface_remove(wmSurface *surface)
void wm_window_reset_drawable(void)
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(* wmXrSessionExitFn)(const wmXrData *xr_data)
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_pose_scale_to_mat(const GHOST_XrPose *pose, float scale, float r_mat[4][4])
void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region), void *customdata)
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)
bool WM_xr_session_state_controller_aim_location_get(const wmXrData *xr, unsigned int subaction_idx, float r_location[3])
BLI_INLINE bool test_float_state(const float *state, float threshold, eXrAxisFlag flag)
void wm_xr_session_actions_update(wmWindowManager *wm)
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])
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)
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 wmSurface * wm_xr_session_surface_create(void)
static void wm_xr_session_exit_cb(void *customdata)
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 void wm_xr_session_base_pose_calc(const Scene *scene, const XrSessionSettings *settings, GHOST_XrPose *r_base_pose, float *r_base_scale)
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_modal_action_test_add(ListBase *active_modal_actions, const wmXrAction *action)
bool WM_xr_session_state_controller_grip_rotation_get(const wmXrData *xr, unsigned int subaction_idx, float r_rotation[4])
static wmXrHapticAction * wm_xr_session_haptic_action_find(ListBase *active_haptic_actions, const wmXrAction *action, const char *subaction_path)
void WM_xr_session_state_navigation_reset(wmXrSessionState *state)
BLI_INLINE bool test_vec2f_state(const float state[2], float threshold, eXrAxisFlag flag)
ARegionType * WM_xr_surface_controller_region_type_get(void)
static void wm_xr_session_create_cb(void)
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 const GHOST_XrPose * wm_xr_session_controller_aim_pose_find(const wmXrSessionState *state, const char *subaction_path)
static void wm_xr_session_modal_action_remove(ListBase *active_modal_actions, const wmXrAction *action)
wmWindow * wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm, const wmXrRuntimeData *runtime_data)
bool WM_xr_session_state_controller_grip_location_get(const wmXrData *xr, unsigned int subaction_idx, float r_location[3])
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)
bool WM_xr_session_state_controller_aim_rotation_get(const wmXrData *xr, unsigned int subaction_idx, float r_rotation[4])
void * wm_xr_session_gpu_binding_context_create(void)
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)
ScrArea * WM_xr_session_area_get(const wmXrData *xr)
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)
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)
void wm_xr_session_actions_init(wmXrData *xr)
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])
void wm_xr_session_gpu_binding_context_destroy(GHOST_ContextHandle UNUSED(context))
bool WM_xr_session_state_nav_rotation_get(const wmXrData *xr, float r_rotation[4])