From 92941b3547e7c4c7f126f608dde7239ee9c03b8e Mon Sep 17 00:00:00 2001 From: Lubos Date: Thu, 5 May 2022 22:26:33 +0200 Subject: [PATCH] OpenXR delayed controller pose fixed --- android/app/src/main/cpp/code/vr/vr_input.c | 38 ++++++++++--------- android/app/src/main/cpp/code/vr/vr_input.h | 1 + .../app/src/main/cpp/code/vr/vr_renderer.c | 3 ++ 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/cpp/code/vr/vr_input.c b/android/app/src/main/cpp/code/vr/vr_input.c index 6e3c40e9..7426e205 100644 --- a/android/app/src/main/cpp/code/vr/vr_input.c +++ b/android/app/src/main/cpp/code/vr/vr_input.c @@ -1341,24 +1341,6 @@ void IN_VRInputFrame( void ) rightControllerAimSpace = CreateActionSpace(handPoseRightAction, rightHandPath); } - // update input information - XrAction controller[] = {handPoseLeftAction, handPoseRightAction}; - XrPath subactionPath[] = {leftHandPath, rightHandPath}; - XrSpace controllerSpace[] = {leftControllerAimSpace, rightControllerAimSpace}; - for (int i = 0; i < 2; i++) { - if (ActionPoseIsActive(controller[i], subactionPath[i])) { - LocVel lv = GetSpaceLocVel(controllerSpace[i], VR_GetEngine()->predictedDisplayTime); - VR_GetEngine()->appState.TrackedController[i].Active = (lv.loc.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0; - VR_GetEngine()->appState.TrackedController[i].Pose = lv.loc.pose; - for (int j = 0; j < 3; j++) { - float dt = 0.01f; // use 0.2f for for testing velocity vectors - (&VR_GetEngine()->appState.TrackedController[i].Pose.position.x)[j] += (&lv.vel.linearVelocity.x)[j] * dt; - } - } else { - ovrTrackedController_Clear(&VR_GetEngine()->appState.TrackedController[i]); - } - } - // OpenXR input { // Attach to session @@ -1427,4 +1409,24 @@ void IN_VRInputFrame( void ) in_vrEventTime = Sys_Milliseconds( ); } +void IN_VRUpdateControllers( float predictedDisplayTime ) +{ + XrAction controller[] = {handPoseLeftAction, handPoseRightAction}; + XrPath subactionPath[] = {leftHandPath, rightHandPath}; + XrSpace controllerSpace[] = {leftControllerAimSpace, rightControllerAimSpace}; + for (int i = 0; i < 2; i++) { + if (ActionPoseIsActive(controller[i], subactionPath[i])) { + LocVel lv = GetSpaceLocVel(controllerSpace[i], predictedDisplayTime); + VR_GetEngine()->appState.TrackedController[i].Active = (lv.loc.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0; + VR_GetEngine()->appState.TrackedController[i].Pose = lv.loc.pose; + for (int j = 0; j < 3; j++) { + float dt = 0.01f; // use 0.2f for for testing velocity vectors + (&VR_GetEngine()->appState.TrackedController[i].Pose.position.x)[j] += (&lv.vel.linearVelocity.x)[j] * dt; + } + } else { + ovrTrackedController_Clear(&VR_GetEngine()->appState.TrackedController[i]); + } + } +} + //#endif diff --git a/android/app/src/main/cpp/code/vr/vr_input.h b/android/app/src/main/cpp/code/vr/vr_input.h index ff681509..84d66cfb 100644 --- a/android/app/src/main/cpp/code/vr/vr_input.h +++ b/android/app/src/main/cpp/code/vr/vr_input.h @@ -8,6 +8,7 @@ void IN_VRInputFrame( void ); void IN_VRInit( void ); +void IN_VRUpdateControllers( float predictedDisplayTime ); void QuatToYawPitchRoll(XrQuaternionf q, vec3_t rotation, vec3_t out); diff --git a/android/app/src/main/cpp/code/vr/vr_renderer.c b/android/app/src/main/cpp/code/vr/vr_renderer.c index 8ec4a1c1..791718bd 100644 --- a/android/app/src/main/cpp/code/vr/vr_renderer.c +++ b/android/app/src/main/cpp/code/vr/vr_renderer.c @@ -413,6 +413,9 @@ void VR_DrawFrame( engine_t* engine ) { vr.clientview_yaw_delta = vr.clientview_yaw_last - clientview_yaw; vr.clientview_yaw_last = clientview_yaw; + // Update controllers + IN_VRUpdateControllers( frameState.predictedDisplayTime ); + XrViewLocateInfo projectionInfo = {}; projectionInfo.type = XR_TYPE_VIEW_LOCATE_INFO; projectionInfo.viewConfigurationType = engine->appState.ViewportConfig.viewConfigurationType;