From 46c7e3682a25308246827182176756a278366917 Mon Sep 17 00:00:00 2001 From: Lubos Date: Wed, 15 Jun 2022 22:25:12 +0200 Subject: [PATCH] SpaceWarp - Jittering for most cases fixed --- .../main/cpp/code/renderergles3/tr_backend.c | 9 +------- .../app/src/main/cpp/code/vr/vr_renderer.c | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/android/app/src/main/cpp/code/renderergles3/tr_backend.c b/android/app/src/main/cpp/code/renderergles3/tr_backend.c index 744f6e0b..60d7fee3 100644 --- a/android/app/src/main/cpp/code/renderergles3/tr_backend.c +++ b/android/app/src/main/cpp/code/renderergles3/tr_backend.c @@ -367,14 +367,7 @@ void RB_BeginDrawingView (void) { // ensures that depth writes are enabled for the depth clear GL_State( GLS_DEFAULT ); // clear relevant buffers - if( VR_RenderMotionVector() ) - { - clearBits = 0; - } - else - { - clearBits = GL_DEPTH_BUFFER_BIT; - } + clearBits = GL_DEPTH_BUFFER_BIT; if ( r_measureOverdraw->integer || r_shadows->integer == 2 ) { 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 dcf4b0ba..b6b1be23 100644 --- a/android/app/src/main/cpp/code/vr/vr_renderer.c +++ b/android/app/src/main/cpp/code/vr/vr_renderer.c @@ -13,7 +13,7 @@ #include #include -#define ENABLE_GL_DEBUG 1 +#define ENABLE_GL_DEBUG 0 #define ENABLE_GL_DEBUG_VERBOSE 0 #if ENABLE_GL_DEBUG #include @@ -24,7 +24,7 @@ extern cvar_t *vr_heightAdjust; extern cvar_t *vr_spacewarp; XrView* projections; -XrPosef prevInvViewTransform[2]; +XrPosef prevXrSpacePoseInWorld; qboolean fullscreenMode = qfalse; qboolean stageSupported = qfalse; qboolean renderMotionVector = qfalse; @@ -315,8 +315,7 @@ void VR_InitRenderer( engine_t* engine ) { spaceWarpProperties.recommendedMotionVectorImageRectWidth, spaceWarpProperties.recommendedMotionVectorImageRectHeight); - prevInvViewTransform[0] = XrPosef_Identity(); - prevInvViewTransform[1] = XrPosef_Identity(); + prevXrSpacePoseInWorld = XrPosef_Identity(); } void VR_DestroyRenderer( engine_t* engine ) @@ -471,11 +470,9 @@ void VR_DrawFrame( engine_t* engine ) { // XrFovf fov = {}; - XrPosef viewTransform[2]; XrPosef invViewTransform[2]; for (int eye = 0; eye < ovrMaxNumEyes; eye++) { invViewTransform[eye] = projections[eye].pose; - viewTransform[eye] = XrPosef_Inverse(projections[eye].pose); fov.angleLeft += projections[eye].fov.angleLeft / 2.0f; fov.angleRight += projections[eye].fov.angleRight / 2.0f; @@ -493,6 +490,14 @@ void VR_DrawFrame( engine_t* engine ) { engine->appState.LayerCount = 0; memset(engine->appState.Layers, 0, sizeof(ovrCompositorLayer_Union) * ovrMaxLayerCount); + // Get pose from game + const XrVector3f axisY = {0.0f, 1.0f, 0.0f}; + XrPosef XrSpacePoseInWorld = XrPosef_Identity(); + XrSpacePoseInWorld.orientation = XrQuaternionf_CreateFromVectorAngle(axisY, vr.recenterYaw); + XrSpacePoseInWorld.position.x = vr.hmdorigin[0]; + XrSpacePoseInWorld.position.y = vr.hmdorigin[1]; + XrSpacePoseInWorld.position.z = vr.hmdorigin[2]; + XrCompositionLayerProjectionView projection_layer_elements[2] = {}; XrCompositionLayerSpaceWarpInfoFB proj_spacewarp_views[2] = {}; if (!VR_useScreenLayer() && !(cl.snap.ps.pm_flags & PMF_FOLLOW && vr.follow_mode == VRFM_FIRSTPERSON)) { @@ -548,7 +553,7 @@ void VR_DrawFrame( engine_t* engine ) { proj_spacewarp_views[eye].depthSubImage.imageRect.extent.width = frameBuffer->MotionVectorDepthSwapChain.Width; proj_spacewarp_views[eye].depthSubImage.imageRect.extent.height = frameBuffer->MotionVectorDepthSwapChain.Height; proj_spacewarp_views[eye].depthSubImage.imageArrayIndex = eye; - proj_spacewarp_views[eye].appSpaceDeltaPose = XrPosef_Multiply(prevInvViewTransform[eye], viewTransform[eye]); + proj_spacewarp_views[eye].appSpaceDeltaPose = XrPosef_Multiply(prevXrSpacePoseInWorld, XrSpacePoseInWorld); proj_spacewarp_views[eye].minDepth = 0.0f; proj_spacewarp_views[eye].maxDepth = 1.0f; @@ -618,8 +623,7 @@ void VR_DrawFrame( engine_t* engine ) { ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer; frameBuffer->TextureSwapChainIndex++; frameBuffer->TextureSwapChainIndex %= frameBuffer->TextureSwapChainLength; - prevInvViewTransform[0] = invViewTransform[0]; - prevInvViewTransform[1] = invViewTransform[1]; + prevXrSpacePoseInWorld = XrSpacePoseInWorld; }