mirror of
https://github.com/DrBeef/ioq3quest.git
synced 2025-02-18 01:51:15 +00:00
OpenXR recenter sets yaw always to 0
This commit is contained in:
parent
8e5f6414a6
commit
7072b0b89e
2 changed files with 19 additions and 26 deletions
|
@ -306,7 +306,6 @@ void VR_LeaveVR( engine_t* engine ) {
|
||||||
OXR(xrDestroySpace(engine->appState.FakeStageSpace));
|
OXR(xrDestroySpace(engine->appState.FakeStageSpace));
|
||||||
engine->appState.CurrentSpace = XR_NULL_HANDLE;
|
engine->appState.CurrentSpace = XR_NULL_HANDLE;
|
||||||
OXR(xrDestroySession(engine->appState.Session));
|
OXR(xrDestroySession(engine->appState.Session));
|
||||||
OXR(xrDestroyInstance(engine->appState.Instance));
|
|
||||||
engine->appState.Session = NULL;
|
engine->appState.Session = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,29 +164,30 @@ void VR_GetResolution(engine_t* engine, int *pWidth, int *pHeight)
|
||||||
|
|
||||||
void VR_Recenter(engine_t* engine) {
|
void VR_Recenter(engine_t* engine) {
|
||||||
|
|
||||||
|
// Calculate recenter reference
|
||||||
|
XrReferenceSpaceCreateInfo spaceCreateInfo = {};
|
||||||
|
spaceCreateInfo.type = XR_TYPE_REFERENCE_SPACE_CREATE_INFO;
|
||||||
|
spaceCreateInfo.poseInReferenceSpace.orientation.w = 1.0f;
|
||||||
|
if (engine->appState.CurrentSpace != XR_NULL_HANDLE) {
|
||||||
|
vec3_t rotation = {0, 0, 0};
|
||||||
|
XrSpaceLocation loc = {};
|
||||||
|
loc.type = XR_TYPE_SPACE_LOCATION;
|
||||||
|
OXR(xrLocateSpace(engine->appState.HeadSpace, engine->appState.CurrentSpace, engine->predictedDisplayTime, &loc));
|
||||||
|
QuatToYawPitchRoll(loc.pose.orientation, rotation, vr.hmdorientation);
|
||||||
|
|
||||||
|
vr.recenterYaw += radians(vr.hmdorientation[YAW]);
|
||||||
|
spaceCreateInfo.poseInReferenceSpace.orientation.x = 0;
|
||||||
|
spaceCreateInfo.poseInReferenceSpace.orientation.y = sin(vr.recenterYaw / 2);
|
||||||
|
spaceCreateInfo.poseInReferenceSpace.orientation.z = 0;
|
||||||
|
spaceCreateInfo.poseInReferenceSpace.orientation.w = cos(vr.recenterYaw / 2);
|
||||||
|
}
|
||||||
|
|
||||||
// Delete previous space instances
|
// Delete previous space instances
|
||||||
qboolean spacesAlreadyExisted = qfalse;
|
|
||||||
if (engine->appState.StageSpace != XR_NULL_HANDLE) {
|
if (engine->appState.StageSpace != XR_NULL_HANDLE) {
|
||||||
OXR(xrDestroySpace(engine->appState.StageSpace));
|
OXR(xrDestroySpace(engine->appState.StageSpace));
|
||||||
}
|
}
|
||||||
if (engine->appState.FakeStageSpace != XR_NULL_HANDLE) {
|
if (engine->appState.FakeStageSpace != XR_NULL_HANDLE) {
|
||||||
OXR(xrDestroySpace(engine->appState.FakeStageSpace));
|
OXR(xrDestroySpace(engine->appState.FakeStageSpace));
|
||||||
spacesAlreadyExisted = qtrue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a space to the first path
|
|
||||||
XrReferenceSpaceCreateInfo spaceCreateInfo = {};
|
|
||||||
spaceCreateInfo.type = XR_TYPE_REFERENCE_SPACE_CREATE_INFO;
|
|
||||||
spaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
|
|
||||||
spaceCreateInfo.poseInReferenceSpace.orientation.w = 1.0f;
|
|
||||||
|
|
||||||
// Calculate recenter reference
|
|
||||||
if (engine->appState.CurrentSpace != XR_NULL_HANDLE) {
|
|
||||||
vr.recenterYaw += radians(vr.clientviewangles[YAW]);
|
|
||||||
spaceCreateInfo.poseInReferenceSpace.orientation.x = 0;
|
|
||||||
spaceCreateInfo.poseInReferenceSpace.orientation.y = sin(vr.recenterYaw / 2);
|
|
||||||
spaceCreateInfo.poseInReferenceSpace.orientation.z = 0;
|
|
||||||
spaceCreateInfo.poseInReferenceSpace.orientation.w = cos(vr.recenterYaw / 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a default stage space to use if SPACE_TYPE_STAGE is not
|
// Create a default stage space to use if SPACE_TYPE_STAGE is not
|
||||||
|
@ -206,14 +207,7 @@ void VR_Recenter(engine_t* engine) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update menu orientation
|
// Update menu orientation
|
||||||
if (spacesAlreadyExisted) {
|
vr.menuYaw = 0;
|
||||||
vec3_t rotation = {0, 0, 0};
|
|
||||||
XrSpaceLocation loc = {};
|
|
||||||
loc.type = XR_TYPE_SPACE_LOCATION;
|
|
||||||
OXR(xrLocateSpace(engine->appState.HeadSpace, engine->appState.CurrentSpace, engine->predictedDisplayTime, &loc));
|
|
||||||
QuatToYawPitchRoll(loc.pose.orientation, rotation, vr.hmdorientation);
|
|
||||||
vr.menuYaw = vr.hmdorientation[YAW];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VR_InitRenderer( engine_t* engine ) {
|
void VR_InitRenderer( engine_t* engine ) {
|
||||||
|
|
Loading…
Reference in a new issue