OVR: Testing

--HG--
branch : multipass-stereo
This commit is contained in:
kaetemi 2014-08-05 01:49:45 +02:00
parent 2e6893fd48
commit 33235bdf6c
3 changed files with 83 additions and 30 deletions

View file

@ -163,8 +163,7 @@ private:
CViewport m_RegularViewport; CViewport m_RegularViewport;
CViewport m_EyeViewport[NL_OVR_EYE_COUNT]; CViewport m_EyeViewport[NL_OVR_EYE_COUNT];
float m_EyeHFov[NL_OVR_EYE_COUNT]; CFrustum m_EyeFrustumBase[NL_OVR_EYE_COUNT];
float m_EyeAR[NL_OVR_EYE_COUNT];
uint m_RenderTargetWidth; uint m_RenderTargetWidth;
uint m_RenderTargetHeight; uint m_RenderTargetHeight;
NLMISC::CVector2f m_EyeUVScaleOffset[NL_OVR_EYE_COUNT][2]; NLMISC::CVector2f m_EyeUVScaleOffset[NL_OVR_EYE_COUNT][2];

View file

@ -119,10 +119,20 @@ void CDriverUser::endDefaultRenderTarget(UScene *scene)
_MatRenderTarget.getObjectPtr()->setTexture(0, _EffectRenderTarget->getITexture()); _MatRenderTarget.getObjectPtr()->setTexture(0, _EffectRenderTarget->getITexture());
UCamera pCam = scene->getCam(); UCamera pCam;
if (scene)
{
pCam = scene->getCam();
setMatrixMode2D11(); setMatrixMode2D11();
}
bool fog = fogEnabled();
enableFog(false);
drawQuad(_RenderTargetQuad, _MatRenderTarget); drawQuad(_RenderTargetQuad, _MatRenderTarget);
enableFog(fog);
if (scene)
{
setMatrixMode3D(pCam); setMatrixMode3D(pCam);
}
_MatRenderTarget.getObjectPtr()->setTexture(0, NULL); _MatRenderTarget.getObjectPtr()->setTexture(0, NULL);

View file

