From c766940e75d1e96d294ae34dac91b99e6fb3cb64 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Fri, 13 Sep 2013 21:47:42 +0200 Subject: [PATCH] Use named indices for per pixel light vertex program --HG-- branch : multipass-stereo --- code/nel/src/3d/meshvp_per_pixel_light.cpp | 41 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/code/nel/src/3d/meshvp_per_pixel_light.cpp b/code/nel/src/3d/meshvp_per_pixel_light.cpp index cf2d35f39..b607aa7d5 100644 --- a/code/nel/src/3d/meshvp_per_pixel_light.cpp +++ b/code/nel/src/3d/meshvp_per_pixel_light.cpp @@ -357,9 +357,12 @@ static const char* PPLightingVPCodeTest = class CVertexProgramPerPixelLight : public CVertexProgramLighted { public: - class CIdx + struct CIdx { - + /// Position or direction of strongest light + uint StrongestLight; + /// Viewer position + uint ViewerPos; }; CVertexProgramPerPixelLight(uint vp); virtual ~CVertexProgramPerPixelLight() { }; @@ -436,6 +439,7 @@ CVertexProgramPerPixelLight::CVertexProgramPerPixelLight(uint vp) source->DisplayName = NLMISC::toString("nelvp/MeshVPPerPixel/%i", vp); source->Profile = CVertexProgram::nelvp; source->setSource(vpCode); + source->ParamIndices["modelViewProjection"] = 0; addSource(source); } @@ -448,6 +452,27 @@ CVertexProgramPerPixelLight::CVertexProgramPerPixelLight(uint vp) void CVertexProgramPerPixelLight::buildInfo() { CVertexProgramLighted::buildInfo(); + if (profile() == nelvp) + { + m_Idx.StrongestLight = 4; + if (m_FeaturesLighted.SupportSpecular) + { + m_Idx.ViewerPos = 5; + } + else + { + m_Idx.ViewerPos = ~0; + } + } + else + { + // TODO_VP_GLSL + } + nlassert(m_Idx.StrongestLight != ~0); + if (m_FeaturesLighted.SupportSpecular) + { + nlassert(m_Idx.ViewerPos != ~0); + } } @@ -485,10 +510,12 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, } // enable(true, drv); // must enable the vertex program before the vb is activated + CVertexProgramPerPixelLight *program = _ActiveVertexProgram; + nlassert(program); // CRenderTrav *renderTrav= &scene->getRenderTrav(); /// Setup for gouraud lighting - renderTrav->beginVPLightSetup(_ActiveVertexProgram, invertedModelMat); + renderTrav->beginVPLightSetup(program, invertedModelMat); // sint strongestLightIndex = renderTrav->getStrongestLightIndex(); if (strongestLightIndex == -1) return false; // if no strongest light, disable this vertex program @@ -502,7 +529,7 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, { // put light direction in object space NLMISC::CVector lPos = invertedModelMat.mulVector(strongestLight.getDirection()); - drv->setConstant(4, lPos); + drv->setUniform3f(IDriver::VertexProgram, program->idx().StrongestLight, lPos); _IsPointLight = false; } break; @@ -510,7 +537,7 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, { // put light in object space NLMISC::CVector lPos = invertedModelMat * strongestLight.getPosition(); - drv->setConstant(4, lPos); + drv->setUniform3f(IDriver::VertexProgram, program->idx().StrongestLight, lPos); _IsPointLight = true; } break; @@ -524,11 +551,11 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, { // viewer pos in object space NLMISC::CVector vPos = invertedModelMat * viewerPos; - drv->setConstant(5, vPos); + drv->setUniform3f(IDriver::VertexProgram, program->idx().ViewerPos, vPos); } // c[0..3] take the ModelViewProjection Matrix. After setupModelMatrix(); - drv->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity); + drv->setUniformMatrix(IDriver::VertexProgram, program->getUniformIndex(CGPUProgramIndex::ModelViewProjection), IDriver::ModelViewProjection, IDriver::Identity); return true; }