OVR: Convert texture coordinates and setup rendering material

This commit is contained in:
kaetemi 2014-08-05 03:54:19 +02:00
parent c9762fbef5
commit 031f1cdcbd
2 changed files with 58 additions and 159 deletions

View file

@ -70,8 +70,6 @@ namespace NL3D {
class ITexture; class ITexture;
class CTextureUser; class CTextureUser;
class CStereoOVRDeviceFactory; class CStereoOVRDeviceFactory;
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
@ -188,8 +186,6 @@ private:
NL3D::CTextureUser *m_SceneTexture; NL3D::CTextureUser *m_SceneTexture;
UMaterial m_UnlitMat; UMaterial m_UnlitMat;
NLMISC::CRefPtr<CVertexProgramOVR> m_VP;
NLMISC::CRefPtr<CPixelProgramOVR> m_PP;
/* /*
NL3D::UMaterial m_BarrelMat; NL3D::UMaterial m_BarrelMat;

View file

@ -144,6 +144,22 @@ public:
} }
}; };
static NLMISC::CVector2f toTex(NLMISC::CVector2f texCoord, NLMISC::CVector2f uvScaleOffset[2])
{
// return(EyeToSourceUVScale * flattened + EyeToSourceUVOffset);
NLMISC::CVector2f vec = NLMISC::CVector2f(texCoord.x * uvScaleOffset[0].x, texCoord.y * uvScaleOffset[0].y) + uvScaleOffset[1];
// some trial and error voodoo, sorry
vec = (vec + NLMISC::CVector2f(1, 1)) * 0.5f;
vec.y = 1.0f - vec.y;
vec.x = 1.0f - vec.x;
vec.x += 0.5f;
vec.y *= 2.0f;
vec.x = 1.0f - vec.x;
return vec;
}
CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NULL), m_Stage(0), m_SubStage(0), m_OrientationCached(false), m_Driver(NULL), m_SceneTexture(NULL), m_GUITexture(NULL), m_EyePosition(0.0f, 0.09f, 0.15f), m_Scale(1.0f) CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NULL), m_Stage(0), m_SubStage(0), m_OrientationCached(false), m_Driver(NULL), m_SceneTexture(NULL), m_GUITexture(NULL), m_EyePosition(0.0f, 0.09f, 0.15f), m_Scale(1.0f)
{ {
nlctassert(NL_OVR_EYE_COUNT == ovrEye_Count); nlctassert(NL_OVR_EYE_COUNT == ovrEye_Count);
@ -286,9 +302,15 @@ CStereoOVR::CStereoOVR(const CStereoOVRDeviceFactory *factory) : m_DevicePtr(NUL
{ {
ovrDistortionVertex &ov = meshData.pVertexData[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.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); NLMISC::CVector2f texR(ov.TanEyeAnglesR.x, ov.TanEyeAnglesR.y);
vba.setTexCoord(i, 1, ov.TanEyeAnglesG.x, ov.TanEyeAnglesG.y); NLMISC::CVector2f texG(ov.TanEyeAnglesG.x, ov.TanEyeAnglesG.y);
vba.setTexCoord(i, 2, ov.TanEyeAnglesB.x, ov.TanEyeAnglesB.y); NLMISC::CVector2f texB(ov.TanEyeAnglesB.x, ov.TanEyeAnglesB.y);
texR = toTex(texR, m_EyeUVScaleOffset[eye]);
texG = toTex(texG, m_EyeUVScaleOffset[eye]);
texB = toTex(texB, m_EyeUVScaleOffset[eye]);
vba.setTexCoord(i, 0, texR.x, texR.y);
vba.setTexCoord(i, 1, texG.x, texG.y);
vba.setTexCoord(i, 2, texB.x, texB.y);
NLMISC::CRGBA color; NLMISC::CRGBA color;
color.R = color.G = color.B = (uint8)(ov.VignetteFactor * 255.99f); color.R = color.G = color.B = (uint8)(ov.VignetteFactor * 255.99f);
color.A = 255; // (uint8)(ov.TimeWarpFactor * 255.99f); color.A = 255; // (uint8)(ov.TimeWarpFactor * 255.99f);
@ -338,9 +360,6 @@ CStereoOVR::~CStereoOVR()
m_Driver->deleteMaterial(m_UnlitMat); m_Driver->deleteMaterial(m_UnlitMat);
} }
m_PP.kill();
m_VP.kill();
m_Driver = NULL; m_Driver = NULL;
if (m_DevicePtr) if (m_DevicePtr)
@ -351,130 +370,8 @@ CStereoOVR::~CStereoOVR()
} }
} }
class CVertexProgramOVR : public CVertexProgram
{
public:
struct COVRIndices
{
/*uint LensCenter;
uint ScreenCenter;
uint Scale;
uint ScaleIn;
uint HmdWarpParam;*/
};
CVertexProgramOVR()
{
/*{
CSource *source = new CSource();
source->Profile = glsl330f;
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
source->setSourcePtr(g_StereoOVR_glsl330f);
addSource(source);
}*/
}
virtual ~CVertexProgramOVR()
{
}
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();
source->Profile = arbfp1;
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
source->setSourcePtr(g_StereoOVR_arbfp1);
source->ParamIndices["cLensCenter"] = 0;
source->ParamIndices["cScreenCenter"] = 1;
source->ParamIndices["cScale"] = 2;
source->ParamIndices["cScaleIn"] = 3;
source->ParamIndices["cHmdWarpParam"] = 4;
addSource(source);
}
{
CSource *source = new CSource();
source->Profile = ps_2_0;
source->Features.MaterialFlags = CProgramFeatures::TextureStages;
source->setSourcePtr(g_StereoOVR_ps_2_0);
source->ParamIndices["cLensCenter"] = 0;
source->ParamIndices["cScreenCenter"] = 1;
source->ParamIndices["cScale"] = 2;
source->ParamIndices["cScaleIn"] = 3;
source->ParamIndices["cHmdWarpParam"] = 4;
addSource(source);
}*/
}
virtual ~CPixelProgramOVR()
{
}
virtual void buildInfo()
{
CPixelProgram::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;
};
void CStereoOVR::setDriver(NL3D::UDriver *driver) void CStereoOVR::setDriver(NL3D::UDriver *driver)
{ {
nlassert(!m_PP);
nlassert(!m_VP);
m_Driver = driver; m_Driver = driver;
CDriverUser *dru = static_cast<CDriverUser *>(driver); CDriverUser *dru = static_cast<CDriverUser *>(driver);
@ -492,24 +389,27 @@ void CStereoOVR::setDriver(NL3D::UDriver *driver)
unlitMat->setZFunc(CMaterial::always); unlitMat->setZFunc(CMaterial::always);
unlitMat->setDoubleSided(true); unlitMat->setDoubleSided(true);
if (drv->supportBloomEffect() && drv->supportNonPowerOfTwoTextures()) unlitMat->texConstantColor(0, NLMISC::CRGBA(255, 0, 0, 0));
{ unlitMat->texConstantColor(1, NLMISC::CRGBA(0, 255, 0, 0));
m_PP = new CPixelProgramOVR(); unlitMat->texConstantColor(2, NLMISC::CRGBA(0, 0, 255, 0));
if (!drv->compilePixelProgram(m_PP))
{ m_UnlitMat.texEnvArg0RGB(0, UMaterial::Texture, UMaterial::SrcColor);
m_PP.kill(); m_UnlitMat.texEnvArg1RGB(0, UMaterial::Constant, UMaterial::SrcColor);
nlwarning("OVR: No pixel program support"); m_UnlitMat.texEnvOpRGB(0, UMaterial::Modulate);
return;
} m_UnlitMat.texEnvArg0RGB(1, UMaterial::Texture, UMaterial::SrcColor);
m_VP = new CVertexProgramOVR(); m_UnlitMat.texEnvArg1RGB(1, UMaterial::Constant, UMaterial::SrcColor);
if (!drv->compileVertexProgram(m_VP)) m_UnlitMat.texEnvArg2RGB(1, UMaterial::Previous, UMaterial::SrcColor);
{ m_UnlitMat.texEnvOpRGB(1, UMaterial::Mad);
m_VP.kill();
nlwarning("OVR: No vertex program support"); m_UnlitMat.texEnvArg0RGB(2, UMaterial::Texture, UMaterial::SrcColor);
m_PP.kill(); m_UnlitMat.texEnvArg1RGB(2, UMaterial::Constant, UMaterial::SrcColor);
return; m_UnlitMat.texEnvArg2RGB(2, UMaterial::Previous, UMaterial::SrcColor);
} m_UnlitMat.texEnvOpRGB(2, UMaterial::Mad);
}
m_UnlitMat.texEnvArg0RGB(3, UMaterial::Previous, UMaterial::SrcColor);
m_UnlitMat.texEnvArg1RGB(3, UMaterial::Diffuse, UMaterial::SrcColor);
m_UnlitMat.texEnvOpRGB(3, UMaterial::Modulate);
} }
bool CStereoOVR::getScreenResolution(uint &width, uint &height) bool CStereoOVR::getScreenResolution(uint &width, uint &height)
@ -958,6 +858,9 @@ bool CStereoOVR::endRenderTarget()
bool fogEnabled = m_Driver->fogEnabled(); bool fogEnabled = m_Driver->fogEnabled();
m_Driver->enableFog(false); m_Driver->enableFog(false);
// must clear everything to black (can we get a mesh to only handle the parts outside of the distortion mesh?)
m_Driver->clearRGBABuffer(CRGBA(0, 0, 0, 255));
CDriverUser *dru = static_cast<CDriverUser *>(m_Driver); CDriverUser *dru = static_cast<CDriverUser *>(m_Driver);
IDriver *drv = dru->getDriver(); IDriver *drv = dru->getDriver();
@ -966,17 +869,13 @@ bool CStereoOVR::endRenderTarget()
m_Driver->setViewport(vp); m_Driver->setViewport(vp);
m_Driver->setMatrixMode2D11(); m_Driver->setMatrixMode2D11();
// DEBUG
for (uint eye = 0; eye < ovrEye_Count; ++eye) for (uint eye = 0; eye < ovrEye_Count; ++eye)
{ {
NL3D::UMaterial umat = m_Driver->createMaterial(); CMaterial *mat = m_UnlitMat.getObjectPtr();
umat.setZWrite(false);
// mat.setZFunc(UMaterial::always); // Not nice!
umat.setDoubleSided(true);
umat.setColor(NLMISC::CRGBA::Red);
umat.setBlend(false);
CMaterial *mat = umat.getObjectPtr();
mat->setTexture(0, m_SceneTexture->getITexture()); mat->setTexture(0, m_SceneTexture->getITexture());
mat->setTexture(1, m_SceneTexture->getITexture());
mat->setTexture(2, m_SceneTexture->getITexture());
mat->setTexture(3, m_SceneTexture->getITexture());
//m_Driver->setPolygonMode(UDriver::Line); //m_Driver->setPolygonMode(UDriver::Line);
drv->activeVertexBuffer(m_VB[eye]); drv->activeVertexBuffer(m_VB[eye]);
@ -984,7 +883,10 @@ bool CStereoOVR::endRenderTarget()
drv->renderTriangles(*mat, 0, m_NbTris[eye]); drv->renderTriangles(*mat, 0, m_NbTris[eye]);
//m_Driver->setPolygonMode(UDriver::Filled); //m_Driver->setPolygonMode(UDriver::Filled);
m_Driver->deleteMaterial(umat); mat->setTexture(0, NULL);
mat->setTexture(1, NULL);
mat->setTexture(2, NULL);
mat->setTexture(3, NULL);
} }
// restore // restore
@ -996,6 +898,7 @@ bool CStereoOVR::endRenderTarget()
return true; 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);