14 #include <openxr/openxr.h>
17 #include "gpu/gl/GLBackend.h"
19 #if defined(HAVE_VULKAN)
20 #warning "OpenXR plugin doesn't support Vulkan yet and will always fail on startup"
21 #define XR_USE_GRAPHICS_API_VULKAN
23 #if defined(Q_OS_ANDROID)
24 #define XR_USE_GRAPHICS_API_OPENGL_ES
25 #define XR_USE_PLATFORM_ANDROID
26 #define XR_USE_PLATFORM_EGL
27 #elif defined(Q_OS_LINUX)
28 #define XR_USE_GRAPHICS_API_OPENGL
31 #define XR_USE_PLATFORM_EGL
32 #define XR_USE_PLATFORM_XLIB
40 #elif defined(Q_OS_WIN)
43 #define XR_USE_GRAPHICS_API_OPENGL
44 #define XR_USE_PLATFORM_WIN32
48 #error "Unsupported platform"
51 #if defined(XR_USE_PLATFORM_EGL)
57 #include <openxr/openxr_platform.h>
59 #include <glm/glm.hpp>
60 #include <glm/gtx/quaternion.hpp>
62 #include "controllers/Pose.h"
66 constexpr XrPosef XR_INDENTITY_POSE = {
67 .orientation = { .x = 0, .y = 0, .z = 0, .w = 1.0 },
68 .position = { .x = 0, .y = 0, .z = 0 },
71 constexpr XrViewConfigurationType XR_VIEW_CONFIG_TYPE = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
75 XrInstance _instance = XR_NULL_HANDLE;
76 XrSession _session = XR_NULL_HANDLE;
77 XrSystemId _systemId = XR_NULL_SYSTEM_ID;
79 XrSpace _stageSpace = XR_NULL_HANDLE;
80 XrSpace _viewSpace = XR_NULL_HANDLE;
81 XrPath _handPaths[HAND_COUNT];
83 controller::Pose _lastHeadPose;
84 std::optional<XrTime> _lastPredictedDisplayTime;
87 bool _shouldQuit =
false;
88 bool _shouldRunFrameCycle =
false;
89 bool _isDisplayActive =
false;
91 bool _isSupported =
false;
94 bool _isSessionRunning =
false;
96 std::array<bool, HAND_COUNT> _vivePoseHack = {
false,
false };
100 bool _userPresenceAvailable =
false;
103 bool _hmdMounted =
true;
105 bool _handTrackingSupported =
false;
106 PFN_xrCreateHandTrackerEXT xrCreateHandTrackerEXT =
nullptr;
107 PFN_xrLocateHandJointsEXT xrLocateHandJointsEXT =
nullptr;
108 PFN_xrDestroyHandTrackerEXT xrDestroyHandTrackerEXT =
nullptr;
110 bool _palmPoseSupported =
false;
112 bool _MNDX_xdevSpaceSupported =
false;
113 PFN_xrCreateXDevListMNDX xrCreateXDevListMNDX =
nullptr;
114 PFN_xrGetXDevListGenerationNumberMNDX xrGetXDevListGenerationNumberMNDX =
nullptr;
115 PFN_xrEnumerateXDevsMNDX xrEnumerateXDevsMNDX =
nullptr;
116 PFN_xrGetXDevPropertiesMNDX xrGetXDevPropertiesMNDX =
nullptr;
117 PFN_xrDestroyXDevListMNDX xrDestroyXDevListMNDX =
nullptr;
118 PFN_xrCreateXDevSpaceMNDX xrCreateXDevSpaceMNDX =
nullptr;
120 bool _HTCX_viveTrackerInteractionSupported =
false;
121 PFN_xrEnumerateViveTrackerPathsHTCX xrEnumerateViveTrackerPathsHTCX =
nullptr;
123 bool _MNDX_eglEnableSupported =
false;
125 bool _EXT_debugUtilsSupported =
false;
126 XrDebugUtilsMessengerEXT _debugMessenger = {};
127 PFN_xrCreateDebugUtilsMessengerEXT xrCreateDebugUtilsMessengerEXT =
nullptr;
130 XrSessionState _lastSessionState = XR_SESSION_STATE_UNKNOWN;
132 XrPath _viveControllerPath = XR_NULL_PATH;
138 bool initPostGraphics();
141 bool requestExitSession();
145 bool initPreGraphics();
152 bool updateSessionState(XrSessionState newState);
155 inline static glm::vec3 xrVecToGlm(
const XrVector3f& v) {
156 return glm::vec3(v.x, v.y, v.z);
159 inline static glm::quat xrQuatToGlm(
const XrQuaternionf& q) {
160 return glm::quat(q.w, q.x, q.y, q.z);
163 bool xrCheck(XrInstance instance, XrResult result,
const char* message);
Preview header for XR_MNDX_xdev_space extension.