mirror of https://github.com/bjornbytes/lovr.git
lovr.headset.getPose works with keyboard device on Quest;
This commit is contained in:
parent
d1b6bd3d15
commit
ece73be868
|
@ -91,7 +91,9 @@ uintptr_t gpu_vk_get_queue(uint32_t* queueFamilyIndex, uint32_t* queueIndex);
|
||||||
X(xrGetHandMeshFB)\
|
X(xrGetHandMeshFB)\
|
||||||
X(xrGetDisplayRefreshRateFB) \
|
X(xrGetDisplayRefreshRateFB) \
|
||||||
X(xrEnumerateDisplayRefreshRatesFB) \
|
X(xrEnumerateDisplayRefreshRatesFB) \
|
||||||
X(xrRequestDisplayRefreshRateFB)
|
X(xrRequestDisplayRefreshRateFB) \
|
||||||
|
X(xrQuerySystemTrackedKeyboardFB) \
|
||||||
|
X(xrCreateKeyboardSpaceFB)
|
||||||
|
|
||||||
#define XR_DECLARE(fn) static PFN_##fn fn;
|
#define XR_DECLARE(fn) static PFN_##fn fn;
|
||||||
#define XR_LOAD(fn) xrGetInstanceProcAddr(state.instance, #fn, (PFN_xrVoidFunction*) &fn);
|
#define XR_LOAD(fn) xrGetInstanceProcAddr(state.instance, #fn, (PFN_xrVoidFunction*) &fn);
|
||||||
|
@ -172,6 +174,7 @@ static struct {
|
||||||
bool handTracking;
|
bool handTracking;
|
||||||
bool handTrackingAim;
|
bool handTrackingAim;
|
||||||
bool handTrackingMesh;
|
bool handTrackingMesh;
|
||||||
|
bool keyboardTracking;
|
||||||
bool overlay;
|
bool overlay;
|
||||||
bool refreshRate;
|
bool refreshRate;
|
||||||
bool viveTrackers;
|
bool viveTrackers;
|
||||||
|
@ -334,7 +337,8 @@ static bool openxr_init(HeadsetConfig* config) {
|
||||||
{ "XR_FB_hand_tracking_aim", &state.features.handTrackingAim, true },
|
{ "XR_FB_hand_tracking_aim", &state.features.handTrackingAim, true },
|
||||||
{ "XR_FB_hand_tracking_mesh", &state.features.handTrackingMesh, true },
|
{ "XR_FB_hand_tracking_mesh", &state.features.handTrackingMesh, true },
|
||||||
{ "XR_EXTX_overlay", &state.features.overlay, config->overlay },
|
{ "XR_EXTX_overlay", &state.features.overlay, config->overlay },
|
||||||
{ "XR_HTCX_vive_tracker_interaction", &state.features.viveTrackers, true }
|
{ "XR_HTCX_vive_tracker_interaction", &state.features.viveTrackers, true },
|
||||||
|
{ "XR_FB_keyboard_tracking", &state.features.keyboardTracking, true }
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t enabledExtensionCount = 0;
|
uint32_t enabledExtensionCount = 0;
|
||||||
|
@ -382,6 +386,11 @@ static bool openxr_init(HeadsetConfig* config) {
|
||||||
.supportsHandTracking = false
|
.supportsHandTracking = false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
XrSystemKeyboardTrackingPropertiesFB keyboardTrackingProperties = {
|
||||||
|
.type = XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB,
|
||||||
|
.supportsKeyboardTracking = false
|
||||||
|
};
|
||||||
|
|
||||||
XrSystemProperties properties = {
|
XrSystemProperties properties = {
|
||||||
.type = XR_TYPE_SYSTEM_PROPERTIES
|
.type = XR_TYPE_SYSTEM_PROPERTIES
|
||||||
};
|
};
|
||||||
|
@ -396,9 +405,15 @@ static bool openxr_init(HeadsetConfig* config) {
|
||||||
properties.next = &handTrackingProperties;
|
properties.next = &handTrackingProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state.features.keyboardTracking) {
|
||||||
|
keyboardTrackingProperties.next = properties.next;
|
||||||
|
properties.next = &keyboardTrackingProperties;
|
||||||
|
}
|
||||||
|
|
||||||
XR_INIT(xrGetSystemProperties(state.instance, state.system, &properties));
|
XR_INIT(xrGetSystemProperties(state.instance, state.system, &properties));
|
||||||
state.features.gaze = eyeGazeProperties.supportsEyeGazeInteraction;
|
state.features.gaze = eyeGazeProperties.supportsEyeGazeInteraction;
|
||||||
state.features.handTracking = handTrackingProperties.supportsHandTracking;
|
state.features.handTracking = handTrackingProperties.supportsHandTracking;
|
||||||
|
state.features.keyboardTracking = keyboardTrackingProperties.supportsKeyboardTracking;
|
||||||
|
|
||||||
uint32_t viewConfigurationCount;
|
uint32_t viewConfigurationCount;
|
||||||
XrViewConfigurationType viewConfigurations[2];
|
XrViewConfigurationType viewConfigurations[2];
|
||||||
|
@ -1023,6 +1038,27 @@ static void openxr_start(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state.features.keyboardTracking) {
|
||||||
|
XrKeyboardTrackingQueryFB queryInfo = {
|
||||||
|
.type = XR_TYPE_KEYBOARD_TRACKING_QUERY_FB,
|
||||||
|
.flags = XR_KEYBOARD_TRACKING_QUERY_LOCAL_BIT_FB
|
||||||
|
};
|
||||||
|
|
||||||
|
XrKeyboardTrackingDescriptionFB keyboard;
|
||||||
|
XrResult result = xrQuerySystemTrackedKeyboardFB(state.session, &queryInfo, &keyboard);
|
||||||
|
|
||||||
|
if (result == XR_SUCCESS) {
|
||||||
|
XrKeyboardSpaceCreateInfoFB spaceInfo = {
|
||||||
|
.type = XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB,
|
||||||
|
.trackedKeyboardId = keyboard.trackedKeyboardId
|
||||||
|
};
|
||||||
|
|
||||||
|
xrCreateKeyboardSpaceFB(state.session, &spaceInfo, &state.spaces[DEVICE_KEYBOARD]);
|
||||||
|
} else {
|
||||||
|
state.features.keyboardTracking = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void openxr_stop(void) {
|
static void openxr_stop(void) {
|
||||||
|
|
Loading…
Reference in New Issue