From 256f7ff06caded36d77ad3cef849f372cec2f655 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 14 Sep 2013 16:23:11 +0200 Subject: [PATCH 1/5] Cleanup unused code --- code/nel/include/nel/3d/water_env_map.h | 2 +- code/nel/include/nel/3d/water_shape.h | 4 ++-- code/nel/src/3d/water_env_map.cpp | 5 ++--- code/nel/src/3d/water_shape.cpp | 15 +++++++-------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/code/nel/include/nel/3d/water_env_map.h b/code/nel/include/nel/3d/water_env_map.h index 384f55b56..50fca18ec 100644 --- a/code/nel/include/nel/3d/water_env_map.h +++ b/code/nel/include/nel/3d/water_env_map.h @@ -61,7 +61,7 @@ public: // Get envmap 2D texture (after projection of cube map) ITexture *getEnvMap2D() const { return _Env2D; } // tmp for debug : render test mesh with current model / view matrixs - void renderTestMesh(IDriver &driver); + // void renderTestMesh(IDriver &driver); // set constant alpha of envmap void setAlpha(uint8 alpha) { _Alpha = alpha; } uint8 getAlpha() const { return _Alpha; } diff --git a/code/nel/include/nel/3d/water_shape.h b/code/nel/include/nel/3d/water_shape.h index 94bdabea1..dc7f20426 100644 --- a/code/nel/include/nel/3d/water_shape.h +++ b/code/nel/include/nel/3d/water_shape.h @@ -270,14 +270,14 @@ private: static bool _GridSizeTouched; // - static NLMISC::CSmartPtr _VertexProgramBump1; + /*static NLMISC::CSmartPtr _VertexProgramBump1; static NLMISC::CSmartPtr _VertexProgramBump2; // static NLMISC::CSmartPtr _VertexProgramBump1Diffuse; static NLMISC::CSmartPtr _VertexProgramBump2Diffuse; // static NLMISC::CSmartPtr _VertexProgramNoBump; - static NLMISC::CSmartPtr _VertexProgramNoBumpDiffuse; + static NLMISC::CSmartPtr _VertexProgramNoBumpDiffuse;*/ // static NLMISC::CSmartPtr _VertexProgramNoWave; static NLMISC::CSmartPtr _VertexProgramNoWaveDiffuse; diff --git a/code/nel/src/3d/water_env_map.cpp b/code/nel/src/3d/water_env_map.cpp index 4fc5819af..a1b954764 100644 --- a/code/nel/src/3d/water_env_map.cpp +++ b/code/nel/src/3d/water_env_map.cpp @@ -226,7 +226,7 @@ void CWaterEnvMap::doInit() _MaterialPassThru.setZFunc(CMaterial::always); } } - +/* static const char *testMeshVPstr = "!!VP1.0\n\ DP4 o[HPOS].x, c[0], v[0]; \n\ @@ -257,7 +257,6 @@ public: source->ParamIndices["programConstant0"] = 4; addSource(source); } - // TODO_VP_GLSL } virtual ~CVertexProgramTestMeshVP() { @@ -309,7 +308,7 @@ void CWaterEnvMap::renderTestMesh(IDriver &driver) driver.renderTriangles(_MaterialPassThruZTest, 0, TEST_VB_NUM_TRIS); driver.activeVertexProgram(NULL); } - +*/ // ******************************************************************************* void CWaterEnvMap::initFlattenVB() { diff --git a/code/nel/src/3d/water_shape.cpp b/code/nel/src/3d/water_shape.cpp index 33f9bdfa4..5c675b12b 100644 --- a/code/nel/src/3d/water_shape.cpp +++ b/code/nel/src/3d/water_shape.cpp @@ -250,19 +250,19 @@ uint32 CWaterShape::_XGridBorder = 4; uint32 CWaterShape::_YGridBorder = 4; uint32 CWaterShape::_MaxGridSize; bool CWaterShape::_GridSizeTouched = true; -NLMISC::CSmartPtr CWaterShape::_VertexProgramBump1; +/*NLMISC::CSmartPtr CWaterShape::_VertexProgramBump1; NLMISC::CSmartPtr CWaterShape::_VertexProgramBump2; NLMISC::CSmartPtr CWaterShape::_VertexProgramBump1Diffuse; NLMISC::CSmartPtr CWaterShape::_VertexProgramBump2Diffuse; NLMISC::CSmartPtr CWaterShape::_VertexProgramNoBump; -NLMISC::CSmartPtr CWaterShape::_VertexProgramNoBumpDiffuse; +NLMISC::CSmartPtr CWaterShape::_VertexProgramNoBumpDiffuse;*/ // water with no waves NLMISC::CSmartPtr CWaterShape::_VertexProgramNoWave; NLMISC::CSmartPtr CWaterShape::_VertexProgramNoWaveDiffuse; /** Build a vertex program for water depending on requirements - */ + *//* static CVertexProgram *BuildWaterVP(bool diffuseMap, bool bumpMap, bool use2BumpMap) { std::string vp = WaterVPStartCode; @@ -285,9 +285,8 @@ static CVertexProgram *BuildWaterVP(bool diffuseMap, bool bumpMap, bool use2Bump vp += "\nEND"; return new CVertexProgram(vp.c_str()); - // TODO_VP_GLSL } - +*/ //============================================ @@ -384,17 +383,17 @@ void CWaterShape::initVertexProgram() if (!created) { // waves - _VertexProgramBump1 = BuildWaterVP(false, true, false); + /*_VertexProgramBump1 = BuildWaterVP(false, true, false); _VertexProgramBump2 = BuildWaterVP(false, true, true); _VertexProgramBump1Diffuse = BuildWaterVP(true, true, false); _VertexProgramBump2Diffuse = BuildWaterVP(true, true, true); _VertexProgramNoBump = BuildWaterVP(false, false, false); - _VertexProgramNoBumpDiffuse = BuildWaterVP(true, false, false); + _VertexProgramNoBumpDiffuse = BuildWaterVP(true, false, false);*/ // no waves _VertexProgramNoWave = new CVertexProgramWaterVPNoWave(false); - _VertexProgramNoWaveDiffuse = new CVertexProgramWaterVPNoWave(true); // TODO_VP_GLSL + _VertexProgramNoWaveDiffuse = new CVertexProgramWaterVPNoWave(true); created = true; } } From e99bc7ba69cd3cd2a74d24a291aba4ee9cf31afb Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 14 Sep 2013 16:45:00 +0200 Subject: [PATCH 2/5] Remove old interface --- code/nel/include/nel/3d/driver.h | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/code/nel/include/nel/3d/driver.h b/code/nel/include/nel/3d/driver.h index 716c88480..7380d8d67 100644 --- a/code/nel/include/nel/3d/driver.h +++ b/code/nel/include/nel/3d/driver.h @@ -1197,28 +1197,8 @@ public: virtual void setUniform4iv(TProgram program, uint index, size_t num, const sint32 *src) = 0; virtual void setUniform4uiv(TProgram program, uint index, size_t num, const uint32 *src) = 0; // Set builtin parameters - virtual void setUniformMatrix(TProgram program, uint index, TMatrix matrix, TTransform transform) = 0; - virtual void setUniformFog(TProgram program, uint index) = 0; - // Set feature parameters - virtual bool isUniformProgramState() = 0; - // @} - - - - /// \name Legacy vertex program parameter setters - // @{ /** - * Setup constant values. - */ - inline void setConstant(uint index, float f0, float f1, float f2, float f3) { setUniform4f(VertexProgram, index, f0, f1, f2, f3); } - inline void setConstant(uint index, double d0, double d1, double d2, double d3) { setUniform4f(VertexProgram, index, (float)d0, (float)d1, (float)d2, (float)d3); } - inline void setConstant(uint index, const NLMISC::CVector &value) { setUniform4f(VertexProgram, index, value, 0.f); } - inline void setConstant(uint index, const NLMISC::CVectorD &value) { setUniform4f(VertexProgram, index, (float)value.x, (float)value.y, (float)value.z, 0.f); } - /// setup several 4 float csts taken from the given tab - inline void setConstant(uint index, uint num, const float *src) { setUniform4fv(VertexProgram, index, num, src); } - - /** - * Setup constants with a current matrix. + * Setup uniforms with a current matrix. * * This call must be done after setFrustum(), setupViewMatrix() or setupModelMatrix() to get correct * results. @@ -1228,10 +1208,9 @@ public: * \param transform is the transformation to apply to the matrix before store it in the constants. * */ - inline void setConstantMatrix(uint index, TMatrix matrix, TTransform transform) { setUniformMatrix(VertexProgram, index, matrix, transform); }; - + virtual void setUniformMatrix(TProgram program, uint index, TMatrix matrix, TTransform transform) = 0; /** - * Setup the constant with the fog vector. This vector must be used to get the final fog value in a vertex shader. + * Setup the uniform with the fog vector. This vector must be used to get the final fog value in a vertex shader. * You must use it like this: * DP4 o[FOGC].x, c[4], R4; * With c[4] the constant used for the fog vector and R4 the vertex local position. @@ -1242,7 +1221,9 @@ public: * \param index is the index where to store the vector. * */ - inline void setConstantFog(uint index) { setUniformFog(VertexProgram, index); }; + virtual void setUniformFog(TProgram program, uint index) = 0; + // Set feature parameters + virtual bool isUniformProgramState() = 0; // @} From 3c099397d8b006e8827474595a017fc334462447 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 14 Sep 2013 16:43:36 +0200 Subject: [PATCH 3/5] Update supportVertexProgram calls --- code/nel/include/nel/3d/driver.h | 2 +- code/nel/include/nel/3d/meshvp_wind_tree.h | 1 + .../3d/driver/direct3d/driver_direct3d.cpp | 2 +- .../src/3d/driver/direct3d/driver_direct3d.h | 2 +- .../src/3d/driver/opengl/driver_opengl.cpp | 2 +- code/nel/src/3d/driver/opengl/driver_opengl.h | 2 +- code/nel/src/3d/landscape.cpp | 9 +++-- code/nel/src/3d/landscapevb_allocator.cpp | 11 ++++- code/nel/src/3d/meshvp_per_pixel_light.cpp | 24 ++++++----- code/nel/src/3d/meshvp_wind_tree.cpp | 40 +++++++++++++++---- code/nel/src/3d/vegetablevb_allocator.cpp | 4 +- 11 files changed, 72 insertions(+), 27 deletions(-) diff --git a/code/nel/include/nel/3d/driver.h b/code/nel/include/nel/3d/driver.h index 7380d8d67..3eb5823ca 100644 --- a/code/nel/include/nel/3d/driver.h +++ b/code/nel/include/nel/3d/driver.h @@ -1103,7 +1103,7 @@ public: /** Return true if the driver supports the specified vertex program profile. */ - virtual bool supportVertexProgram(CVertexProgram::TProfile profile = CVertexProgram::nelvp) const = 0; + virtual bool supportVertexProgram(CVertexProgram::TProfile profile) const = 0; /** Compile the given vertex program, return if successful. * If a vertex program was set active before compilation, diff --git a/code/nel/include/nel/3d/meshvp_wind_tree.h b/code/nel/include/nel/3d/meshvp_wind_tree.h index 2e353da05..e2c790d6d 100644 --- a/code/nel/include/nel/3d/meshvp_wind_tree.h +++ b/code/nel/include/nel/3d/meshvp_wind_tree.h @@ -106,6 +106,7 @@ public: // @} private: + static void initVertexPrograms(); void setupLighting(CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat); private: diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp index 180f577f3..13306432f 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp @@ -3003,7 +3003,7 @@ bool CDriverD3D::stretchRect(ITexture * srcText, NLMISC::CRect &srcRect, ITextur bool CDriverD3D::supportBloomEffect() const { - return supportVertexProgram(); + return supportVertexProgram(CVertexProgram::nelvp); } // *************************************************************************** diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.h b/code/nel/src/3d/driver/direct3d/driver_direct3d.h index aef51b3b9..1055e105c 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.h +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.h @@ -1112,7 +1112,7 @@ public: /** Return true if the driver supports the specified vertex program profile. */ - virtual bool supportVertexProgram(CVertexProgram::TProfile profile = CVertexProgram::nelvp) const; + virtual bool supportVertexProgram(CVertexProgram::TProfile profile) const; /** Compile the given vertex program, return if successful. * If a vertex program was set active before compilation, diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index 946e69ee0..45bba3bc1 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -689,7 +689,7 @@ bool CDriverGL::stretchRect(ITexture * /* srcText */, NLMISC::CRect &/* srcRect // *************************************************************************** bool CDriverGL::supportBloomEffect() const { - return (supportVertexProgram() && supportFrameBufferObject() && supportPackedDepthStencil() && supportTextureRectangle()); + return (supportVertexProgram(CVertexProgram::nelvp) && supportFrameBufferObject() && supportPackedDepthStencil() && supportTextureRectangle()); } // *************************************************************************** diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.h b/code/nel/src/3d/driver/opengl/driver_opengl.h index 3c75c270c..57f73b0b6 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl.h @@ -1318,7 +1318,7 @@ private: /** Return true if the driver supports the specified vertex program profile. */ - virtual bool supportVertexProgram(CVertexProgram::TProfile profile = CVertexProgram::nelvp) const; + virtual bool supportVertexProgram(CVertexProgram::TProfile profile) const; /** Compile the given vertex program, return if successful. * If a vertex program was set active before compilation, diff --git a/code/nel/src/3d/landscape.cpp b/code/nel/src/3d/landscape.cpp index 0dc3d2a82..154f6f847 100644 --- a/code/nel/src/3d/landscape.cpp +++ b/code/nel/src/3d/landscape.cpp @@ -568,18 +568,21 @@ void CLandscape::clear() void CLandscape::setDriver(IDriver *drv) { nlassert(drv); - if(_Driver != drv) + if (_Driver != drv) { _Driver= drv; // Does the driver support VertexShader??? // only if VP supported by GPU. - _VertexShaderOk= (_Driver->supportVertexProgram() && !_Driver->isVertexProgramEmulated()); + _VertexShaderOk = (!_Driver->isVertexProgramEmulated() && ( + _Driver->supportVertexProgram(CVertexProgram::nelvp) + // || _Driver->supportVertexProgram(CVertexProgram::glsl330v) // TODO_VP_GLSL + )); // Does the driver has sufficient requirements for Vegetable??? // only if VP supported by GPU, and Only if max vertices allowed. - _DriverOkForVegetable= _VertexShaderOk && (_Driver->getMaxVerticesByVertexBufferHard()>=(uint)NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_MAX); + _DriverOkForVegetable = _VertexShaderOk && (_Driver->getMaxVerticesByVertexBufferHard()>=(uint)NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_MAX); } } diff --git a/code/nel/src/3d/landscapevb_allocator.cpp b/code/nel/src/3d/landscapevb_allocator.cpp index 79f56ab42..2c30cc19b 100644 --- a/code/nel/src/3d/landscapevb_allocator.cpp +++ b/code/nel/src/3d/landscapevb_allocator.cpp @@ -82,7 +82,10 @@ void CLandscapeVBAllocator::updateDriver(IDriver *driver) deleteVertexProgram(); // Then rebuild VB format, and VertexProgram, if needed. // Do it only if VP supported by GPU. - setupVBFormatAndVertexProgram(_Driver->supportVertexProgram() && !_Driver->isVertexProgramEmulated()); + setupVBFormatAndVertexProgram(!_Driver->isVertexProgramEmulated() && ( + _Driver->supportVertexProgram(CVertexProgram::nelvp) + // || _Driver->supportVertexProgram(CVertexProgram::glsl330v) // TODO_VP_GLSL + )); // must reallocate the VertexBuffer. if( _NumVerticesAllocated>0 ) @@ -568,7 +571,8 @@ void CLandscapeVBAllocator::setupVBFormatAndVertexProgram(bool withVertexProgr _VB.initEx(); // Init the Vertex Program. - _VertexProgram[0]= new CVertexProgramLandscape(Far0); + _VertexProgram[0] = new CVertexProgramLandscape(Far0); + nlverify(_Driver->compileVertexProgram(_VertexProgram[0])); } else if(_Type==Far1) { @@ -584,6 +588,7 @@ void CLandscapeVBAllocator::setupVBFormatAndVertexProgram(bool withVertexProgr // Init the Vertex Program. _VertexProgram[0] = new CVertexProgramLandscape(Far1); + nlverify(_Driver->compileVertexProgram(_VertexProgram[0])); } else { @@ -599,9 +604,11 @@ void CLandscapeVBAllocator::setupVBFormatAndVertexProgram(bool withVertexProgr // Init the Vertex Program. _VertexProgram[0] = new CVertexProgramLandscape(Tile, false); + nlverify(_Driver->compileVertexProgram(_VertexProgram[0])); // Init the Vertex Program for lightmap pass _VertexProgram[1] = new CVertexProgramLandscape(Tile, true); + nlverify(_Driver->compileVertexProgram(_VertexProgram[1])); } } diff --git a/code/nel/src/3d/meshvp_per_pixel_light.cpp b/code/nel/src/3d/meshvp_per_pixel_light.cpp index 7b189107d..68db4a3e6 100644 --- a/code/nel/src/3d/meshvp_per_pixel_light.cpp +++ b/code/nel/src/3d/meshvp_per_pixel_light.cpp @@ -499,19 +499,19 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, const NLMISC::CVector &viewerPos) { // test if supported by driver - if (! - (drv->supportVertexProgram() - && !drv->isVertexProgramEmulated() - && drv->supportPerPixelLighting(SpecularLighting) - ) - ) + if (drv->isVertexProgramEmulated() + || !drv->supportPerPixelLighting(SpecularLighting)) { return false; } // enable(true, drv); // must enable the vertex program before the vb is activated CVertexProgramPerPixelLight *program = _ActiveVertexProgram; - nlassert(program); + if (!program) + { + // failed to compile vertex program + return false; + } // CRenderTrav *renderTrav= &scene->getRenderTrav(); /// Setup for gouraud lighting @@ -593,8 +593,14 @@ void CMeshVPPerPixelLight::enable(bool enabled, IDriver *drv) | (SpecularLighting ? 2 : 0) | (_IsPointLight ? 1 : 0); // - drv->activeVertexProgram((CVertexProgramPerPixelLight *)_VertexProgram[idVP]); - _ActiveVertexProgram = _VertexProgram[idVP]; + if (drv->activeVertexProgram((CVertexProgramPerPixelLight *)_VertexProgram[idVP])) + { + _ActiveVertexProgram = _VertexProgram[idVP]; + } + else + { + _ActiveVertexProgram = NULL; + } } else { diff --git a/code/nel/src/3d/meshvp_wind_tree.cpp b/code/nel/src/3d/meshvp_wind_tree.cpp index 2ab76dc1f..e991df44b 100644 --- a/code/nel/src/3d/meshvp_wind_tree.cpp +++ b/code/nel/src/3d/meshvp_wind_tree.cpp @@ -207,12 +207,11 @@ void CMeshVPWindTree::serial(NLMISC::IStream &f) throw(NLMISC::EStream) f.serial(SpecularLighting); } - -// *************************************************************************** -void CMeshVPWindTree::initInstance(CMeshBaseInstance *mbi) +void CMeshVPWindTree::initVertexPrograms() { // init the vertexProgram code. static bool vpCreated= false; + if(!vpCreated) { vpCreated= true; @@ -231,6 +230,12 @@ void CMeshVPWindTree::initInstance(CMeshBaseInstance *mbi) _VertexProgram[i] = new CVertexProgramWindTree(numPls, normalize, specular); } } +} + +// *************************************************************************** +void CMeshVPWindTree::initInstance(CMeshBaseInstance *mbi) +{ + initVertexPrograms(); // init a random phase. mbi->_VPWindTreePhase= frand(1); @@ -374,7 +379,7 @@ inline void CMeshVPWindTree::setupPerInstanceConstants(IDriver *driver, CScene // *************************************************************************** bool CMeshVPWindTree::begin(IDriver *driver, CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat, const NLMISC::CVector & /*viewerPos*/) { - if (!(driver->supportVertexProgram() && !driver->isVertexProgramEmulated())) return false; + if (driver->isVertexProgramEmulated()) return false; // Activate the good VertexProgram @@ -393,8 +398,16 @@ bool CMeshVPWindTree::begin(IDriver *driver, CScene *scene, CMeshBaseInstance *m // correct VP id for correct unmber of pls. idVP= numPls*4 + idVP; // activate VP. - driver->activeVertexProgram(_VertexProgram[idVP]); - _ActiveVertexProgram = _VertexProgram[idVP]; + if (driver->activeVertexProgram(_VertexProgram[idVP])) + { + _ActiveVertexProgram = _VertexProgram[idVP]; + } + else + { + // vertex program not supported + _ActiveVertexProgram = NULL; + return false; + } // precompute mesh @@ -461,7 +474,20 @@ bool CMeshVPWindTree::supportMeshBlockRendering() const // *************************************************************************** bool CMeshVPWindTree::isMBRVpOk(IDriver *driver) const { - return driver->supportVertexProgram() && !driver->isVertexProgramEmulated(); + initVertexPrograms(); + + if (driver->isVertexProgramEmulated()) + { + return false; + } + for (uint i = 0; i < NumVp; ++i) + { + if (!driver->compileVertexProgram(_VertexProgram[i])) + { + return false; + } + } + return true; } // *************************************************************************** diff --git a/code/nel/src/3d/vegetablevb_allocator.cpp b/code/nel/src/3d/vegetablevb_allocator.cpp index efbd1f5a3..29a03b51d 100644 --- a/code/nel/src/3d/vegetablevb_allocator.cpp +++ b/code/nel/src/3d/vegetablevb_allocator.cpp @@ -98,7 +98,9 @@ void CVegetableVBAllocator::updateDriver(IDriver *driver) _VBHardOk= false; // Driver must support VP. - nlassert(_Driver->supportVertexProgram()); + nlassert(_Driver->supportVertexProgram(CVertexProgram::nelvp) + // || _Driver->supportVertexProgram(CVertexProgram::glsl330v) // TODO_VP_GLSL + ); // must reallocate the VertexBuffer. if( _NumVerticesAllocated>0 ) From 046e3c92da0d56284b41663d03eb2a527c80392e Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 14 Sep 2013 17:53:47 +0200 Subject: [PATCH 4/5] Fix compile error in vertex program --- code/nel/src/3d/render_trav.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/nel/src/3d/render_trav.cpp b/code/nel/src/3d/render_trav.cpp index 4b43d18e9..a13095db9 100644 --- a/code/nel/src/3d/render_trav.cpp +++ b/code/nel/src/3d/render_trav.cpp @@ -1063,9 +1063,9 @@ static const char* LightingVPFragmentSpecular_Begin= \n\ # Compute vertex-to-eye vector normed. \n\ ADD R4, c[CTS+11], -R5; \n\ - DP3 R4.w, R4, R4; \n\ - RSQ R4.w, R4.w; \n\ - MUL R4, R4, R4.w; \n\ + DP3 R1.w, R4, R4; \n\ + RSQ R1.w, R1.w; \n\ + MUL R4, R4, R1.w; \n\ \n\ # Diffuse-Specular Sun \n\ # Compute R1= halfAngleVector= (lightDir+R4).normed(). \n\ From ce9e0a397bea5d9cf017c38a635a6a74cd3ab71c Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 14 Sep 2013 18:58:23 +0200 Subject: [PATCH 5/5] Fix regression from stereo branch in wind tree --- code/nel/include/nel/3d/render_trav.h | 5 +++-- code/nel/src/3d/meshvp_per_pixel_light.cpp | 1 + code/nel/src/3d/meshvp_wind_tree.cpp | 5 +++++ code/nel/src/3d/render_trav.cpp | 11 +++++++++-- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/code/nel/include/nel/3d/render_trav.h b/code/nel/include/nel/3d/render_trav.h index 61d62e94c..d50d2c242 100644 --- a/code/nel/include/nel/3d/render_trav.h +++ b/code/nel/include/nel/3d/render_trav.h @@ -280,7 +280,8 @@ public: */ void changeLightSetup(CLightContribution *lightContribution, bool useLocalAttenuation); - + /// Must call before beginVPLightSetup + void prepareVPLightSetup(); /** setup the driver VP constants to get info from current LightSetup. * Only 0..3 Light + SunLights are supported. The VP do NOT support distance/Spot attenuation * Also it does not handle World Matrix with non uniform scale correctly since lighting is made in ObjectSpace @@ -425,7 +426,7 @@ private: // Current num of VP lights enabled. uint _VPNumLights; // Current support of specular - //bool _VPSupportSpecular; + // bool _VPSupportSpecular; // Sum of all ambiant of all lights + ambiantGlobal. NLMISC::CRGBAF _VPFinalAmbient; // Diffuse/Spec comp of all light / 255. diff --git a/code/nel/src/3d/meshvp_per_pixel_light.cpp b/code/nel/src/3d/meshvp_per_pixel_light.cpp index 68db4a3e6..816c20f3b 100644 --- a/code/nel/src/3d/meshvp_per_pixel_light.cpp +++ b/code/nel/src/3d/meshvp_per_pixel_light.cpp @@ -515,6 +515,7 @@ bool CMeshVPPerPixelLight::begin(IDriver *drv, // CRenderTrav *renderTrav= &scene->getRenderTrav(); /// Setup for gouraud lighting + renderTrav->prepareVPLightSetup(); renderTrav->beginVPLightSetup(program, invertedModelMat); // sint strongestLightIndex = renderTrav->getStrongestLightIndex(); diff --git a/code/nel/src/3d/meshvp_wind_tree.cpp b/code/nel/src/3d/meshvp_wind_tree.cpp index e991df44b..3ae8c1cd5 100644 --- a/code/nel/src/3d/meshvp_wind_tree.cpp +++ b/code/nel/src/3d/meshvp_wind_tree.cpp @@ -385,6 +385,8 @@ bool CMeshVPWindTree::begin(IDriver *driver, CScene *scene, CMeshBaseInstance *m // Activate the good VertexProgram //=============== + // Update nb vp lights + renderTrav->prepareVPLightSetup(); // Get how many pointLights are setuped now. nlassert(scene != NULL); @@ -510,6 +512,9 @@ void CMeshVPWindTree::beginMBRMesh(IDriver *driver, CScene *scene) // *************************************************************************** void CMeshVPWindTree::beginMBRInstance(IDriver *driver, CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat) { + // Update nb vp lights + renderTrav->prepareVPLightSetup(); + // Get how many pointLights are setuped now. nlassert(scene != NULL); CRenderTrav *renderTrav= &scene->getRenderTrav(); diff --git a/code/nel/src/3d/render_trav.cpp b/code/nel/src/3d/render_trav.cpp index a13095db9..e7dfe89b1 100644 --- a/code/nel/src/3d/render_trav.cpp +++ b/code/nel/src/3d/render_trav.cpp @@ -760,13 +760,20 @@ void CRenderTrav::changeLightSetup(CLightContribution *lightContribution, bool // *************************************************************************** // *************************************************************************** +void CRenderTrav::prepareVPLightSetup() +{ + nlassert(MaxVPLight==4); + _VPNumLights= min(_NumLightEnabled, (uint)MaxVPLight); + // Must force real light setup at least the first time, in changeVPLightSetupMaterial() + _VPMaterialCacheDirty= true; +} // *************************************************************************** void CRenderTrav::beginVPLightSetup(CVertexProgramLighted *program, const CMatrix &invObjectWM) { uint i; - nlassert(MaxVPLight==4); - _VPNumLights= min(_NumLightEnabled, (uint)MaxVPLight); + // nlassert(MaxVPLight==4); + // _VPNumLights= min(_NumLightEnabled, (uint)MaxVPLight); // _VPCurrentCtStart= ctStart; // _VPSupportSpecular= supportSpecular; _VPCurrent = program;