diff --git a/code/nel/include/nel/3d/stereo_ovr_04.h b/code/nel/include/nel/3d/stereo_ovr_04.h index 5c5f73a6b..18c7083da 100644 --- a/code/nel/include/nel/3d/stereo_ovr_04.h +++ b/code/nel/include/nel/3d/stereo_ovr_04.h @@ -185,13 +185,14 @@ private: UDriver *m_Driver; CTextureUser *m_GUITexture; + NL3D::CTextureUser *m_SceneTexture; UMaterial m_UnlitMat; NLMISC::CRefPtr m_VP; NLMISC::CRefPtr m_PP; - /*NL3D::CTextureUser *m_SceneTexture; + /* NL3D::UMaterial m_BarrelMat; NLMISC::CQuadUV m_BarrelQuadLeft; NLMISC::CQuadUV m_BarrelQuadRight; diff --git a/code/nel/src/3d/stereo_ovr_04.cpp b/code/nel/src/3d/stereo_ovr_04.cpp index 2238c3d16..0d0adb449 100644 --- a/code/nel/src/3d/stereo_ovr_04.cpp +++ b/code/nel/src/3d/stereo_ovr_04.cpp @@ -246,7 +246,7 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL // get distortion mesh ovrDistortionMesh meshData; ovrHmd_CreateDistortionMesh(m_DevicePtr, (ovrEyeType)eye, fov, - ovrDistortionCap_Chromatic | ovrDistortionCap_TimeWarp | ovrDistortionCap_Vignette, + ovrDistortionCap_Chromatic /*| ovrDistortionCap_TimeWarp*/ | ovrDistortionCap_Vignette, // I believe the timewarp gimmick screws with parallax &meshData); ovrVector2f uvScaleOffset[2]; @@ -273,7 +273,7 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL vba.setTexCoord(i, 2, ov.TanEyeAnglesB.x, ov.TanEyeAnglesB.y); NLMISC::CRGBA color; color.R = color.G = color.B = (uint8)(ov.VignetteFactor * 255.99f); - color.A = (uint8)(ov.TimeWarpFactor * 255.99f); + color.A = 255; // (uint8)(ov.TimeWarpFactor * 255.99f); vba.setColor(i, color); } } @@ -552,12 +552,6 @@ void CStereoOVR::updateCamera(uint cid, const NL3D::UCamera *camera) bool CStereoOVR::nextPass() { - // Do not allow weird stuff. - uint32 width, height; - m_Driver->getWindowSize(width, height); - // nlassert(width == m_DevicePtr->HMDInfo.HResolution); - // nlassert(height == m_DevicePtr->HMDInfo.VResolution); - if (m_Driver->getPolygonMode() == UDriver::Filled) { switch (m_Stage) // Previous stage @@ -742,15 +736,13 @@ bool CStereoOVR::beginRenderTarget() } // Begin 3D scene render target - /*if (m_Driver && m_Stage == 3 && (m_Driver->getPolygonMode() == UDriver::Filled)) + if (m_Driver && m_Stage == 3 && (m_Driver->getPolygonMode() == UDriver::Filled)) { nlassert(!m_SceneTexture); - uint32 width, height; - m_Driver->getWindowSize(width, height); // Temporary limitation, TODO: scaling! - m_SceneTexture = m_Driver->getRenderTargetManager().getRenderTarget(width, height); + m_SceneTexture = m_Driver->getRenderTargetManager().getRenderTarget(m_RenderTargetWidth, m_RenderTargetHeight); static_cast(m_Driver)->setRenderTarget(*m_SceneTexture); return true; - }*/ + } return false; } @@ -762,17 +754,6 @@ void CStereoOVR::setInterfaceMatrix(const NL3D::CMatrix &matrix) void CStereoOVR::renderGUI() { - - /*CMatrix mat; - mat.translate(m_InterfaceCameraMatrix.getPos()); - CVector dir = m_InterfaceCameraMatrix.getJ(); - dir.z = 0; - dir.normalize(); - if (dir.y < 0) - mat.rotateZ(float(NLMISC::Pi+asin(dir.x))); - else - mat.rotateZ(float(NLMISC::Pi+NLMISC::Pi-asin(dir.x))); - m_Driver->setModelMatrix(mat);*/ m_Driver->setModelMatrix(m_InterfaceCameraMatrix); { @@ -1022,27 +1003,39 @@ bool CStereoOVR::endRenderTarget() NLMISC::CQuat CStereoOVR::getOrientation() const { - //if (m_OrientationCached) + if (m_OrientationCached) return m_OrientationCache; -/* - OVR::Quatf quatovr = m_DevicePtr->SensorFusion.GetPredictedOrientation(); - NLMISC::CMatrix coordsys; - float csys[] = { - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, -1.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - }; - coordsys.set(csys); - NLMISC::CMatrix matovr; - matovr.setRot(NLMISC::CQuat(quatovr.x, quatovr.y, quatovr.z, quatovr.w)); - NLMISC::CMatrix matr; - matr.rotateX(NLMISC::Pi * 0.5f); // fix this properly... :) (note: removing this allows you to use rift while lying down) - NLMISC::CMatrix matnel = matr * matovr * coordsys; - NLMISC::CQuat finalquat = matnel.getRot(); - m_OrientationCache = finalquat; - m_OrientationCached = true; - return finalquat;*/ + + ovrTrackingState ts = ovrHmd_GetTrackingState(m_DevicePtr, ovr_GetTimeInSeconds()); // TODO: Predict forward + if (ts.StatusFlags & ovrStatus_OrientationTracked) + { + // get just the orientation + ovrQuatf quatovr = ts.HeadPose.ThePose.Orientation; + NLMISC::CMatrix coordsys; + float csys[] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, + }; + coordsys.set(csys); + NLMISC::CMatrix matovr; + matovr.setRot(NLMISC::CQuat(quatovr.x, quatovr.y, quatovr.z, quatovr.w)); + NLMISC::CMatrix matr; + matr.rotateX(NLMISC::Pi * 0.5f); // fix this properly... :) (note: removing this allows you to use rift while lying down) + NLMISC::CMatrix matnel = matr * matovr * coordsys; + NLMISC::CQuat finalquat = matnel.getRot(); + m_OrientationCache = finalquat; + m_OrientationCached = true; + return finalquat; + } + else + { + nlwarning("OVR: No orientation returned"); + // return old orientation + m_OrientationCached = true; + return m_OrientationCache; + } } /// Get GUI shift