mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-28 01:56:24 +00:00
OVR: Generate distortion mesh
This commit is contained in:
parent
e89e7985ab
commit
925a11fc14
2 changed files with 196 additions and 103 deletions
|
@ -59,6 +59,8 @@
|
||||||
#include <nel/3d/frustum.h>
|
#include <nel/3d/frustum.h>
|
||||||
#include <nel/3d/viewport.h>
|
#include <nel/3d/viewport.h>
|
||||||
#include <nel/3d/u_material.h>
|
#include <nel/3d/u_material.h>
|
||||||
|
#include <nel/3d/index_buffer.h>
|
||||||
|
#include <nel/3d/vertex_buffer.h>
|
||||||
|
|
||||||
struct ovrHmdDesc_;
|
struct ovrHmdDesc_;
|
||||||
typedef const ovrHmdDesc_ *ovrHmd;
|
typedef const ovrHmdDesc_ *ovrHmd;
|
||||||
|
@ -68,7 +70,8 @@ namespace NL3D {
|
||||||
class ITexture;
|
class ITexture;
|
||||||
class CTextureUser;
|
class CTextureUser;
|
||||||
class CStereoOVRDeviceFactory;
|
class CStereoOVRDeviceFactory;
|
||||||
/*class CPixelProgramOVR;*/
|
class CPixelProgramOVR;
|
||||||
|
class CVertexProgramOVR;
|
||||||
|
|
||||||
#define NL_STEREO_MAX_USER_CAMERAS 8
|
#define NL_STEREO_MAX_USER_CAMERAS 8
|
||||||
#define NL_OVR_EYE_COUNT 2
|
#define NL_OVR_EYE_COUNT 2
|
||||||
|
@ -154,14 +157,22 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ovrHmd m_DevicePtr;
|
ovrHmd m_DevicePtr;
|
||||||
|
|
||||||
int m_Stage;
|
int m_Stage;
|
||||||
int m_SubStage;
|
int m_SubStage;
|
||||||
|
|
||||||
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];
|
float m_EyeHFov[NL_OVR_EYE_COUNT];
|
||||||
float m_EyeAR[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];
|
||||||
|
|
||||||
|
CVertexBuffer m_VB;
|
||||||
|
CIndexBuffer m_IB;
|
||||||
|
uint m_NbTris;
|
||||||
|
|
||||||
CFrustum m_ClippingFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
CFrustum m_ClippingFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
CFrustum m_LeftFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
CFrustum m_LeftFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
CFrustum m_RightFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
CFrustum m_RightFrustum[NL_STEREO_MAX_USER_CAMERAS];
|
||||||
|
@ -170,8 +181,16 @@ private:
|
||||||
CMatrix m_InterfaceCameraMatrix;
|
CMatrix m_InterfaceCameraMatrix;
|
||||||
mutable bool m_OrientationCached;
|
mutable bool m_OrientationCached;
|
||||||
mutable NLMISC::CQuat m_OrientationCache;
|
mutable NLMISC::CQuat m_OrientationCache;
|
||||||
|
|
||||||
UDriver *m_Driver;
|
UDriver *m_Driver;
|
||||||
NL3D::CTextureUser *m_GUITexture;
|
|
||||||
|
CTextureUser *m_GUITexture;
|
||||||
|
|
||||||
|
UMaterial m_UnlitMat;
|
||||||
|
NLMISC::CRefPtr<CVertexProgramOVR> m_VP;
|
||||||
|
NLMISC::CRefPtr<CPixelProgramOVR> m_PP;
|
||||||
|
|
||||||
|
|
||||||
/*NL3D::CTextureUser *m_SceneTexture;
|
/*NL3D::CTextureUser *m_SceneTexture;
|
||||||
NL3D::UMaterial m_BarrelMat;
|
NL3D::UMaterial m_BarrelMat;
|
||||||
NLMISC::CQuadUV m_BarrelQuadLeft;
|
NLMISC::CQuadUV m_BarrelQuadLeft;
|
||||||
|
|
|
@ -188,10 +188,10 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
|
||||||
float nativeWidth = m_DevicePtr->Resolution.w;
|
float nativeWidth = m_DevicePtr->Resolution.w;
|
||||||
float nativeHeight = m_DevicePtr->Resolution.h;
|
float nativeHeight = m_DevicePtr->Resolution.h;
|
||||||
|
|
||||||
|
// get render descriptions for default fov
|
||||||
ovrEyeRenderDesc eyeRenderDesc[ovrEye_Count];
|
ovrEyeRenderDesc eyeRenderDesc[ovrEye_Count];
|
||||||
eyeRenderDesc[ovrEye_Left] = ovrHmd_GetRenderDesc(m_DevicePtr, ovrEye_Left, m_DevicePtr->DefaultEyeFov[ovrEye_Left]);
|
eyeRenderDesc[ovrEye_Left] = ovrHmd_GetRenderDesc(m_DevicePtr, ovrEye_Left, m_DevicePtr->DefaultEyeFov[ovrEye_Left]);
|
||||||
eyeRenderDesc[ovrEye_Right] = ovrHmd_GetRenderDesc(m_DevicePtr, ovrEye_Right, m_DevicePtr->DefaultEyeFov[ovrEye_Right]);
|
eyeRenderDesc[ovrEye_Right] = ovrHmd_GetRenderDesc(m_DevicePtr, ovrEye_Right, m_DevicePtr->DefaultEyeFov[ovrEye_Right]);
|
||||||
|
|
||||||
nldebug("OVR: LEFT DistortedViewport: x: %i, y: %i, w: %i, h: %i", eyeRenderDesc[0].DistortedViewport.Pos.x, eyeRenderDesc[0].DistortedViewport.Pos.y, eyeRenderDesc[0].DistortedViewport.Size.w, eyeRenderDesc[0].DistortedViewport.Size.h);
|
nldebug("OVR: LEFT DistortedViewport: x: %i, y: %i, w: %i, h: %i", eyeRenderDesc[0].DistortedViewport.Pos.x, eyeRenderDesc[0].DistortedViewport.Pos.y, eyeRenderDesc[0].DistortedViewport.Size.w, eyeRenderDesc[0].DistortedViewport.Size.h);
|
||||||
nldebug("OVR: LEFT PixelsPerTanAngleAtCenter: x: %f, y: %f ", eyeRenderDesc[0].PixelsPerTanAngleAtCenter.x, eyeRenderDesc[0].PixelsPerTanAngleAtCenter.y);
|
nldebug("OVR: LEFT PixelsPerTanAngleAtCenter: x: %f, y: %f ", eyeRenderDesc[0].PixelsPerTanAngleAtCenter.x, eyeRenderDesc[0].PixelsPerTanAngleAtCenter.y);
|
||||||
nldebug("OVR: LEFT ViewAdjust: x: %f, y: %f, z: %f ", eyeRenderDesc[0].ViewAdjust.x, eyeRenderDesc[0].ViewAdjust.y, eyeRenderDesc[0].ViewAdjust.z);
|
nldebug("OVR: LEFT ViewAdjust: x: %f, y: %f, z: %f ", eyeRenderDesc[0].ViewAdjust.x, eyeRenderDesc[0].ViewAdjust.y, eyeRenderDesc[0].ViewAdjust.z);
|
||||||
|
@ -207,10 +207,12 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
|
||||||
// 2014/08/04 19:55:46 DBG 2e18 snowballs_client.exe stereo_ovr_04.cpp 193 NL3D::CStereoOVR::CStereoOVR : OVR: RIGHT PixelsPerTanAngleAtCenter: x: 363.247864, y: 363.247864
|
// 2014/08/04 19:55:46 DBG 2e18 snowballs_client.exe stereo_ovr_04.cpp 193 NL3D::CStereoOVR::CStereoOVR : OVR: RIGHT PixelsPerTanAngleAtCenter: x: 363.247864, y: 363.247864
|
||||||
// 2014/08/04 19:55:46 DBG 2e18 snowballs_client.exe stereo_ovr_04.cpp 194 NL3D::CStereoOVR::CStereoOVR : OVR: RIGHT ViewAdjust: x: -0.031868, y: 0.000000, z: 0.000000
|
// 2014/08/04 19:55:46 DBG 2e18 snowballs_client.exe stereo_ovr_04.cpp 194 NL3D::CStereoOVR::CStereoOVR : OVR: RIGHT ViewAdjust: x: -0.031868, y: 0.000000, z: 0.000000
|
||||||
|
|
||||||
ovrSizei fovTexLeftSize = ovrHmd_GetFovTextureSize(m_DevicePtr, ovrEye_Left, eyeRenderDesc[ovrEye_Left].Fov, 1.0f);
|
// find out the recommended render target size
|
||||||
ovrSizei fovTexRightSize = ovrHmd_GetFovTextureSize(m_DevicePtr, ovrEye_Right, eyeRenderDesc[ovrEye_Right].Fov, 1.0f);
|
ovrSizei fovTextureSize[ovrEye_Count];
|
||||||
m_RenderTargetWidth = fovTexLeftSize.w + fovTexRightSize.w;
|
fovTextureSize[ovrEye_Left] = ovrHmd_GetFovTextureSize(m_DevicePtr, ovrEye_Left, eyeRenderDesc[ovrEye_Left].Fov, 1.0f);
|
||||||
m_RenderTargetHeight = max(fovTexLeftSize.h, fovTexRightSize.h);
|
fovTextureSize[ovrEye_Right] = ovrHmd_GetFovTextureSize(m_DevicePtr, ovrEye_Right, eyeRenderDesc[ovrEye_Right].Fov, 1.0f);
|
||||||
|
m_RenderTargetWidth = fovTextureSize[ovrEye_Left].w + fovTextureSize[ovrEye_Right].w;
|
||||||
|
m_RenderTargetHeight = max(fovTextureSize[ovrEye_Left].h, fovTextureSize[ovrEye_Right].h);
|
||||||
nldebug("OVR: RenderTarget: w: %u, h: %u", m_RenderTargetWidth, m_RenderTargetHeight);
|
nldebug("OVR: RenderTarget: w: %u, h: %u", m_RenderTargetWidth, m_RenderTargetHeight);
|
||||||
|
|
||||||
// 2014/08/04 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 213 NL3D::CStereoOVR::CStereoOVR : OVR: RenderTarget: w: 2414, h: 1870 // That looks a bit excessive...
|
// 2014/08/04 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 213 NL3D::CStereoOVR::CStereoOVR : OVR: RenderTarget: w: 2414, h: 1870 // That looks a bit excessive...
|
||||||
|
@ -219,24 +221,90 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
|
||||||
{
|
{
|
||||||
ovrFovPort &fov = eyeRenderDesc[eye].Fov;
|
ovrFovPort &fov = eyeRenderDesc[eye].Fov;
|
||||||
|
|
||||||
|
// setup viewport
|
||||||
m_EyeViewport[eye].init(
|
m_EyeViewport[eye].init(
|
||||||
(float)eyeRenderDesc[eye].DistortedViewport.Pos.x / nativeWidth,
|
(float)eyeRenderDesc[eye].DistortedViewport.Pos.x / nativeWidth,
|
||||||
(float)eyeRenderDesc[eye].DistortedViewport.Pos.y / nativeHeight,
|
(float)eyeRenderDesc[eye].DistortedViewport.Pos.y / nativeHeight,
|
||||||
(float)eyeRenderDesc[eye].DistortedViewport.Size.w / nativeWidth,
|
(float)eyeRenderDesc[eye].DistortedViewport.Size.w / nativeWidth,
|
||||||
(float)eyeRenderDesc[eye].DistortedViewport.Size.h / nativeHeight);
|
(float)eyeRenderDesc[eye].DistortedViewport.Size.h / nativeHeight);
|
||||||
nldebug("OVR: EyeViewport: x: %f, y: %f, w: %f, h: %f", m_EyeViewport[eye].getX(), m_EyeViewport[eye].getY(), m_EyeViewport[eye].getWidth(), m_EyeViewport[eye].getHeight());
|
nldebug("OVR: EyeViewport: x: %f, y: %f, w: %f, h: %f", m_EyeViewport[eye].getX(), m_EyeViewport[eye].getY(), m_EyeViewport[eye].getWidth(), m_EyeViewport[eye].getHeight());
|
||||||
|
ovrRecti eyeViewport;
|
||||||
|
eyeViewport.Pos.x = (eyeRenderDesc[eye].DistortedViewport.Pos.x * m_RenderTargetWidth) / m_DevicePtr->Resolution.w;
|
||||||
|
eyeViewport.Pos.y = (eyeRenderDesc[eye].DistortedViewport.Pos.y * m_RenderTargetHeight) / m_DevicePtr->Resolution.h;
|
||||||
|
eyeViewport.Size.w = (eyeRenderDesc[eye].DistortedViewport.Size.w * m_RenderTargetWidth) / m_DevicePtr->Resolution.w;
|
||||||
|
eyeViewport.Size.h = (eyeRenderDesc[eye].DistortedViewport.Size.h * m_RenderTargetHeight) / m_DevicePtr->Resolution.h;
|
||||||
|
|
||||||
|
// 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;
|
||||||
m_EyeHFov[eye] = horizontalFullFovInRadians;
|
m_EyeHFov[eye] = horizontalFullFovInRadians;
|
||||||
m_EyeAR[eye] = aspectRatio;
|
m_EyeAR[eye] = aspectRatio;
|
||||||
nldebug("OVR: FOV: %f, AR: %f", horizontalFullFovInRadians, aspectRatio);
|
nldebug("OVR: HFOV: %f, AR: %f", horizontalFullFovInRadians, aspectRatio);
|
||||||
|
|
||||||
|
// get distortion mesh
|
||||||
|
ovrDistortionMesh meshData;
|
||||||
|
ovrHmd_CreateDistortionMesh(m_DevicePtr, (ovrEyeType)eye, fov,
|
||||||
|
ovrDistortionCap_Chromatic | ovrDistortionCap_TimeWarp | ovrDistortionCap_Vignette,
|
||||||
|
&meshData);
|
||||||
|
ovrVector2f uvScaleOffset[2];
|
||||||
|
|
||||||
|
// get parameters for programs
|
||||||
|
ovrHmd_GetRenderScaleAndOffset(fov,
|
||||||
|
fovTextureSize[eye], eyeViewport,
|
||||||
|
(ovrVector2f *)uvScaleOffset);
|
||||||
|
m_EyeUVScaleOffset[eye][0] = NLMISC::CVector2f(uvScaleOffset[0].x, uvScaleOffset[0].y);
|
||||||
|
m_EyeUVScaleOffset[eye][1] = NLMISC::CVector2f(uvScaleOffset[1].x, uvScaleOffset[1].y);
|
||||||
|
|
||||||
|
// create distortion mesh vertex buffer
|
||||||
|
m_VB.setVertexFormat(CVertexBuffer::PositionFlag | CVertexBuffer::TexCoord0Flag | CVertexBuffer::TexCoord1Flag | CVertexBuffer::TexCoord2Flag | CVertexBuffer::PrimaryColorFlag);
|
||||||
|
m_VB.setPreferredMemory(CVertexBuffer::StaticPreferred, false);
|
||||||
|
m_VB.setNumVertices(meshData.VertexCount);
|
||||||
|
{
|
||||||
|
CVertexBufferReadWrite vba;
|
||||||
|
m_VB.lock(vba);
|
||||||
|
for (uint i = 0; i < meshData.VertexCount; ++i)
|
||||||
|
{
|
||||||
|
ovrDistortionVertex &ov = meshData.pVertexData[i];
|
||||||
|
vba.setVertexCoord(i, (ov.ScreenPosNDC.x + 1.0f) * 0.5f, (ov.ScreenPosNDC.y + 1.0f) * 0.5f, 0.5f);
|
||||||
|
vba.setTexCoord(i, 0, ov.TanEyeAnglesR.x, ov.TanEyeAnglesR.y);
|
||||||
|
vba.setTexCoord(i, 1, ov.TanEyeAnglesG.x, ov.TanEyeAnglesG.y);
|
||||||
|
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);
|
||||||
|
vba.setColor(i, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// create distortion mesh index buffer
|
||||||
|
m_IB.setFormat(NL_DEFAULT_INDEX_BUFFER_FORMAT);
|
||||||
|
m_IB.setPreferredMemory(CIndexBuffer::StaticPreferred, false);
|
||||||
|
m_IB.setNumIndexes(meshData.IndexCount);
|
||||||
|
{
|
||||||
|
CIndexBufferReadWrite iba;
|
||||||
|
m_IB.lock(iba);
|
||||||
|
for (uint i = 0; i + 2 < meshData.IndexCount; i += 3)
|
||||||
|
{
|
||||||
|
nlassert(meshData.pIndexData[i] < meshData.VertexCount);
|
||||||
|
nlassert(meshData.pIndexData[i + 1] < meshData.VertexCount);
|
||||||
|
nlassert(meshData.pIndexData[i + 2] < meshData.VertexCount);
|
||||||
|
iba.setTri(i, meshData.pIndexData[i], meshData.pIndexData[i + 1], meshData.pIndexData[i + 2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set tri count
|
||||||
|
m_NbTris = meshData.IndexCount / 3;
|
||||||
|
|
||||||
|
// destroy ovr distortion mesh
|
||||||
|
ovrHmd_DestroyDistortionMesh(&meshData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2014/08/04 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 222 NL3D::CStereoOVR::CStereoOVR : OVR: EyeViewport: x: 0.000000, y: 0.000000, w: 0.500000, h: 1.000000
|
// 2014/08/04 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 222 NL3D::CStereoOVR::CStereoOVR : OVR: EyeViewport: x: 0.000000, y: 0.000000, w: 0.500000, h: 1.000000
|
||||||
|
// 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 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 222 NL3D::CStereoOVR::CStereoOVR : OVR: EyeViewport: x: 0.500000, y: 0.000000, w: 0.500000, h: 1.000000
|
// 2014/08/04 20:22:03 DBG 30e4 snowballs_client.exe stereo_ovr_04.cpp 222 NL3D::CStereoOVR::CStereoOVR : OVR: EyeViewport: x: 0.500000, y: 0.000000, w: 0.500000, h: 1.000000
|
||||||
|
// 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");
|
||||||
|
@ -247,16 +315,15 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
|
||||||
|
|
||||||
CStereoOVR::~CStereoOVR()
|
CStereoOVR::~CStereoOVR()
|
||||||
{
|
{
|
||||||
/*if (!m_BarrelMat.empty())
|
if (!m_UnlitMat.empty())
|
||||||
{
|
{
|
||||||
m_BarrelMat.getObjectPtr()->setTexture(0, NULL);
|
m_Driver->deleteMaterial(m_UnlitMat);
|
||||||
m_Driver->deleteMaterial(m_BarrelMat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete m_PixelProgram;
|
m_PP.kill();
|
||||||
m_PixelProgram = NULL;
|
m_VP.kill();
|
||||||
|
|
||||||
m_Driver = NULL;*/
|
m_Driver = NULL;
|
||||||
|
|
||||||
if (m_DevicePtr)
|
if (m_DevicePtr)
|
||||||
{
|
{
|
||||||
|
@ -265,40 +332,73 @@ CStereoOVR::~CStereoOVR()
|
||||||
--s_DeviceCounter;
|
--s_DeviceCounter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
class CPixelProgramOVR : public CPixelProgram
|
class CVertexProgramOVR : public CVertexProgram
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
struct COVRIndices
|
struct COVRIndices
|
||||||
{
|
{
|
||||||
uint LensCenter;
|
/*uint LensCenter;
|
||||||
uint ScreenCenter;
|
uint ScreenCenter;
|
||||||
uint Scale;
|
uint Scale;
|
||||||
uint ScaleIn;
|
uint ScaleIn;
|
||||||
uint HmdWarpParam;
|
uint HmdWarpParam;*/
|
||||||
};
|
};
|
||||||
|
|
||||||
CPixelProgramOVR()
|
CVertexProgramOVR()
|
||||||
{
|
|
||||||
{
|
{
|
||||||
|
/*{
|
||||||
CSource *source = new CSource();
|
CSource *source = new CSource();
|
||||||
source->Profile = glsl330f;
|
source->Profile = glsl330f;
|
||||||
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
||||||
source->setSourcePtr(g_StereoOVR_glsl330f);
|
source->setSourcePtr(g_StereoOVR_glsl330f);
|
||||||
addSource(source);
|
addSource(source);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual ~CVertexProgramOVR()
|
||||||
{
|
{
|
||||||
CSource *source = new CSource();
|
|
||||||
source->Profile = fp40;
|
|
||||||
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
|
|
||||||
source->setSourcePtr(g_StereoOVR_fp40);
|
|
||||||
source->ParamIndices["cLensCenter"] = 0;
|
|
||||||
source->ParamIndices["cScreenCenter"] = 1;
|
|
||||||
source->ParamIndices["cScale"] = 2;
|
|
||||||
source->ParamIndices["cScaleIn"] = 3;
|
|
||||||
source->ParamIndices["cHmdWarpParam"] = 4;
|
|
||||||
addSource(source);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void buildInfo()
|
||||||
|
{
|
||||||
|
CVertexProgram::buildInfo();
|
||||||
|
|
||||||
|
/*m_OVRIndices.LensCenter = getUniformIndex("cLensCenter");
|
||||||
|
nlassert(m_OVRIndices.LensCenter != ~0);
|
||||||
|
m_OVRIndices.ScreenCenter = getUniformIndex("cScreenCenter");
|
||||||
|
nlassert(m_OVRIndices.ScreenCenter != ~0);
|
||||||
|
m_OVRIndices.Scale = getUniformIndex("cScale");
|
||||||
|
nlassert(m_OVRIndices.Scale != ~0);
|
||||||
|
m_OVRIndices.ScaleIn = getUniformIndex("cScaleIn");
|
||||||
|
nlassert(m_OVRIndices.ScaleIn != ~0);
|
||||||
|
m_OVRIndices.HmdWarpParam = getUniformIndex("cHmdWarpParam");
|
||||||
|
nlassert(m_OVRIndices.HmdWarpParam != ~0);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const COVRIndices &ovrIndices() { return m_OVRIndices; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
COVRIndices m_OVRIndices;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class CPixelProgramOVR : public CPixelProgram
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct COVRIndices
|
||||||
|
{
|
||||||
|
/*uint LensCenter;
|
||||||
|
uint ScreenCenter;
|
||||||
|
uint Scale;
|
||||||
|
uint ScaleIn;
|
||||||
|
uint HmdWarpParam;*/
|
||||||
|
};
|
||||||
|
|
||||||
|
CPixelProgramOVR()
|
||||||
|
{
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
CSource *source = new CSource();
|
CSource *source = new CSource();
|
||||||
source->Profile = arbfp1;
|
source->Profile = arbfp1;
|
||||||
|
@ -322,7 +422,7 @@ public:
|
||||||
source->ParamIndices["cScaleIn"] = 3;
|
source->ParamIndices["cScaleIn"] = 3;
|
||||||
source->ParamIndices["cHmdWarpParam"] = 4;
|
source->ParamIndices["cHmdWarpParam"] = 4;
|
||||||
addSource(source);
|
addSource(source);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~CPixelProgramOVR()
|
virtual ~CPixelProgramOVR()
|
||||||
|
@ -334,7 +434,7 @@ public:
|
||||||
{
|
{
|
||||||
CPixelProgram::buildInfo();
|
CPixelProgram::buildInfo();
|
||||||
|
|
||||||
m_OVRIndices.LensCenter = getUniformIndex("cLensCenter");
|
/*m_OVRIndices.LensCenter = getUniformIndex("cLensCenter");
|
||||||
nlassert(m_OVRIndices.LensCenter != ~0);
|
nlassert(m_OVRIndices.LensCenter != ~0);
|
||||||
m_OVRIndices.ScreenCenter = getUniformIndex("cScreenCenter");
|
m_OVRIndices.ScreenCenter = getUniformIndex("cScreenCenter");
|
||||||
nlassert(m_OVRIndices.ScreenCenter != ~0);
|
nlassert(m_OVRIndices.ScreenCenter != ~0);
|
||||||
|
@ -343,7 +443,7 @@ public:
|
||||||
m_OVRIndices.ScaleIn = getUniformIndex("cScaleIn");
|
m_OVRIndices.ScaleIn = getUniformIndex("cScaleIn");
|
||||||
nlassert(m_OVRIndices.ScaleIn != ~0);
|
nlassert(m_OVRIndices.ScaleIn != ~0);
|
||||||
m_OVRIndices.HmdWarpParam = getUniformIndex("cHmdWarpParam");
|
m_OVRIndices.HmdWarpParam = getUniformIndex("cHmdWarpParam");
|
||||||
nlassert(m_OVRIndices.HmdWarpParam != ~0);
|
nlassert(m_OVRIndices.HmdWarpParam != ~0);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const COVRIndices &ovrIndices() { return m_OVRIndices; }
|
inline const COVRIndices &ovrIndices() { return m_OVRIndices; }
|
||||||
|
@ -352,84 +452,58 @@ private:
|
||||||
COVRIndices m_OVRIndices;
|
COVRIndices m_OVRIndices;
|
||||||
|
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
|
||||||
void CStereoOVR::setDriver(NL3D::UDriver *driver)
|
void CStereoOVR::setDriver(NL3D::UDriver *driver)
|
||||||
{/*
|
|
||||||
nlassert(!m_PixelProgram);
|
|
||||||
|
|
||||||
NL3D::IDriver *drvInternal = (static_cast<CDriverUser *>(driver))->getDriver();
|
|
||||||
|
|
||||||
if (drvInternal->supportBloomEffect() && drvInternal->supportNonPowerOfTwoTextures())
|
|
||||||
{
|
|
||||||
m_PixelProgram = new CPixelProgramOVR();
|
|
||||||
if (!drvInternal->compilePixelProgram(m_PixelProgram))
|
|
||||||
{
|
|
||||||
m_PixelProgram.kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_PixelProgram)
|
|
||||||
{
|
{
|
||||||
|
nlassert(!m_PP);
|
||||||
|
nlassert(!m_VP);
|
||||||
m_Driver = driver;
|
m_Driver = driver;
|
||||||
|
|
||||||
/*m_BarrelTex = new CTextureBloom(); // lol bloom
|
CDriverUser *dru = static_cast<CDriverUser *>(driver);
|
||||||
m_BarrelTex->setRenderTarget(true);
|
IDriver *drv = dru->getDriver();
|
||||||
m_BarrelTex->setReleasable(false);
|
|
||||||
m_BarrelTex->resize(m_DevicePtr->HMDInfo.HResolution, m_DevicePtr->HMDInfo.VResolution);
|
|
||||||
m_BarrelTex->setFilterMode(ITexture::Linear, ITexture::LinearMipMapOff);
|
|
||||||
m_BarrelTex->setWrapS(ITexture::Clamp);
|
|
||||||
m_BarrelTex->setWrapT(ITexture::Clamp);
|
|
||||||
drvInternal->setupTexture(*m_BarrelTex);
|
|
||||||
m_BarrelTexU = new CTextureUser(m_BarrelTex);* /
|
|
||||||
|
|
||||||
m_BarrelMat = m_Driver->createMaterial();
|
m_UnlitMat = m_Driver->createMaterial();
|
||||||
m_BarrelMat.initUnlit();
|
m_UnlitMat.initUnlit();
|
||||||
m_BarrelMat.setColor(CRGBA::White);
|
m_UnlitMat.setColor(CRGBA::White);
|
||||||
m_BarrelMat.setBlend (false);
|
m_UnlitMat.setBlend (false);
|
||||||
m_BarrelMat.setAlphaTest (false);
|
m_UnlitMat.setAlphaTest (false);
|
||||||
NL3D::CMaterial *barrelMat = m_BarrelMat.getObjectPtr();
|
NL3D::CMaterial *unlitMat = m_UnlitMat.getObjectPtr();
|
||||||
barrelMat->setShader(NL3D::CMaterial::Normal);
|
unlitMat->setShader(NL3D::CMaterial::Normal);
|
||||||
barrelMat->setBlendFunc(CMaterial::one, CMaterial::zero);
|
unlitMat->setBlendFunc(CMaterial::one, CMaterial::zero);
|
||||||
barrelMat->setZWrite(false);
|
unlitMat->setZWrite(false);
|
||||||
barrelMat->setZFunc(CMaterial::always);
|
unlitMat->setZFunc(CMaterial::always);
|
||||||
barrelMat->setDoubleSided(true);
|
unlitMat->setDoubleSided(true);
|
||||||
// barrelMat->setTexture(0, m_BarrelTex);
|
|
||||||
|
|
||||||
m_BarrelQuadLeft.V0 = CVector(0.f, 0.f, 0.5f);
|
if (drv->supportBloomEffect() && drv->supportNonPowerOfTwoTextures())
|
||||||
m_BarrelQuadLeft.V1 = CVector(0.5f, 0.f, 0.5f);
|
|
||||||
m_BarrelQuadLeft.V2 = CVector(0.5f, 1.f, 0.5f);
|
|
||||||
m_BarrelQuadLeft.V3 = CVector(0.f, 1.f, 0.5f);
|
|
||||||
|
|
||||||
m_BarrelQuadRight.V0 = CVector(0.5f, 0.f, 0.5f);
|
|
||||||
m_BarrelQuadRight.V1 = CVector(1.f, 0.f, 0.5f);
|
|
||||||
m_BarrelQuadRight.V2 = CVector(1.f, 1.f, 0.5f);
|
|
||||||
m_BarrelQuadRight.V3 = CVector(0.5f, 1.f, 0.5f);
|
|
||||||
|
|
||||||
// nlassert(!drvInternal->isTextureRectangle(m_BarrelTex)); // not allowed
|
|
||||||
|
|
||||||
m_BarrelQuadLeft.Uv0 = CUV(0.f, 0.f);
|
|
||||||
m_BarrelQuadLeft.Uv1 = CUV(0.5f, 0.f);
|
|
||||||
m_BarrelQuadLeft.Uv2 = CUV(0.5f, 1.f);
|
|
||||||
m_BarrelQuadLeft.Uv3 = CUV(0.f, 1.f);
|
|
||||||
|
|
||||||
m_BarrelQuadRight.Uv0 = CUV(0.5f, 0.f);
|
|
||||||
m_BarrelQuadRight.Uv1 = CUV(1.f, 0.f);
|
|
||||||
m_BarrelQuadRight.Uv2 = CUV(1.f, 1.f);
|
|
||||||
m_BarrelQuadRight.Uv3 = CUV(0.5f, 1.f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
nlwarning("VR: No pixel program support");
|
m_PP = new CPixelProgramOVR();
|
||||||
}*/
|
if (!drv->compilePixelProgram(m_PP))
|
||||||
|
{
|
||||||
|
m_PP.kill();
|
||||||
|
nlwarning("OVR: No pixel program support");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_VP = new CVertexProgramOVR();
|
||||||
|
if (!drv->compileVertexProgram(m_VP))
|
||||||
|
{
|
||||||
|
m_VP.kill();
|
||||||
|
nlwarning("OVR: No vertex program support");
|
||||||
|
m_PP.kill();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CStereoOVR::getScreenResolution(uint &width, uint &height)
|
bool CStereoOVR::getScreenResolution(uint &width, uint &height)
|
||||||
{
|
{
|
||||||
/*width = m_DevicePtr->HMDInfo.HResolution;
|
if (m_DevicePtr)
|
||||||
height = m_DevicePtr->HMDInfo.VResolution;*/
|
{
|
||||||
|
width = m_DevicePtr->Resolution.w;
|
||||||
|
height = m_DevicePtr->Resolution.h;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CStereoOVR::initCamera(uint cid, const NL3D::UCamera *camera)
|
void CStereoOVR::initCamera(uint cid, const NL3D::UCamera *camera)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue