diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp index d623365..f2d4c4d 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/renderer/gl_postprocess.cpp @@ -808,7 +808,7 @@ void FGLRenderer::Flush() glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); //Only adjust HUD if we are 3D and not showing menu (otherwise we are rendering to a cylinder compositor layer) - //if (!is2D && !isMenuActive()) stereo3dMode.getEyePose(eye_ix)->AdjustHud(); + if (!is2D && !isMenuActive()) stereo3dMode.getEyePose(eye_ix)->AdjustHud(); m2DDrawer->Draw(); FGLDebug::PopGroup(); diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp index c9db3a4..6e1386e 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.cpp @@ -149,66 +149,50 @@ namespace s3d return true; } - VSMatrix OculusQuestEyePose::getQuadInWorld( - float distance, // meters - float width, // meters - bool doFixPitch, - float pitchOffset) const + VSMatrix OculusQuestEyePose::getQuadInWorld() const { VSMatrix new_projection; new_projection.loadIdentity(); + float stereo_separation = (vr_ipd * 0.5) * vr_vunits_per_meter * (eye == 1 ? -1.0 : 1.0); + new_projection.translate(stereo_separation, 0, 0); + // doom_units from meters new_projection.scale( -vr_vunits_per_meter, vr_vunits_per_meter, -vr_vunits_per_meter); double pixelstretch = level.info ? level.info->pixelstretch : 1.2; - new_projection.scale(1.0, pixelstretch, 1.0); // Doom universe is scaled by 1990s pixel aspect ratio + new_projection.scale(pixelstretch, pixelstretch, 1.0); // Doom universe is scaled by 1990s pixel aspect ratio - const OculusQuestEyePose * activeEye = this; - - // eye coordinates from hmd coordinates - //VSMatrix e2h(activeEye->eyeToHeadTransform); - //e2h.transpose(); - //new_projection.multMatrix(e2h); - // Follow HMD orientation, EXCEPT for roll angle (keep weapon upright) - /*if (activeEye->currentPose) { - float vrRollDegrees = RAD2DEG(-eulerAnglesFromMatrix(activeEye->currentPose->mDeviceToAbsoluteTracking).v[2]); - new_projection.rotate(-vrRollDegrees, 0, 0, 1); + { + new_projection.rotate(-hmdorientation[ROLL], 0, 0, 1); - if (doFixPitch) { - float vrPitchDegrees = RAD2DEG(-eulerAnglesFromMatrix(activeEye->currentPose->mDeviceToAbsoluteTracking).v[1]); - new_projection.rotate(-vrPitchDegrees, 1, 0, 0); + { + new_projection.rotate(-hmdorientation[PITCH], 1, 0, 0); } - }*/ - - if (pitchOffset != 0) - new_projection.rotate(-pitchOffset, 1, 0, 0); + new_projection.rotate(30, 1, 0, 0); + } // hmd coordinates (meters) from ndc coordinates // const float weapon_distance_meters = 0.55f; // const float weapon_width_meters = 0.3f; const float aspect = SCREENWIDTH / float(SCREENHEIGHT); - new_projection.translate(0.0, 0.0, distance); + new_projection.translate(0.0, 0.0, 1.0); new_projection.scale( - -width, - width / aspect, - -width); + -0.5, + 0.5, + -0.5); // ndc coordinates from pixel coordinates new_projection.translate(-1.0, 1.0, 0); new_projection.scale(2.0 / SCREENWIDTH, -2.0 / SCREENHEIGHT, -1.0); - ovrTracking2 tracking; - const OculusQuestMode * mode3d = static_cast(&Stereo3DMode::getCurrentMode()); - mode3d->getTracking(&tracking); - VSMatrix proj = projection; - projection.multMatrix(new_projection); + proj.multMatrix(new_projection); new_projection = proj; return new_projection; @@ -221,14 +205,7 @@ namespace s3d return; // Update HUD matrix to render on a separate quad - const float menu_distance_meters = 1.0f; - const float menu_width_meters = 0.4f * menu_distance_meters; - const float pitch_offset = -8.0; - gl_RenderState.mProjectionMatrix = getQuadInWorld( - menu_distance_meters, - menu_width_meters, - true, - pitch_offset); + gl_RenderState.mProjectionMatrix = getQuadInWorld(); gl_RenderState.ApplyMatrices(); } @@ -342,7 +319,7 @@ namespace s3d mat->rotate(-offhandangles[PITCH], 1, 0, 0); mat->rotate(-offhandangles[ROLL], 0, 0, 1); - mat->translate(offhandoffset[0], hmdPosition[1] + offhandoffset[1] - vr_floor_offset, -offhandoffset[2]); + mat->translate(-offhandoffset[0], hmdPosition[1] + offhandoffset[1] - vr_floor_offset, offhandoffset[2]); } return true; @@ -475,7 +452,7 @@ namespace s3d vec3_t v_forward, v_right, v_up; AngleVectors(angles, v_forward, v_right, v_up); - player->mo->AttackDir = MapAttackDir;//DVector3(v_forward[0], v_forward[1], v_forward[2]); + player->mo->AttackDir = MapAttackDir; } //Positional Movement diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.h b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.h index e44c66c..7104a6d 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.h +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/gl/stereo3d/gl_oculusquest.h @@ -60,12 +60,7 @@ protected: mutable uint32_t framebuffer; int eye; - VSMatrix getQuadInWorld( - float distance, - float width, - bool doFixPitch, - float pitchOffset - ) const; + VSMatrix getQuadInWorld() const; mutable VSMatrix projection; }; diff --git a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_data/models/models.cpp b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_data/models/models.cpp index 53a80b0..8a071d1 100644 --- a/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_data/models/models.cpp +++ b/Projects/Android/jni/gzdoom-g3.3mgw_mobile/src/r_data/models/models.cpp @@ -51,6 +51,7 @@ CVAR(Bool, gl_interpolate_model_frames, true, CVAR_ARCHIVE) EXTERN_CVAR(Bool, r_drawvoxels) +EXTERN_CVAR(Int, vr_control_scheme) extern TDeletingArray Voxels; extern TDeletingArray VoxelDefs; @@ -190,10 +191,12 @@ void FModelRenderer::RenderHUDModel(DPSprite *psp, float ofsX, float ofsY) if (smf == nullptr) return; - // The model position and orientation has to be drawn independently from the position of the player, + long oculusquest_rightHanded = vr_control_scheme < 10; + + // The model position and orientation has to be drawn independently from the position of the player, // but we need to position it correctly in the world for light to work properly. VSMatrix objectToWorldMatrix = GetViewToWorldMatrix(); - if (s3d::Stereo3DMode::getCurrentMode().GetHandTransform(1, &objectToWorldMatrix)) + if (s3d::Stereo3DMode::getCurrentMode().GetHandTransform(oculusquest_rightHanded ? 1 : 0, &objectToWorldMatrix)) { float scale = 0.01f; objectToWorldMatrix.scale(scale, scale, scale);