@ -238,13 +238,28 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
eyeViewport.Size.h = (eyeRenderDesc[eye].DistortedViewport.Size.h * m_RenderTargetHeight) / m_DevicePtr->Resolution.h; eyeViewport.Size.h = (eyeRenderDesc[eye].DistortedViewport.Size.h * m_RenderTargetHeight) / m_DevicePtr->Resolution.h;
// calculate hfov and ar // calculate hfov and ar
float combinedTanHalfFovHorizontal = max(fov.LeftTan, fov.RightTan); /*float combinedTanHalfFovHorizontal = max(fov.LeftTan, fov.RightTan);
float combinedTanHalfFovVertical = max(fov.UpTan, fov.DownTan); float combinedTanHalfFovVertical = max(fov.UpTan, fov.DownTan);
float horizontalFullFovInRadians = 2.0f * atanf (combinedTanHalfFovHorizontal); float horizontalFullFovInRadians = 2.0f * atanf (combinedTanHalfFovHorizontal);
float aspectRatio = combinedTanHalfFovHorizontal / combinedTanHalfFovVertical; float aspectRatio = combinedTanHalfFovHorizontal / combinedTanHalfFovVertical;
float m_EyeHFov[NL_OVR_EYE_COUNT];
float m_EyeAR[NL_OVR_EYE_COUNT];
m_EyeHFov[eye] = horizontalFullFovInRadians; m_EyeHFov[eye] = horizontalFullFovInRadians;
m_EyeAR[eye] = aspectRatio; m_EyeAR[eye] = aspectRatio;
nldebug("OVR: HFOV: %f, AR: %f", horizontalFullFovInRadians, aspectRatio); nldebug("OVR: HFOV: %f, AR: %f", horizontalFullFovInRadians, aspectRatio);
m_EyeFrustumBase[eye].initPerspective(m_EyeHFov[eye], m_EyeAR[eye], 1.0f, 100.f);
nldebug("OVR: FOV: Left: %f, Right: %f, Down: %f, Up: %f", // DOUBLE CHECK
m_EyeFrustumBase[eye].Left, m_EyeFrustumBase[eye].Right, m_EyeFrustumBase[eye].Bottom, m_EyeFrustumBase[eye].Top);*/
m_EyeFrustumBase[eye].init(
-fov.LeftTan, // OVR provides positive values
fov.RightTan, // DEBUG: If renders shifted left and right, swap left and right
-fov.DownTan,
fov.UpTan, // DEBUG: If renders shifted up or down, swap down and up
1.0f, // dummy
100.f, // dummy
true);
nldebug("OVR: FOV: Left: %f, Right: %f, Down: %f, Up: %f",
m_EyeFrustumBase[eye].Left, m_EyeFrustumBase[eye].Right, m_EyeFrustumBase[eye].Bottom, m_EyeFrustumBase[eye].Top);
// get distortion mesh // get distortion mesh
ovrDistortionMesh meshData; ovrDistortionMesh meshData;
@ -310,10 +325,10 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
// 2014/08/04 22:28:39 DBG 3040 snowballs_client.exe stereo_ovr_04.cpp 235 NL3D::CStereoOVR::CStereoOVR : OVR: HFOV: 2.339905, AR: 0.916641 // 2014/08/04 22:28:39 DBG 3040 snowballs_client.exe stereo_ovr_04.cpp 235 NL3D::CStereoOVR::CStereoOVR : OVR: HFOV: 2.339905, AR: 0.916641
// DEBUG EARLY EXIT // DEBUG EARLY EXIT
nldebug("OVR: Early exit"); /*nldebug("OVR: Early exit");
ovrHmd_Destroy(m_DevicePtr); ovrHmd_Destroy(m_DevicePtr);
m_DevicePtr = NULL; m_DevicePtr = NULL;
--s_DeviceCounter; --s_DeviceCounter;*/
} }
CStereoOVR::~CStereoOVR() CStereoOVR::~CStereoOVR()
@ -510,27 +525,39 @@ bool CStereoOVR::getScreenResolution(uint &width, uint &height)
void CStereoOVR::initCamera(uint cid, const NL3D::UCamera *camera) void CStereoOVR::initCamera(uint cid, const NL3D::UCamera *camera)
{ {
/*m_OriginalFrustum[cid] = camera->getFrustum(); m_OriginalFrustum[cid] = camera->getFrustum();
float ar = (float)m_DevicePtr->HMDInfo.HResolution / ((float)m_DevicePtr->HMDInfo.VResolution * 2.0f); /*m_LeftFrustum[cid] = m_OriginalFrustum[cid];
float fov = 2.0f * atanf((m_DevicePtr->HMDInfo.HScreenSize * 0.5f * 0.5f) / (m_DevicePtr->HMDInfo.EyeToScreenDistance)); //(float)NLMISC::Pi/2.f; // 2.0f * atanf(m_DevicePtr->HMDInfo.VScreenSize / 2.0f * m_DevicePtr->HMDInfo.EyeToScreenDistance); m_RightFrustum[cid] = m_OriginalFrustum[cid];
m_LeftFrustum[cid].initPerspective(fov, ar, camera->getFrustum().Near, camera->getFrustum().Far); m_ClippingFrustum[cid] = m_OriginalFrustum[cid];
m_RightFrustum[cid] = m_LeftFrustum[cid]; return;*/
float viewCenter = m_DevicePtr->HMDInfo.HScreenSize * 0.25f; m_LeftFrustum[cid].init(
float eyeProjectionShift = viewCenter - m_DevicePtr->HMDInfo.LensSeparationDistance * 0.5f; // docs say LensSeparationDistance, why not InterpupillaryDistance? related to how the lenses work? m_EyeFrustumBase[ovrEye_Left].Left * camera->getFrustum().Near,
float projectionCenterOffset = (eyeProjectionShift / (m_DevicePtr->HMDInfo.HScreenSize * 0.5f)) * (m_LeftFrustum[cid].Right - m_LeftFrustum[cid].Left); // used logic for this one, but it ends up being the same as the one i made up m_EyeFrustumBase[ovrEye_Left].Right * camera->getFrustum().Near,
nldebug("OVR: projectionCenterOffset = %f", projectionCenterOffset); m_EyeFrustumBase[ovrEye_Left].Bottom * camera->getFrustum().Near,
m_EyeFrustumBase[ovrEye_Left].Top * camera->getFrustum().Near,
camera->getFrustum().Near,
camera->getFrustum().Far,
true);
m_LeftFrustum[cid].Left -= projectionCenterOffset; m_RightFrustum[cid].init(
m_LeftFrustum[cid].Right -= projectionCenterOffset; m_EyeFrustumBase[ovrEye_Right].Left * camera->getFrustum().Near,
m_RightFrustum[cid].Left += projectionCenterOffset; m_EyeFrustumBase[ovrEye_Right].Right * camera->getFrustum().Near,
m_RightFrustum[cid].Right += projectionCenterOffset; m_EyeFrustumBase[ovrEye_Right].Bottom * camera->getFrustum().Near,
m_EyeFrustumBase[ovrEye_Right].Top * camera->getFrustum().Near,
camera->getFrustum().Near,
camera->getFrustum().Far,
true);
// TODO: Clipping frustum should also take into account the IPD m_ClippingFrustum[cid].init(
m_ClippingFrustum[cid] = m_LeftFrustum[cid]; min(m_EyeFrustumBase[ovrEye_Left].Left, m_EyeFrustumBase[ovrEye_Right].Left) * camera->getFrustum().Near,
m_ClippingFrustum[cid].Left = min(m_LeftFrustum[cid].Left, m_RightFrustum[cid].Left); max(m_EyeFrustumBase[ovrEye_Left].Right, m_EyeFrustumBase[ovrEye_Right].Right) * camera->getFrustum().Near,
m_ClippingFrustum[cid].Right = max(m_LeftFrustum[cid].Right, m_RightFrustum[cid].Right);*/ min(m_EyeFrustumBase[ovrEye_Left].Bottom, m_EyeFrustumBase[ovrEye_Right].Bottom) * camera->getFrustum().Near,
max(m_EyeFrustumBase[ovrEye_Left].Top, m_EyeFrustumBase[ovrEye_Right].Top) * camera->getFrustum().Near,
camera->getFrustum().Near,
camera->getFrustum().Far,
true);
} }
/// Get the frustum to use for clipping /// Get the frustum to use for clipping
@ -659,8 +686,8 @@ void CStereoOVR::getCurrentMatrix(uint cid, NL3D::UCamera *camera) const
{ {
CMatrix translate; CMatrix translate;
if (m_Stage == 2) { } if (m_Stage == 2) { }
else if (m_Stage % 2) translate.translate(CVector(m_EyeViewAdjustX[ovrEye_Left] * m_Scale, 0.f, 0.f)); else if (m_Stage % 2) translate.translate(CVector(m_EyeViewAdjustX[ovrEye_Left] * m_Scale, 0.f, 0.f)); // ok
else translate.translate(CVector(m_EyeViewAdjustX[ovrEye_Right] * m_Scale, 0.f, 0.f)); else translate.translate(CVector(m_EyeViewAdjustX[ovrEye_Right] * m_Scale, 0.f, 0.f)); // ok
CMatrix mat = m_CameraMatrix[cid] * translate; CMatrix mat = m_CameraMatrix[cid] * translate;
if (camera->getTransformMode() == NL3D::UTransformable::RotQuat) if (camera->getTransformMode() == NL3D::UTransformable::RotQuat)
{ {
@ -741,10 +768,15 @@ bool CStereoOVR::beginRenderTarget()
// Begin 3D scene render target // 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); /*nlassert(!m_SceneTexture);
m_SceneTexture = m_Driver->getRenderTargetManager().getRenderTarget(m_RenderTargetWidth, m_RenderTargetHeight); m_SceneTexture = m_Driver->getRenderTargetManager().getRenderTarget(m_RenderTargetWidth, m_RenderTargetHeight);
static_cast<CDriverUser *>(m_Driver)->setRenderTarget(*m_SceneTexture); static_cast<CDriverUser *>(m_Driver)->setRenderTarget(*m_SceneTexture);
return true; return true;*/
/*nldebug("OVR: Begin render target");
m_Driver->clearBuffers(CRGBA(64, 64, 128, 128));
m_Driver->beginDefaultRenderTarget();
m_Driver->clearBuffers(CRGBA(128, 64, 64, 128));
return true;*/
} }
return false; return false;
@ -913,6 +945,12 @@ bool CStereoOVR::endRenderTarget()
} }
// End 3D scene render target // End 3D scene render target
if (m_Driver && m_Stage == 6 && (m_Driver->getPolygonMode() == UDriver::Filled))
{
/*nldebug("OVR: End render target");
m_Driver->endDefaultRenderTarget(NULL);
return true;*/
}
/*if (m_Driver && m_Stage == 6 && (m_Driver->getPolygonMode() == UDriver::Filled)) // set to 4 to turn off distortion of 2d gui /*if (m_Driver && m_Stage == 6 && (m_Driver->getPolygonMode() == UDriver::Filled)) // set to 4 to turn off distortion of 2d gui
{ {
nlassert(m_SceneTexture); nlassert(m_SceneTexture);
@ -1006,6 +1044,12 @@ bool CStereoOVR::endRenderTarget()
NLMISC::CQuat CStereoOVR::getOrientation() const NLMISC::CQuat CStereoOVR::getOrientation() const
{ {
// broken
NLMISC::CQuat quat;
quat.identity();
return quat;
if (m_OrientationCached) if (m_OrientationCached)
return m_OrientationCache; return m_OrientationCache;