diff options
Diffstat (limited to 'ogre-1.11.patch')
-rw-r--r-- | ogre-1.11.patch | 4725 |
1 files changed, 4725 insertions, 0 deletions
diff --git a/ogre-1.11.patch b/ogre-1.11.patch new file mode 100644 index 000000000000..3224138aabd2 --- /dev/null +++ b/ogre-1.11.patch @@ -0,0 +1,4725 @@ +diff -ruN original/gazebo-9.0.0/gazebo/gui/model/JointMaker.cc patched/gazebo-9.0.0/gazebo/gui/model/JointMaker.cc +--- original/gazebo-9.0.0/gazebo/gui/model/JointMaker.cc 2018-01-25 23:25:47.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/gui/model/JointMaker.cc 2018-06-02 21:55:56.462116279 +0200 +@@ -506,7 +506,7 @@ + jointData->parent = _parent; + jointData->line = jointLine; + jointData->type = this->dataPtr->jointType; +- jointData->line->setMaterial(this->jointMaterials[jointData->type]); ++ jointData->line->setMaterial(Ogre::MaterialManager::getSingleton().getByName(this->jointMaterials[jointData->type])); + + return jointData; + } +@@ -1221,7 +1221,7 @@ + // Line + if (this->line) + { +- this->line->setMaterial(material); ++ this->line->setMaterial(Ogre::MaterialManager::getSingleton().getByName(material)); + + // Parent - child + if (this->child && this->jointVisual) +diff -ruN original/gazebo-9.0.0/gazebo/gui/ModelSnap.cc patched/gazebo-9.0.0/gazebo/gui/ModelSnap.cc +--- original/gazebo-9.0.0/gazebo/gui/ModelSnap.cc 2018-01-25 23:25:47.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/gui/ModelSnap.cc 2018-06-02 21:52:42.833149545 +0200 +@@ -416,7 +416,7 @@ + this->dataPtr->snapHighlight = + this->dataPtr->highlightVisual->CreateDynamicLine( + rendering::RENDERING_TRIANGLE_FAN); +- this->dataPtr->snapHighlight->setMaterial("Gazebo/RedTransparent"); ++ this->dataPtr->snapHighlight->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/RedTransparent")); + this->dataPtr->snapHighlight->AddPoint(hoverTriangle[0]); + this->dataPtr->snapHighlight->AddPoint(hoverTriangle[1]); + this->dataPtr->snapHighlight->AddPoint(hoverTriangle[2]); +@@ -480,7 +480,7 @@ + this->dataPtr->snapLines = + this->dataPtr->snapVisual->CreateDynamicLine( + rendering::RENDERING_LINE_STRIP); +- this->dataPtr->snapLines->setMaterial("Gazebo/RedGlow"); ++ this->dataPtr->snapLines->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/RedGlow")); + this->dataPtr->snapLines->AddPoint(triangle[0]); + this->dataPtr->snapLines->AddPoint(triangle[1]); + this->dataPtr->snapLines->AddPoint(triangle[2]); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/ApplyWrenchVisual.cc patched/gazebo-9.0.0/gazebo/rendering/ApplyWrenchVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/ApplyWrenchVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/ApplyWrenchVisual.cc 2018-05-31 11:01:14.012257184 +0200 +@@ -175,7 +175,7 @@ + // Torque line + dPtr->torqueLine = dPtr->torqueVisual-> + CreateDynamicLine(rendering::RENDERING_LINE_LIST); +- dPtr->torqueLine->setMaterial(dPtr->unselectedMaterial); ++ dPtr->torqueLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName(dPtr->unselectedMaterial)); + dPtr->torqueLine->AddPoint(0, 0, 0); + dPtr->torqueLine->AddPoint(0, 0, 0.1); + +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Camera.cc patched/gazebo-9.0.0/gazebo/rendering/Camera.cc +--- original/gazebo-9.0.0/gazebo/rendering/Camera.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Camera.cc 2018-05-31 11:01:14.035590482 +0200 +@@ -1613,7 +1613,7 @@ + box.setMinimum(bbox.Min().X(), bbox.Min().Y(), bbox.Min().Z()); + box.setMaximum(bbox.Max().X(), bbox.Max().Y(), bbox.Max().Z()); + +- box.transformAffine(_visual->GetSceneNode()->_getFullTransform()); ++ box.transform(_visual->GetSceneNode()->_getFullTransform()); + return this->camera->isVisible(box); + } + +@@ -1829,7 +1829,7 @@ + float Camera::AvgFPS() const + { + if (this->renderTarget) +- return this->renderTarget->getAverageFPS(); ++ return this->renderTarget->getStatistics().avgFPS; + else + return 0.0f; + } +@@ -1837,7 +1837,7 @@ + ////////////////////////////////////////////////// + unsigned int Camera::TriangleCount() const + { +- return this->renderTarget->getTriangleCount(); ++ return this->renderTarget->getStatistics().triangleCount; + } + + ////////////////////////////////////////////////// +diff -ruN original/gazebo-9.0.0/gazebo/rendering/CameraVisual.cc patched/gazebo-9.0.0/gazebo/rendering/CameraVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/CameraVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/CameraVisual.cc 2018-05-31 11:01:14.022257168 +0200 +@@ -114,7 +114,7 @@ + line->AddPoint(ignition::math::Vector3d(0, 0, 0)); + line->AddPoint(ignition::math::Vector3d(dist, width*0.5, -height*0.5)); + +- line->setMaterial("Gazebo/WhiteGlow"); ++ line->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/WhiteGlow")); + line->setVisibilityFlags(GZ_VISIBILITY_GUI); + + this->AttachObject(planeEnt); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/COMVisual.cc patched/gazebo-9.0.0/gazebo/rendering/COMVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/COMVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/COMVisual.cc 2018-05-31 11:01:14.015590512 +0200 +@@ -183,7 +183,7 @@ + p6 += dPtr->inertiaPose.Pos(); + + dPtr->crossLines = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST); +- dPtr->crossLines->setMaterial("Gazebo/Green"); ++ dPtr->crossLines->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/Green")); + dPtr->crossLines->AddPoint(p1); + dPtr->crossLines->AddPoint(p2); + dPtr->crossLines->AddPoint(p3); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/ContactVisual.cc patched/gazebo-9.0.0/gazebo/rendering/ContactVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/ContactVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/ContactVisual.cc 2018-05-31 11:01:14.018923841 +0200 +@@ -120,8 +120,8 @@ + dPtr->points[c]->normal->SetPoint(1, (normal*normalScale)); + dPtr->points[c]->depth->SetPoint(1, (normal*-depth*10)); + +- dPtr->points[c]->normal->setMaterial("Gazebo/LightOn"); +- dPtr->points[c]->depth->setMaterial("Gazebo/LightOff"); ++ dPtr->points[c]->normal->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/LightOn")); ++ dPtr->points[c]->depth->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/LightOff")); + dPtr->points[c]->depth->Update(); + dPtr->points[c]->normal->Update(); + c++; +diff -ruN original/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.cc patched/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.cc +--- original/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.cc 2018-06-03 09:02:54.541619560 +0200 ++++ patched/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.cc 2018-06-02 18:33:14.441141020 +0200 +@@ -276,7 +276,7 @@ + ////////////////////////////////////////////////// + void CustomPSSMShadowCameraSetup::calculateShadowMappingMatrix( + const Ogre::SceneManager &_sm, const Ogre::Camera &_cam, +- const Ogre::Light &_light, Ogre::Matrix4 *_outView, ++ const Ogre::Light &_light, Ogre::Affine3 *_outView, + Ogre::Matrix4 *_outProj, Ogre::Camera *outCam) const + { + // get the shadow frustum's far distance +@@ -312,7 +312,7 @@ + // generate projection matrix if requested + if (_outProj != nullptr) + { +- *_outProj = Ogre::Matrix4::getScale(1, 1, -1); ++ *_outProj = Ogre::Affine3::getScale(1, 1, -1); + } + + // set up camera if requested +@@ -411,7 +411,7 @@ + } + + ////////////////////////////////////////////////// +-Ogre::Matrix4 CustomPSSMShadowCameraSetup::buildViewMatrix( ++Ogre::Affine3 CustomPSSMShadowCameraSetup::buildViewMatrix( + const Ogre::Vector3 &_pos, const Ogre::Vector3 &_dir, + const Ogre::Vector3 &_up) const + { +@@ -421,10 +421,9 @@ + upN.normalise(); + + // Modified for z-up light frusta +- Ogre::Matrix4 m(xN.x, xN.y, xN.z, -xN.dotProduct(_pos), ++ Ogre::Affine3 m(xN.x, xN.y, xN.z, -xN.dotProduct(_pos), + _dir.x, _dir.y, _dir.z, -_dir.dotProduct(_pos), +- upN.x, upN.y, upN.z, -upN.dotProduct(_pos), +- 0.0, 0.0, 0.0, 1.0); ++ upN.x, upN.y, upN.z, -upN.dotProduct(_pos)); + + return m; + } +@@ -446,7 +445,8 @@ + _texCam->setFarClipDistance(_light->_deriveShadowFarClipDistance(_cam)); + + // calculate standard shadow mapping matrix +- Ogre::Matrix4 LView, LProj; ++ Ogre::Affine3 LView; ++ Ogre::Matrix4 LProj; + this->calculateShadowMappingMatrix(*_sm, *_cam, *_light, &LView, &LProj, + nullptr); + +diff -ruN original/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.hh patched/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.hh +--- original/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.hh 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/CustomPSSMShadowCameraSetup.hh 2018-06-02 18:33:34.537793729 +0200 +@@ -99,13 +99,13 @@ + /// FocusedShadowCameraSetup::calculateShadowMappingMatrix(). + void calculateShadowMappingMatrix(const Ogre::SceneManager &_sm, + const Ogre::Camera &_cam, const Ogre::Light &_light, +- Ogre::Matrix4 *_out_view, Ogre::Matrix4 *_outProj, ++ Ogre::Affine3 *_outView, Ogre::Matrix4 *_outProj, + Ogre::Camera *_outCam) const; + + /// \brief The same as FocusedShadowCameraSetup::buildViewMatrix() except + /// resulting matrices are z-up instead of y-up. + /// \sa FocusedShadowCameraSetup::buildViewMatrix() +- public: Ogre::Matrix4 buildViewMatrix(const Ogre::Vector3 &_pos, ++ public: Ogre::Affine3 buildViewMatrix(const Ogre::Vector3 &_pos, + const Ogre::Vector3 &_dir, const Ogre::Vector3 & _up) const; + + /// \brief The same as FocusedShadowCameraSetup::ShadowCameraSetup() +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Distortion.cc patched/gazebo-9.0.0/gazebo/rendering/Distortion.cc +--- original/gazebo-9.0.0/gazebo/rendering/Distortion.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Distortion.cc 2018-06-02 18:57:02.741420137 +0200 +@@ -204,7 +204,11 @@ + // fill the distortion map, while interpolating to fill dead pixels + pixelBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL); + const Ogre::PixelBox &pixelBox = pixelBuffer->getCurrentLock(); +- float *pDest = static_cast<float *>(pixelBox.data); ++ // Ogre 1.11 changed Ogre::PixelBox::data from void* to uchar*, hence ++ // reinterpret_cast is required here. static_cast is not allowed between ++ // pointers of unrelated types (see, for instance, Standard § 3.9.1 ++ // Fundamental types). ++ float *pDest = reinterpret_cast<float *>(pixelBox.data); + for (unsigned int i = 0; i < this->dataPtr->distortionTexHeight; ++i) + { + for (unsigned int j = 0; j < this->dataPtr->distortionTexWidth; ++j) +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Heightmap.cc patched/gazebo-9.0.0/gazebo/rendering/Heightmap.cc +--- original/gazebo-9.0.0/gazebo/rendering/Heightmap.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Heightmap.cc 2018-06-02 22:56:27.057221623 +0200 +@@ -1138,8 +1138,9 @@ + Ogre::TerrainMaterialGeneratorPtr matGen = + this->dataPtr->terrainGlobals->getDefaultMaterialGenerator(); + +- matProfile = static_cast<GzTerrainMatGen::SM2Profile*>( +- matGen->getActiveProfile()); ++ // matProfile = static_cast<GzTerrainMatGen::SM2Profile*>( ++ // matGen->getActiveProfile()); ++ matProfile = static_cast<Ogre::TerrainMaterialGeneratorA::SM2Profile*>(matGen->getActiveProfile()); + if (!matProfile) + { + // using custom material script so ignore setting shadows +@@ -1262,1905 +1263,1906 @@ + { + } + +-///////////////////////////////////////////////// +-GzTerrainMatGen::SM2Profile::SM2Profile( +- Ogre::TerrainMaterialGenerator *_parent, const Ogre::String &_name, +- const Ogre::String &_desc) +-: TerrainMaterialGeneratorA::SM2Profile(_parent, _name, _desc) +-{ +- this->mShaderGen = nullptr; +-} +- +-///////////////////////////////////////////////// +-GzTerrainMatGen::SM2Profile::~SM2Profile() +-{ +- // Because the base SM2Profile has no virtual destructor: +- delete this->mShaderGen; +- this->mShaderGen = nullptr; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::addTechnique( +- const Ogre::MaterialPtr &_mat, const Ogre::Terrain *_terrain, +- TechniqueType _tt) +-{ +- // Initiate specialized mShaderGen +- // Ogre::GpuProgramManager &gmgr = Ogre::GpuProgramManager::getSingleton(); +- +- Ogre::HighLevelGpuProgramManager &hmgr = +- Ogre::HighLevelGpuProgramManager::getSingleton(); +- +- if (!this->mShaderGen) +- { +- // By default we use the GLSL shaders. +- if (hmgr.isLanguageSupported("glsl")) +- { +- this->mShaderGen = OGRE_NEW +- GzTerrainMatGen::SM2Profile::ShaderHelperGLSL(); +- } +- else +- { +- gzthrow("No supported shader languages"); +- } +- +- // Uncomment this to use cg shaders. I'm keeping the CG +- // shader for reference. There is some more code to switch, located +- // below, to enable CG shaders. +- // if (hmgr.isLanguageSupported("cg")) +- // { +- // this->mShaderGen = OGRE_NEW +- // // This will use Ogre's CG shader +- // // Ogre::TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg(); +- // // +- // // This will use our CG shader, which has terrain shadows +- // GzTerrainMatGen::SM2Profile::ShaderHelperCg(); +- // } +- +- // check SM3 features +- this->mSM3Available = +- Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("ps_3_0"); +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- this->mSM4Available = +- Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("ps_4_0"); +-#endif +- } +- +- // Unfortunately this doesn't work +- // Default implementation +- // TerrainMaterialGeneratorA::SM2Profile::addTechnique(mat, terrain, tt); +- +- // So we have to replicate the entire method: +- Ogre::Technique *tech = _mat->createTechnique(); +- +- // Only supporting one pass +- Ogre::Pass *pass = tech->createPass(); +- +- // Doesn't delegate to the proper method otherwise +- Ogre::HighLevelGpuProgramPtr vprog = +- ((GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*)this->mShaderGen) +- // Use this line if running Ogre's CG shaders +- // ((TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg*)this->mShaderGen) +- // Use this line if running our CG shaders +- // ((GzTerrainMatGen::SM2Profile::ShaderHelperCg*)this->mShaderGen) +- ->generateVertexProgram(this, _terrain, _tt); +- +- // DEBUG: std::cout << "VertShader[" << vprog->getName() << "]:\n" +- // << vprog->getSource() << "\n\n"; +- +- Ogre::HighLevelGpuProgramPtr fprog = +- ((GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*)this->mShaderGen) +- // Use this line if running Ogre's CG shaders +- // ((TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg*)this->mShaderGen) +- // Use this line if running our CG shaders +- // ((GzTerrainMatGen::SM2Profile::ShaderHelperCg*)this->mShaderGen) +- ->generateFragmentProgram(this, _terrain, _tt); +- +- // DEBUG: std::cout << "FragShader[" << fprog->getName() << "]:\n" +- // << fprog->getSource() << "\n\n"; +- +- pass->setVertexProgram(vprog->getName()); +- pass->setFragmentProgram(fprog->getName()); +- +- if (_tt == HIGH_LOD || _tt == RENDER_COMPOSITE_MAP) +- { +- // global normal map +- Ogre::TextureUnitState* tu = pass->createTextureUnitState(); +- tu->setTextureName(_terrain->getTerrainNormalMap()->getName()); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); +- +- // global colour map +- if (_terrain->getGlobalColourMapEnabled() && +- this->isGlobalColourMapEnabled()) +- { +- tu = pass->createTextureUnitState( +- _terrain->getGlobalColourMap()->getName()); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); +- } +- +- // light map +- if (this->isLightmapEnabled()) +- { +- tu = pass->createTextureUnitState(_terrain->getLightmap()->getName()); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); +- } +- +- // blend maps +- unsigned int maxLayers = this->getMaxLayers(_terrain); +- +- unsigned int numBlendTextures = std::min( +- _terrain->getBlendTextureCount(maxLayers), +- _terrain->getBlendTextureCount()); +- +- unsigned int numLayers = std::min( +- maxLayers, static_cast<unsigned int>(_terrain->getLayerCount())); +- +- for (unsigned int i = 0; i < numBlendTextures; ++i) +- { +- tu = pass->createTextureUnitState(_terrain->getBlendTextureName(i)); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); +- } +- +- // layer textures +- for (unsigned int i = 0; i < numLayers; ++i) +- { +- // diffuse / specular +- pass->createTextureUnitState(_terrain->getLayerTextureName(i, 0)); +- +- // normal / height +- pass->createTextureUnitState(_terrain->getLayerTextureName(i, 1)); +- } +- } +- else +- { +- // LOW_LOD textures +- // composite map +- Ogre::TextureUnitState *tu = pass->createTextureUnitState(); +- tu->setTextureName(_terrain->getCompositeMap()->getName()); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); +- } +- +- // Add shadow textures (always at the end) +- if (this->isShadowingEnabled(_tt, _terrain)) +- { +- unsigned int numTextures = 1; +- +- if (this->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = this->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- Ogre::TextureUnitState *tu = pass->createTextureUnitState(); +- tu->setContentType(Ogre::TextureUnitState::CONTENT_SHADOW); +- tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_BORDER); +- tu->setTextureBorderColour(Ogre::ColourValue::White); +- } +- } +-} +- +-///////////////////////////////////////////////// +-// generate() and generateForCompositeMap() are identical to +-// TerrainMaterialGeneratorA implementation, the only reason for repeating +-// them is that, unfortunately, addTechnique() is not declared virtual. +-Ogre::MaterialPtr GzTerrainMatGen::SM2Profile::generate( +- const Ogre::Terrain *_terrain) +-{ +- // re-use old material if exists +- Ogre::MaterialPtr mat = _terrain->_getMaterial(); +- +- if (mat.isNull()) +- { +- Ogre::MaterialManager &matMgr = Ogre::MaterialManager::getSingleton(); +- +- // it's important that the names are deterministic for a given terrain, so +- // use the terrain pointer as an ID +- const Ogre::String &matName = _terrain->getMaterialName(); +- mat = matMgr.getByName(matName); +- +- if (mat.isNull()) +- { +- mat = matMgr.create(matName, +- Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); +- } +- } +- +- // clear everything +- mat->removeAllTechniques(); +- +- // Automatically disable normal & parallax mapping if card cannot handle it +- // We do this rather than having a specific technique for it since it's +- // simpler. +- Ogre::GpuProgramManager &gmgr = Ogre::GpuProgramManager::getSingleton(); +- +- if (!gmgr.isSyntaxSupported("ps_4_0") && +- !gmgr.isSyntaxSupported("ps_3_0") && +- !gmgr.isSyntaxSupported("ps_2_x") && +- !gmgr.isSyntaxSupported("fp40") && +- !gmgr.isSyntaxSupported("arbfp1")) +- { +- this->setLayerNormalMappingEnabled(false); +- this->setLayerParallaxMappingEnabled(false); +- } +- +- this->addTechnique(mat, _terrain, HIGH_LOD); +- +- // LOD +- if (this->mCompositeMapEnabled) +- { +- this->addTechnique(mat, _terrain, LOW_LOD); +- Ogre::Material::LodValueList lodValues; +- lodValues.push_back( +- Ogre::TerrainGlobalOptions::getSingleton().getCompositeMapDistance()); +- +- mat->setLodLevels(lodValues); +- Ogre::Technique *lowLodTechnique = mat->getTechnique(1); +- lowLodTechnique->setLodIndex(1); +- } +- +- this->UpdateParams(mat, _terrain); +- +- return mat; +-} +- +-///////////////////////////////////////////////// +-Ogre::MaterialPtr GzTerrainMatGen::SM2Profile::generateForCompositeMap( +- const Ogre::Terrain *_terrain) +-{ +- // re-use old material if exists +- Ogre::MaterialPtr mat = _terrain->_getCompositeMapMaterial(); +- +- if (mat.isNull()) +- { +- Ogre::MaterialManager &matMgr = Ogre::MaterialManager::getSingleton(); +- +- // it's important that the names are deterministic for a given terrain, so +- // use the terrain pointer as an ID +- const Ogre::String &matName = _terrain->getMaterialName() + "/comp"; +- +- mat = matMgr.getByName(matName); +- +- if (mat.isNull()) +- { +- mat = matMgr.create(matName, +- Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); +- } +- } +- +- // clear everything +- mat->removeAllTechniques(); +- +- this->addTechnique(mat, _terrain, RENDER_COMPOSITE_MAP); +- +- this->UpdateParamsForCompositeMap(mat, _terrain); +- +- return mat; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::UpdateParams(const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain) +-{ +- static_cast<GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*>( +- this->mShaderGen)->updateParams(this, _mat, _terrain, false); +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::UpdateParamsForCompositeMap( +- const Ogre::MaterialPtr &_mat, const Ogre::Terrain *_terrain) +-{ +- static_cast<GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*>( +- this->mShaderGen)->updateParams(this, _mat, _terrain, true); +-} +- +-///////////////////////////////////////////////// +-///////////////////////////////////////////////// +-// GLSL Shader helper +-///////////////////////////////////////////////// +-///////////////////////////////////////////////// +- +-///////////////////////////////////////////////// +-Ogre::HighLevelGpuProgramPtr +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVertexProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt) +-{ +- Ogre::HighLevelGpuProgramPtr ret = +- this->createVertexProgram(_prof, _terrain, _tt); +- +- Ogre::StringStream sourceStr; +- this->generateVertexProgramSource(_prof, _terrain, _tt, sourceStr); +- +- ret->setSource(sourceStr.str()); +- ret->load(); +- this->defaultVpParams(_prof, _terrain, _tt, ret); +- +- return ret; +-} +- +-///////////////////////////////////////////////// +-Ogre::HighLevelGpuProgramPtr +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFragmentProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, TechniqueType _tt) +-{ +- Ogre::HighLevelGpuProgramPtr ret = this->createFragmentProgram(_prof, +- _terrain, _tt); +- +- Ogre::StringStream sourceStr; +- +- this->generateFragmentProgramSource(_prof, _terrain, _tt, sourceStr); +- +- ret->setSource(sourceStr.str()); +- +- ret->load(); +- +- this->defaultFpParams(_prof, _terrain, _tt, ret); +- +- Ogre::GpuProgramParametersSharedPtr params = ret->getDefaultParameters(); +- params->setIgnoreMissingParams(false); +- +- Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); +- Ogre::uint numBlendTextures = std::min( +- _terrain->getBlendTextureCount(maxLayers), +- _terrain->getBlendTextureCount()); +- +- Ogre::uint numLayers = std::min(maxLayers, +- static_cast<Ogre::uint>(_terrain->getLayerCount())); +- +- int samplerCounter = 0; +- +- if (_tt == LOW_LOD) +- params->setNamedConstant("compositeMap", samplerCounter++); +- else +- { +- params->setNamedConstant("globalNormal", samplerCounter++); +- +- if (_terrain->getGlobalColourMapEnabled() && +- _prof->isGlobalColourMapEnabled()) +- { +- params->setNamedConstant("globalColourMap", samplerCounter++); +- } +- +- if (_prof->isLightmapEnabled()) +- params->setNamedConstant("lightMap", samplerCounter++); +- +- for (Ogre::uint i = 0; i < numBlendTextures; ++i) +- { +- params->setNamedConstant("blendTex" + +- boost::lexical_cast<std::string>(i), samplerCounter++); +- } +- +- for (Ogre::uint i = 0; i < numLayers; ++i) +- { +- params->setNamedConstant("difftex" + +- boost::lexical_cast<std::string>(i), samplerCounter++); +- params->setNamedConstant("normtex" + +- boost::lexical_cast<std::string>(i), samplerCounter++); +- } +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- Ogre::uint numTextures = 1; +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- { +- params->setNamedConstant("shadowMap" + +- boost::lexical_cast<std::string>(i), samplerCounter++); +- } +- } +- +- return ret; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::updateParams( +- const SM2Profile *_prof, const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain, bool _compositeMap) +-{ +- Ogre::Pass *p = _mat->getTechnique(0)->getPass(0); +- +- if (_compositeMap) +- { +- this->updateVpParams(_prof, _terrain, RENDER_COMPOSITE_MAP, +- p->getVertexProgramParameters()); +- this->updateFpParams(_prof, _terrain, RENDER_COMPOSITE_MAP, +- p->getFragmentProgramParameters()); +- } +- else +- { +- // high lod +- this->updateVpParams(_prof, _terrain, HIGH_LOD, +- p->getVertexProgramParameters()); +- this->updateFpParams(_prof, _terrain, HIGH_LOD, +- p->getFragmentProgramParameters()); +- +- if (_prof->isCompositeMapEnabled()) +- { +- // low lod +- p = _mat->getTechnique(1)->getPass(0); +- this->updateVpParams(_prof, _terrain, LOW_LOD, +- p->getVertexProgramParameters()); +- this->updateFpParams(_prof, _terrain, LOW_LOD, +- p->getFragmentProgramParameters()); +- } +- } +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL:: +-generateVertexProgramSource(const SM2Profile *_prof, +- const Ogre::Terrain* _terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream) +-{ +- this->generateVpHeader(_prof, _terrain, _tt, _outStream); +- +- if (_tt != LOW_LOD) +- { +- unsigned int maxLayers = _prof->getMaxLayers(_terrain); +- unsigned int numLayers = std::min(maxLayers, +- static_cast<unsigned int>(_terrain->getLayerCount())); +- +- for (unsigned int i = 0; i < numLayers; ++i) +- this->generateVpLayer(_prof, _terrain, _tt, i, _outStream); +- } +- +- this->generateVpFooter(_prof, _terrain, _tt, _outStream); +-} +- +-///////////////////////////////////////////////// +-// This method is identical to +-// TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL::generateVpHeader() +-// but is needed because generateVpDynamicShadowsParams() is not declared +-// virtual. +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpHeader( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- bool compression = false; +- +- _outStream << "#version " << glslVersion << "\n\n"; +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- compression = _terrain->_getUseVertexCompression() && +- _tt != RENDER_COMPOSITE_MAP; +- +- if (compression) +- { +- // The parameter "in vec4 vertex;" is automatically bound by OGRE. +- // The parameter "in vec4 uv0'" is automatically bound by OGRE. +- _outStream << vpInStr << " vec4 vertex;\n" +- << vpInStr << " vec4 uv0;\n"; +- } +- else +-#endif +- { +- // The parameter "in vec4 vertex;" is automatically bound by OGRE. +- // The parameter "in vec4 uv0'" is automatically bound by OGRE. +- _outStream << vpInStr << " vec4 vertex;\n" +- << vpInStr << " vec4 uv0;\n"; +- } +- +- if (_tt != RENDER_COMPOSITE_MAP) +- // The parameter "in vec4 uv1'" is automatically bound by OGRE. +- _outStream << vpInStr << " vec4 uv1;\n"; +- +- _outStream << +- "uniform mat4 worldMatrix;\n" +- "uniform mat4 viewProjMatrix;\n" +- "uniform vec2 lodMorph;\n"; +- +- if (compression) +- { +- _outStream << +- "uniform mat4 posIndexToObjectSpace;\n" +- "uniform float baseUVScale;\n"; +- } +- +- +- // uv multipliers +- unsigned int maxLayers = _prof->getMaxLayers(_terrain); +- unsigned int numLayers = std::min(maxLayers, +- static_cast<unsigned int>(_terrain->getLayerCount())); +- +- unsigned int numUVMultipliers = (numLayers / 4); +- +- if (numLayers % 4) +- ++numUVMultipliers; +- +- for (unsigned int i = 0; i < numUVMultipliers; ++i) +- _outStream << "uniform vec4 uvMul" << i << ";\n"; +- +- _outStream << +- vpOutStr << " vec4 position;\n"; +- +- unsigned int texCoordSet = 1; +- _outStream << vpOutStr << " vec4 uvMisc;\n"; +- +- // layer UV's premultiplied, packed as xy/zw +- unsigned int numUVSets = numLayers / 2; +- +- if (numLayers % 2) +- ++numUVSets; +- +- if (_tt != LOW_LOD) +- { +- for (unsigned int i = 0; i < numUVSets; ++i) +- { +- _outStream << vpOutStr << " vec4 layerUV" << i << ";\n"; +- } +- } +- +- if (_prof->getParent()->getDebugLevel() && _tt != RENDER_COMPOSITE_MAP) +- { +- _outStream << vpOutStr << " vec2 lodInfo;\n"; +- } +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- +- if (fog) +- { +- _outStream << +- "uniform vec4 fogParams;\n" +- << vpOutStr << " float fogVal;\n"; +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- texCoordSet = this->generateVpDynamicShadowsParams(texCoordSet, _prof, +- _terrain, _tt, _outStream); +- } +- +- // check we haven't exceeded texture coordinates +- if (texCoordSet > 8) +- { +- OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, +- "Requested options require too many texture coordinate sets! " +- "Try reducing the number of layers.", +- __FUNCTION__); +- } +- +- _outStream << "void main()\n" +- << "{\n"; +- +- if (compression) +- { +- _outStream +- << " vec4 pos = posIndexToObjectSpace * " +- << "vec4(vertex.x, vertex.y, uv0.x, 1.0);\n" +- +- << " vec2 uv = vec2(vertex.x * baseUVScale, 1.0 - " +- << "(vertex.y * baseUVScale));\n"; +- } +- else +- { +- _outStream +- << " vec4 pos = vertex;\n" +- << " vec2 uv = vec2(uv0.x, uv0.y);\n"; +- } +- +- _outStream << " vec4 worldPos = worldMatrix * pos;\n"; +- _outStream << " position = pos;\n"; +- +- if (_tt != RENDER_COMPOSITE_MAP) +- { +- // determine whether to apply the LOD morph to this vertex +- // we store the deltas against all vertices so we only want to apply +- // the morph to the ones which would disappear. The target LOD which is +- // being morphed to is stored in lodMorph.y, and the LOD at which +- // the vertex should be morphed is stored in uv.w. If we subtract +- // the former from the latter, and arrange to only morph if the +- // result is negative (it will only be -1 in fact, since after that +- // the vertex will never be indexed), we will achieve our aim. +- // sign(vertexLOD - targetLOD) == -1 is to morph +- _outStream << +- " float toMorph = -min(0.0, sign(uv1.y - lodMorph.y));\n"; +- +- // this will either be 1 (morph) or 0 (don't morph) +- if (_prof->getParent()->getDebugLevel()) +- { +- // x == LOD level (-1 since value is target level, we want to +- // display actual) +- _outStream << "lodInfo.x = (lodMorph.y - 1.0) / " +- << _terrain->getNumLodLevels() << ";\n"; +- +- // y == LOD morph +- _outStream << "lodInfo.y = toMorph * lodMorph.x;\n"; +- } +- +- // morph +- switch (_terrain->getAlignment()) +- { +- case Ogre::Terrain::ALIGN_X_Y: +- _outStream << " worldPos.z += uv1.x * toMorph * lodMorph.x;\n"; +- break; +- case Ogre::Terrain::ALIGN_X_Z: +- _outStream << " worldPos.y += uv1.x * toMorph * lodMorph.x;\n"; +- break; +- case Ogre::Terrain::ALIGN_Y_Z: +- _outStream << " worldPos.x += uv1.x * toMorph * lodMorph.x;\n"; +- break; +- default: +- gzerr << "Invalid alignment\n"; +- }; +- } +- +- // generate UVs +- if (_tt != LOW_LOD) +- { +- for (unsigned int i = 0; i < numUVSets; ++i) +- { +- unsigned int layer = i * 2; +- unsigned int uvMulIdx = layer / 4; +- +- _outStream << " layerUV" << i << ".xy = " << " uv.xy * uvMul" +- << uvMulIdx << "." << this->GetChannel(layer) << ";\n"; +- _outStream << " layerUV" << i << ".zw = " << " uv.xy * uvMul" +- << uvMulIdx << "." << this->GetChannel(layer+1) << ";\n"; +- } +- } +-} +- +-///////////////////////////////////////////////// +-// This method is identical to +-// TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL::generateVpFooter() +-// but is needed because generateVpDynamicShadows() is not declared virtual. +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpFooter( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- _outStream << " gl_Position = viewProjMatrix * worldPos;\n" +- << " uvMisc.xy = uv.xy;\n"; +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- if (fog) +- { +- if (_terrain->getSceneManager()->getFogMode() == Ogre::FOG_LINEAR) +- { +- _outStream << +- " fogVal = clamp((oPos.z - fogParams.y) * fogParams.w, 0.0, 1.0);\n"; +- } +- else +- { +- _outStream << +- " fogVal = 1 - clamp(1 / (exp(oPos.z * fogParams.x)), 0.0, 1.0);\n"; +- } +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- this->generateVpDynamicShadows(_prof, _terrain, _tt, _outStream); +- +- _outStream << "}\n"; +-} +- +-///////////////////////////////////////////////// +-void +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpDynamicShadows( +- const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, +- TechniqueType /*_tt*/, Ogre::StringStream &_outStream) +-{ +- unsigned int numTextures = 1; +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- +- // Calculate the position of vertex in light space +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- _outStream << " lightSpacePos" << i << " = texViewProjMatrix" +- << i << " * worldPos;\n"; +- +- // Don't linearize depth range: RTSS PSSM implementation uses +- // view-space depth +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // // make linear +- // outStream << "lightSpacePos" << i << ".z = (lightSpacePos" << i +- // << ".z - depthRange" << i << ".x) * depthRange" << i +- // << ".w;\n"; +- // } +- } +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- _outStream << " // pass cam depth\n uvMisc.z = gl_Position.z;\n"; +- } +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::defaultVpParams( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, const Ogre::HighLevelGpuProgramPtr &_prog) +-{ +- Ogre::GpuProgramParametersSharedPtr params = _prog->getDefaultParameters(); +- params->setIgnoreMissingParams(true); +- +- params->setNamedAutoConstant("worldMatrix", +- Ogre::GpuProgramParameters::ACT_WORLD_MATRIX); +- +- params->setNamedAutoConstant("viewProjMatrix", +- Ogre::GpuProgramParameters::ACT_VIEWPROJ_MATRIX); +- +- params->setNamedAutoConstant("lodMorph", +- Ogre::GpuProgramParameters::ACT_CUSTOM, +- Ogre::Terrain::LOD_MORPH_CUSTOM_PARAM); +- +- params->setNamedAutoConstant("fogParams", +- Ogre::GpuProgramParameters::ACT_FOG_PARAMS); +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- unsigned int numTextures = 1; +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- params->setNamedAutoConstant("texViewProjMatrix" + +- Ogre::StringConverter::toString(i), +- Ogre::GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX, i); +- +- // Don't add depth range params +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // params->setNamedAutoConstant("depthRange" + +- // Ogre::StringConverter::toString(i), +- // Ogre::GpuProgramParameters::ACT_SHADOW_SCENE_DEPTH_RANGE, i); +- // } +- } +- } +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- if (_terrain->_getUseVertexCompression() && _tt != RENDER_COMPOSITE_MAP) +- { +- Ogre::Matrix4 posIndexToObjectSpace; +- _terrain->getPointTransform(&posIndexToObjectSpace); +- params->setNamedConstant("posIndexToObjectSpace", posIndexToObjectSpace); +- } +-#endif +-} +- +-///////////////////////////////////////////////// +-unsigned int GzTerrainMatGen::SM2Profile::ShaderHelperGLSL:: +-generateVpDynamicShadowsParams(unsigned int _texCoord, const SM2Profile *_prof, +- const Ogre::Terrain * /*_terrain*/, TechniqueType /*_tt*/, +- Ogre::StringStream &_outStream) +-{ +- // out semantics & params +- unsigned int numTextures = 1; +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- _outStream << vpOutStr << " vec4 lightSpacePos" << i << ";\n" +- << "uniform mat4 texViewProjMatrix" << i << ";\n"; +- +- // Don't add depth range params +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // _outStream << ", uniform float4 depthRange" << i +- // << " // x = min, y = max, z = range, w = 1/range\n"; +- // } +- } +- +- return _texCoord; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpHeader( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- _outStream << "#version " << glslVersion << "\n\n"; +- +- _outStream << +- "vec4 expand(vec4 v)\n" +- "{\n" +- " return v * 2 - 1;\n" +- "}\n\n"; +- +- _outStream << +- "vec4 lit(float NdotL, float NdotH, float m)\n" +- "{\n" +- " float specular = (NdotL > 0) ? pow(max(0.0, NdotH), m) : 0.0;\n" +- " return vec4(1.0, max(0.0, NdotL), specular, 1.0);\n" +- "}\n"; +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- this->generateFpDynamicShadowsHelpers(_prof, _terrain, _tt, _outStream); +- +- _outStream << +- fpInStr << " vec4 position;\n"; +- +- Ogre::uint texCoordSet = 1; +- _outStream << fpInStr << " vec4 uvMisc;\n"; +- +- // UV's premultiplied, packed as xy/zw +- Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); +- Ogre::uint numBlendTextures = std::min( +- _terrain->getBlendTextureCount(maxLayers), +- _terrain->getBlendTextureCount()); +- Ogre::uint numLayers = std::min(maxLayers, +- static_cast<Ogre::uint>(_terrain->getLayerCount())); +- +- Ogre::uint numUVSets = numLayers / 2; +- +- if (numLayers % 2) +- ++numUVSets; +- +- if (_tt != LOW_LOD) +- { +- for (Ogre::uint i = 0; i < numUVSets; ++i) +- { +- _outStream << +- fpInStr << " vec4 layerUV" << i << ";\n"; +- } +- } +- +- if (_prof->getParent()->getDebugLevel() && _tt != RENDER_COMPOSITE_MAP) +- { +- _outStream << fpInStr << " vec2 lodInfo;\n"; +- } +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- +- if (fog) +- { +- _outStream << +- "uniform vec3 fogColour;\n" +- << fpInStr << " float fogVal;\n"; +- } +- +- Ogre::uint currentSamplerIdx = 0; +- +- _outStream << +- // Only 1 light supported in this version +- // deferred shading profile / generator later, ok? :) +- "uniform vec3 ambient;\n" +- "uniform vec4 lightPosObjSpace;\n" +- "uniform vec3 lightDiffuseColour;\n" +- "uniform vec3 lightSpecularColour;\n" +- "uniform vec3 eyePosObjSpace;\n" +- // pack scale, bias and specular +- "uniform vec4 scaleBiasSpecular;\n"; +- +- if (_tt == LOW_LOD) +- { +- // single composite map covers all the others below +- _outStream << "uniform sampler2D compositeMap;\n"; +- } +- else +- { +- _outStream << "uniform sampler2D globalNormal;\n"; +- +- if (_terrain->getGlobalColourMapEnabled() && +- _prof->isGlobalColourMapEnabled()) +- { +- _outStream << "uniform sampler2D globalColourMap;\n"; +- } +- +- if (_prof->isLightmapEnabled()) +- { +- _outStream << "uniform sampler2D lightMap;\n"; +- } +- +- // Blend textures - sampler definitions +- for (Ogre::uint i = 0; i < numBlendTextures; ++i) +- { +- _outStream << "uniform sampler2D blendTex" << i << ";\n"; +- } +- +- // Layer textures - sampler definitions & UV multipliers +- for (Ogre::uint i = 0; i < numLayers; ++i) +- { +- _outStream << "uniform sampler2D difftex" << i << ";\n"; +- _outStream << "uniform sampler2D normtex" << i << ";\n"; +- } +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- this->generateFpDynamicShadowsParams(&texCoordSet, ¤tSamplerIdx, +- _prof, _terrain, _tt, _outStream); +- } +- +- // check we haven't exceeded samplers +- if (currentSamplerIdx > 16) +- { +- OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, +- "Requested options require too many texture samplers! " +- "Try reducing the number of layers.", __FUNCTION__); +- } +- +- std::string outputColTypeStr = "vec4"; +- if (glslVersion != "120") +- { +- _outStream << "out vec4 outputCol;\n"; +- outputColTypeStr = ""; +- } +- +- _outStream << +- "void main()\n" +- "{\n" +- " float shadow = 1.0;\n" +- " vec2 uv = uvMisc.xy;\n" +- " " << outputColTypeStr << " outputCol = vec4(0.0, 0.0, 0.0, 1.0);\n"; +- +- if (_tt != LOW_LOD) +- { +- // global normal +- _outStream << " vec3 normal = expand(" +- << textureStr << "(globalNormal, uv)).xyz;\n"; +- } +- +- _outStream << +- " vec3 lightDir =\n" +- " lightPosObjSpace.xyz - (position.xyz * lightPosObjSpace.w);\n" +- " vec3 eyeDir = eyePosObjSpace - position.xyz;\n" +- +- // set up accumulation areas +- " vec3 diffuse = vec3(0.0, 0.0, 0.0);\n" +- " float specular = 0.0;\n"; +- +- if (_tt == LOW_LOD) +- { +- // we just do a single calculation from composite map +- _outStream << +- " vec4 composite = " << textureStr << "(compositeMap, uv);\n" +- " diffuse = composite.xyz;\n"; +- // TODO - specular; we'll need normals for this! +- } +- else +- { +- // set up the blend values +- for (Ogre::uint i = 0; i < numBlendTextures; ++i) +- { +- _outStream << " vec4 blendTexVal" << i +- << " = " << textureStr << "(blendTex" << i << ", uv);\n"; +- } +- +- if (_prof->isLayerNormalMappingEnabled()) +- { +- // derive the tangent space basis +- // we do this in the pixel shader because we don't have per-vertex normals +- // because of the LOD, we use a normal map +- // tangent is always +x or -z in object space depending on alignment +- switch (_terrain->getAlignment()) +- { +- case Ogre::Terrain::ALIGN_X_Y: +- case Ogre::Terrain::ALIGN_X_Z: +- _outStream << " vec3 tangent = vec3(1.0, 0.0, 0.0);\n"; +- break; +- case Ogre::Terrain::ALIGN_Y_Z: +- _outStream << " vec3 tangent = vec3(0.0, 0.0, -1.0);\n"; +- break; +- default: +- gzerr << "Invalid terrain alignment\n"; +- break; +- }; +- +- _outStream << " vec3 binormal = normalize(cross(tangent, normal));\n"; +- // note, now we need to re-cross to derive tangent again because it +- // wasn't orthonormal +- _outStream << " tangent = normalize(cross(normal, binormal));\n"; +- // derive final matrix +- /*_outStream << " mat3 TBN = mat3(tangent.x, tangent.y, tangent.z," +- "binormal.x, binormal.y, binormal.z," +- "normal.x, normal.y, normal.z);\n"; +- */ +- +- // set up lighting result placeholders for interpolation +- _outStream << " vec4 litRes, litResLayer;\n"; +- _outStream << " vec3 TSlightDir, TSeyeDir, TShalfAngle, TSnormal;\n"; +- if (_prof->isLayerParallaxMappingEnabled()) +- _outStream << " float displacement;\n"; +- // move +- _outStream << " TSlightDir = normalize(vec3(dot(tangent, lightDir)," +- "dot(binormal, lightDir)," +- "dot(normal, lightDir)));\n"; +- _outStream << " TSeyeDir = normalize(vec3(dot(tangent, eyeDir)," +- "dot(binormal, eyeDir)," +- "dot(normal, eyeDir)));\n"; +- } +- else +- { +- // simple per-pixel lighting with no normal mapping +- _outStream << " lightDir = normalize(lightDir);\n"; +- _outStream << " eyeDir = normalize(eyeDir);\n"; +- _outStream << " vec3 halfAngle = normalize(lightDir + eyeDir);\n"; +- +- _outStream << " vec4 litRes = lit(dot(lightDir, normal), " +- "dot(halfAngle, normal), scaleBiasSpecular.z);\n"; +- } +- } +-} +- +-///////////////////////////////////////////////// +-void +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsParams( +- Ogre::uint *_texCoord, Ogre::uint *_sampler, const SM2Profile *_prof, +- const Ogre::Terrain * /*_terrain*/, TechniqueType _tt, +- Ogre::StringStream &_outStream) +-{ +- if (_tt == HIGH_LOD) +- this->mShadowSamplerStartHi = *_sampler; +- else if (_tt == LOW_LOD) +- this->mShadowSamplerStartLo = *_sampler; +- +- // in semantics & params +- Ogre::uint numTextures = 1; +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- _outStream << "uniform vec4 pssmSplitPoints;\n"; +- } +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- { +- _outStream << fpInStr << +- " vec4 lightSpacePos" << i << ";\n" << +- "uniform sampler2D shadowMap" << i << ";\n"; +- +- *_sampler = *_sampler + 1; +- *_texCoord = *_texCoord + 1; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << +- "uniform float inverseShadowmapSize" << i << ";\n"; +- } +- } +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpLayer( +- const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, +- TechniqueType _tt, Ogre::uint _layer, +- Ogre::StringStream &_outStream) +-{ +- Ogre::uint uvIdx = _layer / 2; +- Ogre::String uvChannels = (_layer % 2) ? ".zw" : ".xy"; +- Ogre::uint blendIdx = (_layer-1) / 4; +- Ogre::String blendChannel = this->GetChannel(_layer-1); +- Ogre::String blendWeightStr = Ogre::String("blendTexVal") + +- Ogre::StringConverter::toString(blendIdx) + "." + blendChannel; +- +- // generate early-out conditional +- // Disable - causing some issues even when trying to force the use of texldd +- // if (layer && prof->_isSM3Available()) +- // _outStream << " if (" << blendWeightStr << " > 0.0003)\n {\n"; +- +- // generate UV +- _outStream << " vec2 uv" << _layer << " = layerUV" << uvIdx +- << uvChannels << ";\n"; +- +- // calculate lighting here if normal mapping +- if (_prof->isLayerNormalMappingEnabled()) +- { +- if (_prof->isLayerParallaxMappingEnabled() && _tt != RENDER_COMPOSITE_MAP) +- { +- // modify UV - note we have to sample an extra time +- _outStream << " displacement = " << textureStr << "(normtex" << _layer +- << ", uv" << _layer << ").w\n" +- " * scaleBiasSpecular.x + scaleBiasSpecular.y;\n"; +- _outStream << " uv" << _layer << " += TSeyeDir.xy * displacement;\n"; +- } +- +- // access TS normal map +- _outStream << " TSnormal = expand(" << textureStr << "(normtex" +- << _layer << ", uv" << _layer << ")).xyz;\n"; +- _outStream << " TShalfAngle = normalize(TSlightDir + TSeyeDir);\n"; +- +- _outStream << " litResLayer = lit(dot(TSlightDir, TSnormal), " +- "dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);\n"; +- +- if (!_layer) +- _outStream << " litRes = litResLayer;\n"; +- else +- _outStream << " litRes = mix(litRes, litResLayer, " +- << blendWeightStr << ");\n"; +- } +- +- // sample diffuse texture +- _outStream << " vec4 diffuseSpecTex" << _layer +- << " = " << textureStr << "(difftex" << _layer << ", uv" << _layer +- << ");\n"; +- +- // apply to common +- if (!_layer) +- { +- _outStream << " diffuse = diffuseSpecTex0.xyz;\n"; +- if (_prof->isLayerSpecularMappingEnabled()) +- _outStream << " specular = diffuseSpecTex0.w;\n"; +- } +- else +- { +- _outStream << " diffuse = mix(diffuse, diffuseSpecTex" << _layer +- << ".xyz, " << blendWeightStr << ");\n"; +- +- if (_prof->isLayerSpecularMappingEnabled()) +- { +- _outStream << " specular = mix(specular, diffuseSpecTex" << _layer +- << ".w, " << blendWeightStr << ");\n"; +- } +- } +- +- // End early-out +- // Disable - causing some issues even when trying to force the use of texldd +- // if (layer && prof->_isSM3Available()) +- // _outStream << " } // early-out blend value\n"; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpFooter( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- if (_tt == LOW_LOD) +- { +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- this->generateFpDynamicShadows(_prof, _terrain, _tt, _outStream); +- _outStream << " outputCol.xyz = diffuse * rtshadow;\n"; +- } +- else +- { +- _outStream << " outputCol.xyz = diffuse;\n"; +- } +- } +- else +- { +- if (_terrain->getGlobalColourMapEnabled() && +- _prof->isGlobalColourMapEnabled()) +- { +- // sample colour map and apply to diffuse +- _outStream << " diffuse *= " << textureStr +- << "(globalColourMap, uv).xyz;\n"; +- } +- +- if (_prof->isLightmapEnabled()) +- { +- // sample lightmap +- _outStream << " shadow = " << textureStr << "(lightMap, uv).x;\n"; +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- this->generateFpDynamicShadows(_prof, _terrain, _tt, _outStream); +- } +- +- // diffuse lighting +- _outStream << " outputCol.xyz += ambient * diffuse + litRes.y * " +- "lightDiffuseColour * diffuse * shadow;\n"; +- +- // specular default +- if (!_prof->isLayerSpecularMappingEnabled()) +- _outStream << " specular = 1.0;\n"; +- +- if (_tt == RENDER_COMPOSITE_MAP) +- { +- // Lighting embedded in alpha +- _outStream << " outputCol.w = shadow;\n"; +- } +- else +- { +- // Apply specular +- _outStream << " outputCol.xyz += litRes.z * lightSpecularColour * " +- "specular * shadow;\n"; +- +- if (_prof->getParent()->getDebugLevel()) +- { +- _outStream << " outputCol.xy += lodInfo.xy;\n"; +- } +- } +- } +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- if (fog) +- { +- _outStream << " outputCol.xyz = mix(outputCol.xyz, fogColour, fogVal);\n"; +- } +- +- if (glslVersion == "120") +- _outStream << " gl_FragColor = outputCol;\n"; +- +- // Final return +- _outStream << "\n}\n"; +-} +- +-///////////////////////////////////////////////// +-void +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers( +- const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, +- TechniqueType /*_tt*/, Ogre::StringStream &_outStream) +-{ +- // TODO make filtering configurable +- _outStream << +- "// Simple PCF\n" +- "// Number of samples in one dimension (square for total samples)\n" +- "#define NUM_SHADOW_SAMPLES_1D 2.0\n" +- "#define SHADOW_FILTER_SCALE 1.0\n" +- +- "#define SHADOW_SAMPLES NUM_SHADOW_SAMPLES_1D*NUM_SHADOW_SAMPLES_1D\n" +- +- "vec4 offsetSample(vec4 uv, vec2 offset, float invMapSize)\n" +- "{\n" +- " return vec4(uv.xy + offset * invMapSize * uv.w, uv.z, uv.w);\n" +- "}\n"; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << +- "float calcDepthShadow(sampler2D shadowMap, vec4 uv, " +- "float invShadowMapSize)\n" +- "{\n" +- " // 4-sample PCF\n" +- " float shadow = 0.0;\n" +- " float offset = (NUM_SHADOW_SAMPLES_1D/2.0 - 0.5) *SHADOW_FILTER_SCALE;" +- "\n" +- " for (float y = -offset; y <= offset; y += SHADOW_FILTER_SCALE)\n" +- " for (float x = -offset; x <= offset; x += SHADOW_FILTER_SCALE)\n" +- " {\n" +- " vec4 newUV = offsetSample(uv, vec2(x, y), invShadowMapSize);\n" +- " // manually project and assign derivatives\n" +- " // to avoid gradient issues inside loops\n" +- " newUV = newUV / newUV.w;\n"; +- // The following line used to be: +- // " float depth = tex2d(shadowMap, newUV.xy).x;\n" +- if (glslVersion == "120") +- _outStream << +- " float depth = texture2D(shadowMap, newUV.xy).x;\n"; +- else +- { +- _outStream << +- " float depth = textureGrad(shadowMap, newUV.xy, " +- " vec2(1.0, 1.0), vec2(1.0, 1.0)).x;\n"; +- } +- _outStream << +- // " if (depth >= 1.0 || depth >= uv.z)\n" +- " if (depth >= 1.0 || depth >= newUV.z)\n" +- " shadow += 1.0;\n" +- " }\n" +- " shadow /= (SHADOW_SAMPLES); \n" +- " return shadow;\n" +- "}\n"; +- } +- else +- { +- _outStream << +- "float calcSimpleShadow(sampler2D shadowMap, vec4 shadowMapPos)\n" +- "{\n" +- " return " << textureStr << "Proj(shadowMap, shadowMapPos).x;\n" +- "}\n"; +- } +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- Ogre::uint numTextures = +- _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << "float calcPSSMDepthShadow("; +- } +- else +- { +- _outStream << "float calcPSSMSimpleShadow("; +- } +- +- _outStream << "\n "; +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "sampler2D shadowMap" << i << ", "; +- +- _outStream << "\n "; +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "vec4 lsPos" << i << ", "; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << "\n "; +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "float invShadowmapSize" << i << ", "; +- } +- +- _outStream << "\n" +- " vec4 pssmSplitPoints, float camDepth)\n" +- "{\n" +- " float shadow = 1.0;\n" +- " // calculate shadow\n"; +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- { +- if (!i) +- { +- _outStream << " if (camDepth <= pssmSplitPoints." +- << this->GetChannel(i) << ")\n"; +- } +- else if (i < numTextures-1) +- { +- _outStream << " else if (camDepth <= pssmSplitPoints." +- << this->GetChannel(i) << ")\n"; +- } +- else +- _outStream << " else\n"; +- +- _outStream << " {\n"; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << " shadow = calcDepthShadow(shadowMap" << i +- << ", lsPos" << i << ", invShadowmapSize" << i << ");\n"; +- } +- else +- { +- _outStream << " shadow = calcSimpleShadow(shadowMap" << i +- << ", lsPos" << i << ");\n"; +- } +- _outStream << " }\n"; +- } +- +- _outStream << " return shadow;\n" +- "}\n\n\n"; +- } +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadows( +- const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, +- TechniqueType /*_tt*/, Ogre::StringStream &_outStream) +-{ +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- Ogre::uint numTextures = +- _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- +- _outStream << " float camDepth = uvMisc.z;\n"; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << " float rtshadow = calcPSSMDepthShadow("; +- } +- else +- { +- _outStream << " float rtshadow = calcPSSMSimpleShadow("; +- } +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "shadowMap" << i << ", "; +- +- _outStream << "\n "; +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "lightSpacePos" << i << ", "; +- +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << "\n "; +- +- for (Ogre::uint i = 0; i < numTextures; ++i) +- _outStream << "inverseShadowmapSize" << i << ", "; +- } +- _outStream << "\n" << +- " pssmSplitPoints, camDepth);\n"; +- } +- else +- { +- if (_prof->getReceiveDynamicShadowsDepth()) +- { +- _outStream << +- " float rtshadow = calcDepthShadow(shadowMap0, lightSpacePos0, " +- "inverseShadowmapSize0);"; +- } +- else +- { +- _outStream << +- " float rtshadow = calcSimpleShadow(shadowMap0, lightSpacePos0);"; +- } +- } +- +- _outStream << " shadow = rtshadow;//min(shadow, rtshadow);\n"; +-} +- +-///////////////////////////////////////////////// +-void +-GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFragmentProgramSource( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- this->generateFpHeader(_prof, _terrain, _tt, _outStream); +- +- if (_tt != LOW_LOD) +- { +- Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); +- Ogre::uint numLayers = std::min(maxLayers, +- static_cast<Ogre::uint>(_terrain->getLayerCount())); +- +- for (Ogre::uint i = 0; i < numLayers; ++i) +- this->generateFpLayer(_prof, _terrain, _tt, i, _outStream); +- } +- +- this->generateFpFooter(_prof, _terrain, _tt, _outStream); +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::updateVpParams( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- TechniqueType _tt, +-#else +- TechniqueType /*_tt*/, +-#endif +- const Ogre::GpuProgramParametersSharedPtr &_params) +-{ +- _params->setIgnoreMissingParams(true); +- Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); +- Ogre::uint numLayers = std::min(maxLayers, +- static_cast<Ogre::uint>(_terrain->getLayerCount())); +- +- Ogre::uint numUVMul = numLayers / 4; +- +- if (numLayers % 4) +- ++numUVMul; +- +- for (Ogre::uint i = 0; i < numUVMul; ++i) +- { +- Ogre::Vector4 uvMul( +- _terrain->getLayerUVMultiplier(i * 4), +- _terrain->getLayerUVMultiplier(i * 4 + 1), +- _terrain->getLayerUVMultiplier(i * 4 + 2), +- _terrain->getLayerUVMultiplier(i * 4 + 3)); +- _params->setNamedConstant("uvMul" + +- Ogre::StringConverter::toString(i), uvMul); +- } +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- if (_terrain->_getUseVertexCompression() && _tt != RENDER_COMPOSITE_MAP) +- { +- Ogre::Real baseUVScale = 1.0f / (_terrain->getSize() - 1); +- _params->setNamedConstant("baseUVScale", baseUVScale); +- } +-#endif +-} +- +-///////////////////////////////////////////////// +-Ogre::String GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::GetChannel( +-Ogre::uint _idx) +-{ +- Ogre::uint rem = _idx % 4; +- switch (rem) +- { +- case 0: +- default: +- return "x"; +- case 1: +- return "y"; +- case 2: +- return "z"; +- case 3: +- return "w"; +- }; +-} +- +-///////////////////////////////////////////////// +-///////////////////////////////////////////////// +-// CG Shader helper +-///////////////////////////////////////////////// +-///////////////////////////////////////////////// +- +-///////////////////////////////////////////////// +-Ogre::HighLevelGpuProgramPtr +-GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVertexProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt) +-{ +- Ogre::HighLevelGpuProgramPtr ret = +- this->createVertexProgram(_prof, _terrain, _tt); +- +- Ogre::StringStream sourceStr; +- this->generateVertexProgramSource(_prof, _terrain, _tt, sourceStr); +- +- ret->setSource(sourceStr.str()); +- ret->load(); +- this->defaultVpParams(_prof, _terrain, _tt, ret); +- +- return ret; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperCg::defaultVpParams( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, const Ogre::HighLevelGpuProgramPtr &_prog) +-{ +- Ogre::GpuProgramParametersSharedPtr params = _prog->getDefaultParameters(); +- params->setIgnoreMissingParams(true); +- +- params->setNamedAutoConstant("worldMatrix", +- Ogre::GpuProgramParameters::ACT_WORLD_MATRIX); +- +- params->setNamedAutoConstant("viewProjMatrix", +- Ogre::GpuProgramParameters::ACT_VIEWPROJ_MATRIX); +- +- params->setNamedAutoConstant("lodMorph", +- Ogre::GpuProgramParameters::ACT_CUSTOM, +- Ogre::Terrain::LOD_MORPH_CUSTOM_PARAM); +- +- params->setNamedAutoConstant("fogParams", +- Ogre::GpuProgramParameters::ACT_FOG_PARAMS); +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- unsigned int numTextures = 1; +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- params->setNamedAutoConstant("texViewProjMatrix" + +- Ogre::StringConverter::toString(i), +- Ogre::GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX, i); +- +- // Don't add depth range params +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // params->setNamedAutoConstant("depthRange" + +- // Ogre::StringConverter::toString(i), +- // Ogre::GpuProgramParameters::ACT_SHADOW_SCENE_DEPTH_RANGE, i); +- // } +- } +- } +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- if (_terrain->_getUseVertexCompression() && _tt != RENDER_COMPOSITE_MAP) +- { +- Ogre::Matrix4 posIndexToObjectSpace; +- _terrain->getPointTransform(&posIndexToObjectSpace); +- params->setNamedConstant("posIndexToObjectSpace", posIndexToObjectSpace); +- } +-#endif +-} +- +-///////////////////////////////////////////////// +-void +-GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpDynamicShadows( +- const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, +- TechniqueType /*_tt*/, Ogre::StringStream &_outStream) +-{ +- unsigned int numTextures = 1; +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- +- // Calculate the position of vertex in light space +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- _outStream << " oLightSpacePos" << i << " = mul(texViewProjMatrix" +- << i << ", worldPos);\n"; +- +- // Don't linearize depth range: RTSS PSSM implementation uses +- // view-space depth +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // // make linear +- // outStream << "oLightSpacePos" << i << ".z = (oLightSpacePos" << i +- // << ".z - depthRange" << i << ".x) * depthRange" << i +- // << ".w;\n"; +- // } +- } +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- _outStream << " // pass cam depth\n oUVMisc.z = oPos.z;\n"; +- } +-} +- +-///////////////////////////////////////////////// +-unsigned int GzTerrainMatGen::SM2Profile::ShaderHelperCg:: +-generateVpDynamicShadowsParams(unsigned int _texCoord, const SM2Profile *_prof, +- const Ogre::Terrain * /*_terrain*/, TechniqueType /*_tt*/, +- Ogre::StringStream &_outStream) +-{ +- // out semantics & params +- unsigned int numTextures = 1; +- +- if (_prof->getReceiveDynamicShadowsPSSM()) +- { +- numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); +- } +- +- for (unsigned int i = 0; i < numTextures; ++i) +- { +- _outStream << ", out float4 oLightSpacePos" << i +- << " : TEXCOORD" << _texCoord++ << "\n" +- << ", uniform float4x4 texViewProjMatrix" << i << "\n"; +- +- // Don't add depth range params +- // if (prof->getReceiveDynamicShadowsDepth()) +- // { +- // _outStream << ", uniform float4 depthRange" << i +- // << " // x = min, y = max, z = range, w = 1/range\n"; +- // } +- } +- +- return _texCoord; +-} +- +-///////////////////////////////////////////////// +-// This method is identical to +-// TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg::generateVpHeader() +-// but is needed because generateVpDynamicShadowsParams() is not declared +-// virtual. +-void GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpHeader( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- _outStream << "void main_vp(\n"; +- +- bool compression = false; +- +-#if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 +- compression = _terrain->_getUseVertexCompression() && +- _tt != RENDER_COMPOSITE_MAP; +-#endif +- +- if (compression) +- { +- _outStream << "float2 posIndex : POSITION,\nfloat height : TEXCOORD0,\n"; +- } +- else +- { +- _outStream << "float4 pos : POSITION,\nfloat2 uv : TEXCOORD0,\n"; +- } +- +- if (_tt != RENDER_COMPOSITE_MAP) +- _outStream << "float2 delta : TEXCOORD1,\n"; +- +- _outStream << +- "uniform float4x4 worldMatrix,\n" +- "uniform float4x4 viewProjMatrix,\n" +- "uniform float2 lodMorph,\n"; +- +- if (compression) +- { +- _outStream << +- "uniform float4x4 posIndexToObjectSpace,\n" +- "uniform float baseUVScale,\n"; +- } +- +- // uv multipliers +- Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); +- Ogre::uint numLayers = std::min(maxLayers, +- static_cast<unsigned int>(_terrain->getLayerCount())); +- +- unsigned int numUVMultipliers = (numLayers / 4); + +- if (numLayers % 4) +- ++numUVMultipliers; +- +- for (unsigned int i = 0; i < numUVMultipliers; ++i) +- _outStream << "uniform float4 uvMul" << i << ",\n"; +- +- _outStream << +- "out float4 oPos : POSITION,\n" +- "out float4 oPosObj : TEXCOORD0\n"; +- +- unsigned int texCoordSet = 1; +- _outStream << ", out float4 oUVMisc : TEXCOORD" << texCoordSet++ +- << " // xy = uv, z = camDepth\n"; +- +- // layer UV's premultiplied, packed as xy/zw +- unsigned int numUVSets = numLayers / 2; +- +- if (numLayers % 2) +- ++numUVSets; +- +- if (_tt != LOW_LOD) +- { +- for (unsigned int i = 0; i < numUVSets; ++i) +- { +- _outStream << ", out float4 oUV" << i +- << " : TEXCOORD" << texCoordSet++ << "\n"; +- } +- } +- +- if (_prof->getParent()->getDebugLevel() && _tt != RENDER_COMPOSITE_MAP) +- { +- _outStream << ", out float2 lodInfo : TEXCOORD" << texCoordSet++ << "\n"; +- } +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- +- if (fog) +- { +- _outStream << +- ", uniform float4 fogParams\n" +- ", out float fogVal : COLOR\n"; +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- { +- texCoordSet = generateVpDynamicShadowsParams(texCoordSet, _prof, +- _terrain, _tt, _outStream); +- } +- +- // check we haven't exceeded texture coordinates +- if (texCoordSet > 8) +- { +- OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, +- "Requested options require too many texture coordinate sets! " +- "Try reducing the number of layers.", +- __FUNCTION__); +- } +- +- _outStream << +- ")\n" +- "{\n"; +- +- if (compression) +- { +- _outStream << " float4 pos;\n" +- << " pos = mul(posIndexToObjectSpace, float4(posIndex, height, 1));\n" +- << " float2 uv = float2(posIndex.x * baseUVScale, 1.0 - " +- << "(posIndex.y * baseUVScale));\n"; +- } +- +- _outStream << +- " float4 worldPos = mul(worldMatrix, pos);\n" +- " oPosObj = pos;\n"; +- +- if (_tt != RENDER_COMPOSITE_MAP) +- { +- // determine whether to apply the LOD morph to this vertex +- // we store the deltas against all vertices so we only want to apply +- // the morph to the ones which would disappear. The target LOD which is +- // being morphed to is stored in lodMorph.y, and the LOD at which +- // the vertex should be morphed is stored in uv.w. If we subtract +- // the former from the latter, and arrange to only morph if the +- // result is negative (it will only be -1 in fact, since after that +- // the vertex will never be indexed), we will achieve our aim. +- // sign(vertexLOD - targetLOD) == -1 is to morph +- _outStream << +- " float toMorph = -min(0, sign(delta.y - lodMorph.y));\n"; +- +- // this will either be 1 (morph) or 0 (don't morph) +- if (_prof->getParent()->getDebugLevel()) +- { +- // x == LOD level (-1 since value is target level, we want to +- // display actual) +- _outStream << "lodInfo.x = (lodMorph.y - 1) / " +- << _terrain->getNumLodLevels() << ";\n"; +- +- // y == LOD morph +- _outStream << "lodInfo.y = toMorph * lodMorph.x;\n"; +- } +- +- // morph +- switch (_terrain->getAlignment()) +- { +- case Ogre::Terrain::ALIGN_X_Y: +- _outStream << " worldPos.z += delta.x * toMorph * lodMorph.x;\n"; +- break; +- case Ogre::Terrain::ALIGN_X_Z: +- _outStream << " worldPos.y += delta.x * toMorph * lodMorph.x;\n"; +- break; +- case Ogre::Terrain::ALIGN_Y_Z: +- _outStream << " worldPos.x += delta.x * toMorph * lodMorph.x;\n"; +- break; +- default: +- gzerr << "Invalid alignment\n"; +- }; +- } +- +- // generate UVs +- if (_tt != LOW_LOD) +- { +- for (unsigned int i = 0; i < numUVSets; ++i) +- { +- unsigned int layer = i * 2; +- unsigned int uvMulIdx = layer / 4; +- +- _outStream << " oUV" << i << ".xy = " << " uv.xy * uvMul" +- << uvMulIdx << "." << getChannel(layer) << ";\n"; +- _outStream << " oUV" << i << ".zw = " << " uv.xy * uvMul" +- << uvMulIdx << "." << getChannel(layer+1) << ";\n"; +- } +- } +-} +- +-///////////////////////////////////////////////// +-// This method is identical to +-// TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg::generateVpFooter() +-// but is needed because generateVpDynamicShadows() is not declared virtual. +-void GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpFooter( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, Ogre::StringStream &_outStream) +-{ +- _outStream << " oPos = mul(viewProjMatrix, worldPos);\n" +- << " oUVMisc.xy = uv.xy;\n"; +- +- bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && +- _tt != RENDER_COMPOSITE_MAP; +- if (fog) +- { +- if (_terrain->getSceneManager()->getFogMode() == Ogre::FOG_LINEAR) +- { +- _outStream << +- " fogVal = saturate((oPos.z - fogParams.y) * fogParams.w);\n"; +- } +- else +- { +- _outStream << +- " fogVal = 1 - saturate(1 / (exp(oPos.z * fogParams.x)));\n"; +- } +- } +- +- if (_prof->isShadowingEnabled(_tt, _terrain)) +- this->generateVpDynamicShadows(_prof, _terrain, _tt, _outStream); +- +- _outStream << "}\n"; +-} +- +-///////////////////////////////////////////////// +-void GzTerrainMatGen::SM2Profile::ShaderHelperCg:: +-generateVertexProgramSource(const SM2Profile *_prof, +- const Ogre::Terrain* _terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream) +-{ +- this->generateVpHeader(_prof, _terrain, _tt, _outStream); +- +- if (_tt != LOW_LOD) +- { +- unsigned int maxLayers = _prof->getMaxLayers(_terrain); +- unsigned int numLayers = std::min(maxLayers, +- static_cast<unsigned int>(_terrain->getLayerCount())); +- +- for (unsigned int i = 0; i < numLayers; ++i) +- this->generateVpLayer(_prof, _terrain, _tt, i, _outStream); +- } +- +- this->generateVpFooter(_prof, _terrain, _tt, _outStream); +-} +- +-///////////////////////////////////////////////// +-Ogre::HighLevelGpuProgramPtr +-GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateFragmentProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, TechniqueType _tt) +-{ +- Ogre::HighLevelGpuProgramPtr ret = this->createFragmentProgram(_prof, +- _terrain, _tt); +- +- Ogre::StringStream sourceStr; +- +- this->generateFragmentProgramSource(_prof, _terrain, _tt, sourceStr); +- +- ret->setSource(sourceStr.str()); +- +- ret->load(); +- +- this->defaultFpParams(_prof, _terrain, _tt, ret); +- +- return ret; +-} ++// ///////////////////////////////////////////////// ++// GzTerrainMatGen::SM2Profile::SM2Profile( ++// Ogre::TerrainMaterialGenerator *_parent, const Ogre::String &_name, ++// const Ogre::String &_desc) ++// : TerrainMaterialGeneratorA::SM2Profile(_parent, _name, _desc) ++// { ++// this->mShaderGen = nullptr; ++// } ++// ++// ///////////////////////////////////////////////// ++// GzTerrainMatGen::SM2Profile::~SM2Profile() ++// { ++// // Because the base SM2Profile has no virtual destructor: ++// delete this->mShaderGen; ++// this->mShaderGen = nullptr; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::addTechnique( ++// const Ogre::MaterialPtr &_mat, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt) ++// { ++// // Initiate specialized mShaderGen ++// // Ogre::GpuProgramManager &gmgr = Ogre::GpuProgramManager::getSingleton(); ++// ++// Ogre::HighLevelGpuProgramManager &hmgr = ++// Ogre::HighLevelGpuProgramManager::getSingleton(); ++// ++// if (!this->mShaderGen) ++// { ++// // By default we use the GLSL shaders. ++// if (hmgr.isLanguageSupported("glsl")) ++// { ++// this->mShaderGen = OGRE_NEW ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL(); ++// } ++// else ++// { ++// gzthrow("No supported shader languages"); ++// } ++// ++// // Uncomment this to use cg shaders. I'm keeping the CG ++// // shader for reference. There is some more code to switch, located ++// // below, to enable CG shaders. ++// // if (hmgr.isLanguageSupported("cg")) ++// // { ++// // this->mShaderGen = OGRE_NEW ++// // // This will use Ogre's CG shader ++// // // Ogre::TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg(); ++// // // ++// // // This will use our CG shader, which has terrain shadows ++// // GzTerrainMatGen::SM2Profile::ShaderHelperCg(); ++// // } ++// ++// // check SM3 features ++// this->mSM3Available = ++// Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("ps_3_0"); ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// this->mSM4Available = ++// Ogre::GpuProgramManager::getSingleton().isSyntaxSupported("ps_4_0"); ++// #endif ++// } ++// ++// // Unfortunately this doesn't work ++// // Default implementation ++// // TerrainMaterialGeneratorA::SM2Profile::addTechnique(mat, terrain, tt); ++// ++// // So we have to replicate the entire method: ++// Ogre::Technique *tech = _mat->createTechnique(); ++// ++// // Only supporting one pass ++// Ogre::Pass *pass = tech->createPass(); ++// ++// // Doesn't delegate to the proper method otherwise ++// Ogre::HighLevelGpuProgramPtr vprog = ++// ((GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*)this->mShaderGen) ++// // Use this line if running Ogre's CG shaders ++// // ((TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg*)this->mShaderGen) ++// // Use this line if running our CG shaders ++// // ((GzTerrainMatGen::SM2Profile::ShaderHelperCg*)this->mShaderGen) ++// ->generateVertexProgram(this, _terrain, _tt); ++// ++// // DEBUG: std::cout << "VertShader[" << vprog->getName() << "]:\n" ++// // << vprog->getSource() << "\n\n"; ++// ++// Ogre::HighLevelGpuProgramPtr fprog = ++// ((GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*)this->mShaderGen) ++// // Use this line if running Ogre's CG shaders ++// // ((TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg*)this->mShaderGen) ++// // Use this line if running our CG shaders ++// // ((GzTerrainMatGen::SM2Profile::ShaderHelperCg*)this->mShaderGen) ++// ->generateFragmentProgram(this, _terrain, _tt); ++// ++// // DEBUG: std::cout << "FragShader[" << fprog->getName() << "]:\n" ++// // << fprog->getSource() << "\n\n"; ++// ++// pass->setVertexProgram(vprog->getName()); ++// pass->setFragmentProgram(fprog->getName()); ++// ++// if (_tt == Ogre::HIGH_LOD || _tt == Ogre::RENDER_COMPOSITE_MAP) ++// { ++// // global normal map ++// Ogre::TextureUnitState* tu = pass->createTextureUnitState(); ++// tu->setTextureName(_terrain->getTerrainNormalMap()->getName()); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); ++// ++// // global colour map ++// if (_terrain->getGlobalColourMapEnabled() && ++// this->isGlobalColourMapEnabled()) ++// { ++// tu = pass->createTextureUnitState( ++// _terrain->getGlobalColourMap()->getName()); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); ++// } ++// ++// // light map ++// if (this->isLightmapEnabled()) ++// { ++// tu = pass->createTextureUnitState(_terrain->getLightmap()->getName()); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); ++// } ++// ++// // blend maps ++// unsigned int maxLayers = this->getMaxLayers(_terrain); ++// ++// unsigned int numBlendTextures = std::min( ++// _terrain->getBlendTextureCount(maxLayers), ++// _terrain->getBlendTextureCount()); ++// ++// unsigned int numLayers = std::min( ++// maxLayers, static_cast<unsigned int>(_terrain->getLayerCount())); ++// ++// for (unsigned int i = 0; i < numBlendTextures; ++i) ++// { ++// tu = pass->createTextureUnitState(_terrain->getBlendTextureName(i)); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); ++// } ++// ++// // layer textures ++// for (unsigned int i = 0; i < numLayers; ++i) ++// { ++// // diffuse / specular ++// pass->createTextureUnitState(_terrain->getLayerTextureName(i, 0)); ++// ++// // normal / height ++// pass->createTextureUnitState(_terrain->getLayerTextureName(i, 1)); ++// } ++// } ++// else ++// { ++// // Ogre::LOW_LOD textures ++// // composite map ++// Ogre::TextureUnitState *tu = pass->createTextureUnitState(); ++// tu->setTextureName(_terrain->getCompositeMap()->getName()); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); ++// } ++// ++// // Add shadow textures (always at the end) ++// if (this->isShadowingEnabled(_tt, _terrain)) ++// { ++// unsigned int numTextures = 1; ++// ++// if (this->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = this->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// Ogre::TextureUnitState *tu = pass->createTextureUnitState(); ++// tu->setContentType(Ogre::TextureUnitState::CONTENT_SHADOW); ++// tu->setTextureAddressingMode(Ogre::TextureUnitState::TAM_BORDER); ++// tu->setTextureBorderColour(Ogre::ColourValue::White); ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// // generate() and generateForCompositeMap() are identical to ++// // TerrainMaterialGeneratorA implementation, the only reason for repeating ++// // them is that, unfortunately, addTechnique() is not declared virtual. ++// Ogre::MaterialPtr GzTerrainMatGen::SM2Profile::generate( ++// const Ogre::Terrain *_terrain) ++// { ++// // re-use old material if exists ++// Ogre::MaterialPtr mat = _terrain->_getMaterial(); ++// ++// if (mat.isNull()) ++// { ++// Ogre::MaterialManager &matMgr = Ogre::MaterialManager::getSingleton(); ++// ++// // it's important that the names are deterministic for a given terrain, so ++// // use the terrain pointer as an ID ++// const Ogre::String &matName = _terrain->getMaterialName(); ++// mat = matMgr.getByName(matName); ++// ++// if (mat.isNull()) ++// { ++// mat = matMgr.create(matName, ++// Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); ++// } ++// } ++// ++// // clear everything ++// mat->removeAllTechniques(); ++// ++// // Automatically disable normal & parallax mapping if card cannot handle it ++// // We do this rather than having a specific technique for it since it's ++// // simpler. ++// Ogre::GpuProgramManager &gmgr = Ogre::GpuProgramManager::getSingleton(); ++// ++// if (!gmgr.isSyntaxSupported("ps_4_0") && ++// !gmgr.isSyntaxSupported("ps_3_0") && ++// !gmgr.isSyntaxSupported("ps_2_x") && ++// !gmgr.isSyntaxSupported("fp40") && ++// !gmgr.isSyntaxSupported("arbfp1")) ++// { ++// this->setLayerNormalMappingEnabled(false); ++// this->setLayerParallaxMappingEnabled(false); ++// } ++// ++// this->addTechnique(mat, _terrain, Ogre::HIGH_LOD); ++// ++// // LOD ++// if (this->mCompositeMapEnabled) ++// { ++// this->addTechnique(mat, _terrain, Ogre::LOW_LOD); ++// Ogre::Material::LodValueList lodValues; ++// lodValues.push_back( ++// Ogre::TerrainGlobalOptions::getSingleton().getCompositeMapDistance()); ++// ++// mat->setLodLevels(lodValues); ++// Ogre::Technique *lowLodTechnique = mat->getTechnique(1); ++// lowLodTechnique->setLodIndex(1); ++// } ++// ++// this->UpdateParams(mat, _terrain); ++// ++// return mat; ++// } ++// ++// ///////////////////////////////////////////////// ++// Ogre::MaterialPtr GzTerrainMatGen::SM2Profile::generateForCompositeMap( ++// const Ogre::Terrain *_terrain) ++// { ++// // re-use old material if exists ++// Ogre::MaterialPtr mat = _terrain->_getCompositeMapMaterial(); ++// ++// if (mat.isNull()) ++// { ++// Ogre::MaterialManager &matMgr = Ogre::MaterialManager::getSingleton(); ++// ++// // it's important that the names are deterministic for a given terrain, so ++// // use the terrain pointer as an ID ++// const Ogre::String &matName = _terrain->getMaterialName() + "/comp"; ++// ++// mat = matMgr.getByName(matName); ++// ++// if (mat.isNull()) ++// { ++// mat = matMgr.create(matName, ++// Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); ++// } ++// } ++// ++// // clear everything ++// mat->removeAllTechniques(); ++// ++// this->addTechnique(mat, _terrain, Ogre::RENDER_COMPOSITE_MAP); ++// ++// this->UpdateParamsForCompositeMap(mat, _terrain); ++// ++// return mat; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::UpdateParams(const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain) ++// { ++// static_cast<GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*>( ++// this->mShaderGen)->updateParams(this, _mat, _terrain, false); ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::UpdateParamsForCompositeMap( ++// const Ogre::MaterialPtr &_mat, const Ogre::Terrain *_terrain) ++// { ++// static_cast<GzTerrainMatGen::SM2Profile::ShaderHelperGLSL*>( ++// this->mShaderGen)->updateParams(this, _mat, _terrain, true); ++// } ++// ++// ///////////////////////////////////////////////// ++// ///////////////////////////////////////////////// ++// // GLSL Shader helper ++// ///////////////////////////////////////////////// ++// ///////////////////////////////////////////////// ++// ++// ///////////////////////////////////////////////// ++// Ogre::HighLevelGpuProgramPtr ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVertexProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt) ++// { ++// Ogre::HighLevelGpuProgramPtr ret = ++// this->createVertexProgram(_prof, _terrain, _tt); ++// ++// Ogre::StringStream sourceStr; ++// this->generateVertexProgramSource(_prof, _terrain, _tt, sourceStr); ++// ++// ret->setSource(sourceStr.str()); ++// ret->load(); ++// this->defaultVpParams(_prof, _terrain, _tt, ret); ++// ++// return ret; ++// } ++// ++// ///////////////////////////////////////////////// ++// Ogre::HighLevelGpuProgramPtr ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFragmentProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt) ++// { ++// Ogre::HighLevelGpuProgramPtr ret = this->createFragmentProgram(_prof, ++// _terrain, _tt); ++// ++// Ogre::StringStream sourceStr; ++// ++// this->generateFragmentProgramSource(_prof, _terrain, _tt, sourceStr); ++// ++// ret->setSource(sourceStr.str()); ++// ++// ret->load(); ++// ++// this->defaultFpParams(_prof, _terrain, _tt, ret); ++// ++// Ogre::GpuProgramParametersSharedPtr params = ret->getDefaultParameters(); ++// params->setIgnoreMissingParams(false); ++// ++// Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); ++// Ogre::uint numBlendTextures = std::min( ++// _terrain->getBlendTextureCount(maxLayers), ++// _terrain->getBlendTextureCount()); ++// ++// Ogre::uint numLayers = std::min(maxLayers, ++// static_cast<Ogre::uint>(_terrain->getLayerCount())); ++// ++// int samplerCounter = 0; ++// ++// if (_tt == Ogre::LOW_LOD) ++// params->setNamedConstant("compositeMap", samplerCounter++); ++// else ++// { ++// params->setNamedConstant("globalNormal", samplerCounter++); ++// ++// if (_terrain->getGlobalColourMapEnabled() && ++// _prof->isGlobalColourMapEnabled()) ++// { ++// params->setNamedConstant("globalColourMap", samplerCounter++); ++// } ++// ++// if (_prof->isLightmapEnabled()) ++// params->setNamedConstant("lightMap", samplerCounter++); ++// ++// for (Ogre::uint i = 0; i < numBlendTextures; ++i) ++// { ++// params->setNamedConstant("blendTex" + ++// boost::lexical_cast<std::string>(i), samplerCounter++); ++// } ++// ++// for (Ogre::uint i = 0; i < numLayers; ++i) ++// { ++// params->setNamedConstant("difftex" + ++// boost::lexical_cast<std::string>(i), samplerCounter++); ++// params->setNamedConstant("normtex" + ++// boost::lexical_cast<std::string>(i), samplerCounter++); ++// } ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// Ogre::uint numTextures = 1; ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// { ++// params->setNamedConstant("shadowMap" + ++// boost::lexical_cast<std::string>(i), samplerCounter++); ++// } ++// } ++// ++// return ret; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::updateParams( ++// const SM2Profile *_prof, const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain, bool _compositeMap) ++// { ++// Ogre::Pass *p = _mat->getTechnique(0)->getPass(0); ++// ++// if (_compositeMap) ++// { ++// this->updateVpParams(_prof, _terrain, Ogre::RENDER_COMPOSITE_MAP, ++// p->getVertexProgramParameters()); ++// this->updateFpParams(_prof, _terrain, Ogre::RENDER_COMPOSITE_MAP, ++// p->getFragmentProgramParameters()); ++// } ++// else ++// { ++// // high lod ++// this->updateVpParams(_prof, _terrain, Ogre::HIGH_LOD, ++// p->getVertexProgramParameters()); ++// this->updateFpParams(_prof, _terrain, Ogre::HIGH_LOD, ++// p->getFragmentProgramParameters()); ++// ++// if (_prof->isCompositeMapEnabled()) ++// { ++// // low lod ++// p = _mat->getTechnique(1)->getPass(0); ++// this->updateVpParams(_prof, _terrain, Ogre::LOW_LOD, ++// p->getVertexProgramParameters()); ++// this->updateFpParams(_prof, _terrain, Ogre::LOW_LOD, ++// p->getFragmentProgramParameters()); ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL:: ++// generateVertexProgramSource(const SM2Profile *_prof, ++// const Ogre::Terrain* _terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream) ++// { ++// this->generateVpHeader(_prof, _terrain, _tt, _outStream); ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// unsigned int maxLayers = _prof->getMaxLayers(_terrain); ++// unsigned int numLayers = std::min(maxLayers, ++// static_cast<unsigned int>(_terrain->getLayerCount())); ++// ++// for (unsigned int i = 0; i < numLayers; ++i) ++// this->generateVpLayer(_prof, _terrain, _tt, i, _outStream); ++// } ++// ++// this->generateVpFooter(_prof, _terrain, _tt, _outStream); ++// } ++// ++// ///////////////////////////////////////////////// ++// // This method is identical to ++// // TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL::generateVpHeader() ++// // but is needed because generateVpDynamicShadowsParams() is not declared ++// // virtual. ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpHeader( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// bool compression = false; ++// ++// _outStream << "#version " << glslVersion << "\n\n"; ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// compression = _terrain->_getUseVertexCompression() && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// ++// if (compression) ++// { ++// // The parameter "in vec4 vertex;" is automatically bound by OGRE. ++// // The parameter "in vec4 uv0'" is automatically bound by OGRE. ++// _outStream << vpInStr << " vec4 vertex;\n" ++// << vpInStr << " vec4 uv0;\n"; ++// } ++// else ++// #endif ++// { ++// // The parameter "in vec4 vertex;" is automatically bound by OGRE. ++// // The parameter "in vec4 uv0'" is automatically bound by OGRE. ++// _outStream << vpInStr << " vec4 vertex;\n" ++// << vpInStr << " vec4 uv0;\n"; ++// } ++// ++// if (_tt != Ogre::RENDER_COMPOSITE_MAP) ++// // The parameter "in vec4 uv1'" is automatically bound by OGRE. ++// _outStream << vpInStr << " vec4 uv1;\n"; ++// ++// _outStream << ++// "uniform mat4 worldMatrix;\n" ++// "uniform mat4 viewProjMatrix;\n" ++// "uniform vec2 lodMorph;\n"; ++// ++// if (compression) ++// { ++// _outStream << ++// "uniform mat4 posIndexToObjectSpace;\n" ++// "uniform float baseUVScale;\n"; ++// } ++// ++// ++// // uv multipliers ++// unsigned int maxLayers = _prof->getMaxLayers(_terrain); ++// unsigned int numLayers = std::min(maxLayers, ++// static_cast<unsigned int>(_terrain->getLayerCount())); ++// ++// unsigned int numUVMultipliers = (numLayers / 4); ++// ++// if (numLayers % 4) ++// ++numUVMultipliers; ++// ++// for (unsigned int i = 0; i < numUVMultipliers; ++i) ++// _outStream << "uniform vec4 uvMul" << i << ";\n"; ++// ++// _outStream << ++// vpOutStr << " vec4 position;\n"; ++// ++// unsigned int texCoordSet = 1; ++// _outStream << vpOutStr << " vec4 uvMisc;\n"; ++// ++// // layer UV's premultiplied, packed as xy/zw ++// unsigned int numUVSets = numLayers / 2; ++// ++// if (numLayers % 2) ++// ++numUVSets; ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// for (unsigned int i = 0; i < numUVSets; ++i) ++// { ++// _outStream << vpOutStr << " vec4 layerUV" << i << ";\n"; ++// } ++// } ++// ++// if (_prof->getParent()->getDebugLevel() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// _outStream << vpOutStr << " vec2 lodInfo;\n"; ++// } ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// ++// if (fog) ++// { ++// _outStream << ++// "uniform vec4 fogParams;\n" ++// << vpOutStr << " float fogVal;\n"; ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// texCoordSet = this->generateVpDynamicShadowsParams(texCoordSet, _prof, ++// _terrain, _tt, _outStream); ++// } ++// ++// // check we haven't exceeded texture coordinates ++// if (texCoordSet > 8) ++// { ++// OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, ++// "Requested options require too many texture coordinate sets! " ++// "Try reducing the number of layers.", ++// __FUNCTION__); ++// } ++// ++// _outStream << "void main()\n" ++// << "{\n"; ++// ++// if (compression) ++// { ++// _outStream ++// << " vec4 pos = posIndexToObjectSpace * " ++// << "vec4(vertex.x, vertex.y, uv0.x, 1.0);\n" ++// ++// << " vec2 uv = vec2(vertex.x * baseUVScale, 1.0 - " ++// << "(vertex.y * baseUVScale));\n"; ++// } ++// else ++// { ++// _outStream ++// << " vec4 pos = vertex;\n" ++// << " vec2 uv = vec2(uv0.x, uv0.y);\n"; ++// } ++// ++// _outStream << " vec4 worldPos = worldMatrix * pos;\n"; ++// _outStream << " position = pos;\n"; ++// ++// if (_tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// // determine whether to apply the LOD morph to this vertex ++// // we store the deltas against all vertices so we only want to apply ++// // the morph to the ones which would disappear. The target LOD which is ++// // being morphed to is stored in lodMorph.y, and the LOD at which ++// // the vertex should be morphed is stored in uv.w. If we subtract ++// // the former from the latter, and arrange to only morph if the ++// // result is negative (it will only be -1 in fact, since after that ++// // the vertex will never be indexed), we will achieve our aim. ++// // sign(vertexLOD - targetLOD) == -1 is to morph ++// _outStream << ++// " float toMorph = -min(0.0, sign(uv1.y - lodMorph.y));\n"; ++// ++// // this will either be 1 (morph) or 0 (don't morph) ++// if (_prof->getParent()->getDebugLevel()) ++// { ++// // x == LOD level (-1 since value is target level, we want to ++// // display actual) ++// _outStream << "lodInfo.x = (lodMorph.y - 1.0) / " ++// << _terrain->getNumLodLevels() << ";\n"; ++// ++// // y == LOD morph ++// _outStream << "lodInfo.y = toMorph * lodMorph.x;\n"; ++// } ++// ++// // morph ++// switch (_terrain->getAlignment()) ++// { ++// case Ogre::Terrain::ALIGN_X_Y: ++// _outStream << " worldPos.z += uv1.x * toMorph * lodMorph.x;\n"; ++// break; ++// case Ogre::Terrain::ALIGN_X_Z: ++// _outStream << " worldPos.y += uv1.x * toMorph * lodMorph.x;\n"; ++// break; ++// case Ogre::Terrain::ALIGN_Y_Z: ++// _outStream << " worldPos.x += uv1.x * toMorph * lodMorph.x;\n"; ++// break; ++// default: ++// gzerr << "Invalid alignment\n"; ++// }; ++// } ++// ++// // generate UVs ++// if (_tt != Ogre::LOW_LOD) ++// { ++// for (unsigned int i = 0; i < numUVSets; ++i) ++// { ++// unsigned int layer = i * 2; ++// unsigned int uvMulIdx = layer / 4; ++// ++// _outStream << " layerUV" << i << ".xy = " << " uv.xy * uvMul" ++// << uvMulIdx << "." << this->GetChannel(layer) << ";\n"; ++// _outStream << " layerUV" << i << ".zw = " << " uv.xy * uvMul" ++// << uvMulIdx << "." << this->GetChannel(layer+1) << ";\n"; ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// // This method is identical to ++// // TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL::generateVpFooter() ++// // but is needed because generateVpDynamicShadows() is not declared virtual. ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpFooter( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// _outStream << " gl_Position = viewProjMatrix * worldPos;\n" ++// << " uvMisc.xy = uv.xy;\n"; ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// if (fog) ++// { ++// if (_terrain->getSceneManager()->getFogMode() == Ogre::FOG_LINEAR) ++// { ++// _outStream << ++// " fogVal = clamp((oPos.z - fogParams.y) * fogParams.w, 0.0, 1.0);\n"; ++// } ++// else ++// { ++// _outStream << ++// " fogVal = 1 - clamp(1 / (exp(oPos.z * fogParams.x)), 0.0, 1.0);\n"; ++// } ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// this->generateVpDynamicShadows(_prof, _terrain, _tt, _outStream); ++// ++// _outStream << "}\n"; ++// } ++// ++// ///////////////////////////////////////////////// ++// void ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateVpDynamicShadows( ++// const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, ++// Ogre::TechniqueType /*_tt*/, Ogre::StringStream &_outStream) ++// { ++// unsigned int numTextures = 1; ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// ++// // Calculate the position of vertex in light space ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// _outStream << " lightSpacePos" << i << " = texViewProjMatrix" ++// << i << " * worldPos;\n"; ++// ++// // Don't linearize depth range: RTSS PSSM implementation uses ++// // view-space depth ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // // make linear ++// // outStream << "lightSpacePos" << i << ".z = (lightSpacePos" << i ++// // << ".z - depthRange" << i << ".x) * depthRange" << i ++// // << ".w;\n"; ++// // } ++// } ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// _outStream << " // pass cam depth\n uvMisc.z = gl_Position.z;\n"; ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::defaultVpParams( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, const Ogre::HighLevelGpuProgramPtr &_prog) ++// { ++// Ogre::GpuProgramParametersSharedPtr params = _prog->getDefaultParameters(); ++// params->setIgnoreMissingParams(true); ++// ++// params->setNamedAutoConstant("worldMatrix", ++// Ogre::GpuProgramParameters::ACT_WORLD_MATRIX); ++// ++// params->setNamedAutoConstant("viewProjMatrix", ++// Ogre::GpuProgramParameters::ACT_VIEWPROJ_MATRIX); ++// ++// params->setNamedAutoConstant("lodMorph", ++// Ogre::GpuProgramParameters::ACT_CUSTOM, ++// Ogre::Terrain::LOD_MORPH_CUSTOM_PARAM); ++// ++// params->setNamedAutoConstant("fogParams", ++// Ogre::GpuProgramParameters::ACT_FOG_PARAMS); ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// unsigned int numTextures = 1; ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// params->setNamedAutoConstant("texViewProjMatrix" + ++// Ogre::StringConverter::toString(i), ++// Ogre::GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX, i); ++// ++// // Don't add depth range params ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // params->setNamedAutoConstant("depthRange" + ++// // Ogre::StringConverter::toString(i), ++// // Ogre::GpuProgramParameters::ACT_SHADOW_SCENE_DEPTH_RANGE, i); ++// // } ++// } ++// } ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// if (_terrain->_getUseVertexCompression() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// Ogre::Matrix4 posIndexToObjectSpace; ++// _terrain->getPointTransform(&posIndexToObjectSpace); ++// params->setNamedConstant("posIndexToObjectSpace", posIndexToObjectSpace); ++// } ++// #endif ++// } ++// ++// ///////////////////////////////////////////////// ++// unsigned int GzTerrainMatGen::SM2Profile::ShaderHelperGLSL:: ++// generateVpDynamicShadowsParams(unsigned int _texCoord, const SM2Profile *_prof, ++// const Ogre::Terrain * /*_terrain*/, Ogre::TechniqueType /*_tt*/, ++// Ogre::StringStream &_outStream) ++// { ++// // out semantics & params ++// unsigned int numTextures = 1; ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// _outStream << vpOutStr << " vec4 lightSpacePos" << i << ";\n" ++// << "uniform mat4 texViewProjMatrix" << i << ";\n"; ++// ++// // Don't add depth range params ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // _outStream << ", uniform float4 depthRange" << i ++// // << " // x = min, y = max, z = range, w = 1/range\n"; ++// // } ++// } ++// ++// return _texCoord; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpHeader( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// _outStream << "#version " << glslVersion << "\n\n"; ++// ++// _outStream << ++// "vec4 expand(vec4 v)\n" ++// "{\n" ++// " return v * 2 - 1;\n" ++// "}\n\n"; ++// ++// _outStream << ++// "vec4 lit(float NdotL, float NdotH, float m)\n" ++// "{\n" ++// " float specular = (NdotL > 0) ? pow(max(0.0, NdotH), m) : 0.0;\n" ++// " return vec4(1.0, max(0.0, NdotL), specular, 1.0);\n" ++// "}\n"; ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// this->generateFpDynamicShadowsHelpers(_prof, _terrain, _tt, _outStream); ++// ++// _outStream << ++// fpInStr << " vec4 position;\n"; ++// ++// Ogre::uint texCoordSet = 1; ++// _outStream << fpInStr << " vec4 uvMisc;\n"; ++// ++// // UV's premultiplied, packed as xy/zw ++// Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); ++// Ogre::uint numBlendTextures = std::min( ++// _terrain->getBlendTextureCount(maxLayers), ++// _terrain->getBlendTextureCount()); ++// Ogre::uint numLayers = std::min(maxLayers, ++// static_cast<Ogre::uint>(_terrain->getLayerCount())); ++// ++// Ogre::uint numUVSets = numLayers / 2; ++// ++// if (numLayers % 2) ++// ++numUVSets; ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// for (Ogre::uint i = 0; i < numUVSets; ++i) ++// { ++// _outStream << ++// fpInStr << " vec4 layerUV" << i << ";\n"; ++// } ++// } ++// ++// if (_prof->getParent()->getDebugLevel() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// _outStream << fpInStr << " vec2 lodInfo;\n"; ++// } ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// ++// if (fog) ++// { ++// _outStream << ++// "uniform vec3 fogColour;\n" ++// << fpInStr << " float fogVal;\n"; ++// } ++// ++// Ogre::uint currentSamplerIdx = 0; ++// ++// _outStream << ++// // Only 1 light supported in this version ++// // deferred shading profile / generator later, ok? :) ++// "uniform vec3 ambient;\n" ++// "uniform vec4 lightPosObjSpace;\n" ++// "uniform vec3 lightDiffuseColour;\n" ++// "uniform vec3 lightSpecularColour;\n" ++// "uniform vec3 eyePosObjSpace;\n" ++// // pack scale, bias and specular ++// "uniform vec4 scaleBiasSpecular;\n"; ++// ++// if (_tt == Ogre::LOW_LOD) ++// { ++// // single composite map covers all the others below ++// _outStream << "uniform sampler2D compositeMap;\n"; ++// } ++// else ++// { ++// _outStream << "uniform sampler2D globalNormal;\n"; ++// ++// if (_terrain->getGlobalColourMapEnabled() && ++// _prof->isGlobalColourMapEnabled()) ++// { ++// _outStream << "uniform sampler2D globalColourMap;\n"; ++// } ++// ++// if (_prof->isLightmapEnabled()) ++// { ++// _outStream << "uniform sampler2D lightMap;\n"; ++// } ++// ++// // Blend textures - sampler definitions ++// for (Ogre::uint i = 0; i < numBlendTextures; ++i) ++// { ++// _outStream << "uniform sampler2D blendTex" << i << ";\n"; ++// } ++// ++// // Layer textures - sampler definitions & UV multipliers ++// for (Ogre::uint i = 0; i < numLayers; ++i) ++// { ++// _outStream << "uniform sampler2D difftex" << i << ";\n"; ++// _outStream << "uniform sampler2D normtex" << i << ";\n"; ++// } ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// this->generateFpDynamicShadowsParams(&texCoordSet, ¤tSamplerIdx, ++// _prof, _terrain, _tt, _outStream); ++// } ++// ++// // check we haven't exceeded samplers ++// if (currentSamplerIdx > 16) ++// { ++// OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, ++// "Requested options require too many texture samplers! " ++// "Try reducing the number of layers.", __FUNCTION__); ++// } ++// ++// std::string outputColTypeStr = "vec4"; ++// if (glslVersion != "120") ++// { ++// _outStream << "out vec4 outputCol;\n"; ++// outputColTypeStr = ""; ++// } ++// ++// _outStream << ++// "void main()\n" ++// "{\n" ++// " float shadow = 1.0;\n" ++// " vec2 uv = uvMisc.xy;\n" ++// " " << outputColTypeStr << " outputCol = vec4(0.0, 0.0, 0.0, 1.0);\n"; ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// // global normal ++// _outStream << " vec3 normal = expand(" ++// << textureStr << "(globalNormal, uv)).xyz;\n"; ++// } ++// ++// _outStream << ++// " vec3 lightDir =\n" ++// " lightPosObjSpace.xyz - (position.xyz * lightPosObjSpace.w);\n" ++// " vec3 eyeDir = eyePosObjSpace - position.xyz;\n" ++// ++// // set up accumulation areas ++// " vec3 diffuse = vec3(0.0, 0.0, 0.0);\n" ++// " float specular = 0.0;\n"; ++// ++// if (_tt == Ogre::LOW_LOD) ++// { ++// // we just do a single calculation from composite map ++// _outStream << ++// " vec4 composite = " << textureStr << "(compositeMap, uv);\n" ++// " diffuse = composite.xyz;\n"; ++// // TODO - specular; we'll need normals for this! ++// } ++// else ++// { ++// // set up the blend values ++// for (Ogre::uint i = 0; i < numBlendTextures; ++i) ++// { ++// _outStream << " vec4 blendTexVal" << i ++// << " = " << textureStr << "(blendTex" << i << ", uv);\n"; ++// } ++// ++// if (_prof->isLayerNormalMappingEnabled()) ++// { ++// // derive the tangent space basis ++// // we do this in the pixel shader because we don't have per-vertex normals ++// // because of the LOD, we use a normal map ++// // tangent is always +x or -z in object space depending on alignment ++// switch (_terrain->getAlignment()) ++// { ++// case Ogre::Terrain::ALIGN_X_Y: ++// case Ogre::Terrain::ALIGN_X_Z: ++// _outStream << " vec3 tangent = vec3(1.0, 0.0, 0.0);\n"; ++// break; ++// case Ogre::Terrain::ALIGN_Y_Z: ++// _outStream << " vec3 tangent = vec3(0.0, 0.0, -1.0);\n"; ++// break; ++// default: ++// gzerr << "Invalid terrain alignment\n"; ++// break; ++// }; ++// ++// _outStream << " vec3 binormal = normalize(cross(tangent, normal));\n"; ++// // note, now we need to re-cross to derive tangent again because it ++// // wasn't orthonormal ++// _outStream << " tangent = normalize(cross(normal, binormal));\n"; ++// // derive final matrix ++// /*_outStream << " mat3 TBN = mat3(tangent.x, tangent.y, tangent.z," ++// "binormal.x, binormal.y, binormal.z," ++// "normal.x, normal.y, normal.z);\n"; ++// */ ++// ++// // set up lighting result placeholders for interpolation ++// _outStream << " vec4 litRes, litResLayer;\n"; ++// _outStream << " vec3 TSlightDir, TSeyeDir, TShalfAngle, TSnormal;\n"; ++// if (_prof->isLayerParallaxMappingEnabled()) ++// _outStream << " float displacement;\n"; ++// // move ++// _outStream << " TSlightDir = normalize(vec3(dot(tangent, lightDir)," ++// "dot(binormal, lightDir)," ++// "dot(normal, lightDir)));\n"; ++// _outStream << " TSeyeDir = normalize(vec3(dot(tangent, eyeDir)," ++// "dot(binormal, eyeDir)," ++// "dot(normal, eyeDir)));\n"; ++// } ++// else ++// { ++// // simple per-pixel lighting with no normal mapping ++// _outStream << " lightDir = normalize(lightDir);\n"; ++// _outStream << " eyeDir = normalize(eyeDir);\n"; ++// _outStream << " vec3 halfAngle = normalize(lightDir + eyeDir);\n"; ++// ++// _outStream << " vec4 litRes = lit(dot(lightDir, normal), " ++// "dot(halfAngle, normal), scaleBiasSpecular.z);\n"; ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// void ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsParams( ++// Ogre::uint *_texCoord, Ogre::uint *_sampler, const SM2Profile *_prof, ++// const Ogre::Terrain * /*_terrain*/, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream) ++// { ++// if (_tt == Ogre::HIGH_LOD) ++// this->mShadowSamplerStartHi = *_sampler; ++// else if (_tt == Ogre::LOW_LOD) ++// this->mShadowSamplerStartLo = *_sampler; ++// ++// // in semantics & params ++// Ogre::uint numTextures = 1; ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// _outStream << "uniform vec4 pssmSplitPoints;\n"; ++// } ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// { ++// _outStream << fpInStr << ++// " vec4 lightSpacePos" << i << ";\n" << ++// "uniform sampler2D shadowMap" << i << ";\n"; ++// ++// *_sampler = *_sampler + 1; ++// *_texCoord = *_texCoord + 1; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << ++// "uniform float inverseShadowmapSize" << i << ";\n"; ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpLayer( ++// const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, ++// Ogre::TechniqueType _tt, Ogre::uint _layer, ++// Ogre::StringStream &_outStream) ++// { ++// Ogre::uint uvIdx = _layer / 2; ++// Ogre::String uvChannels = (_layer % 2) ? ".zw" : ".xy"; ++// Ogre::uint blendIdx = (_layer-1) / 4; ++// Ogre::String blendChannel = this->GetChannel(_layer-1); ++// Ogre::String blendWeightStr = Ogre::String("blendTexVal") + ++// Ogre::StringConverter::toString(blendIdx) + "." + blendChannel; ++// ++// // generate early-out conditional ++// // Disable - causing some issues even when trying to force the use of texldd ++// // if (layer && prof->_isSM3Available()) ++// // _outStream << " if (" << blendWeightStr << " > 0.0003)\n {\n"; ++// ++// // generate UV ++// _outStream << " vec2 uv" << _layer << " = layerUV" << uvIdx ++// << uvChannels << ";\n"; ++// ++// // calculate lighting here if normal mapping ++// if (_prof->isLayerNormalMappingEnabled()) ++// { ++// if (_prof->isLayerParallaxMappingEnabled() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// // modify UV - note we have to sample an extra time ++// _outStream << " displacement = " << textureStr << "(normtex" << _layer ++// << ", uv" << _layer << ").w\n" ++// " * scaleBiasSpecular.x + scaleBiasSpecular.y;\n"; ++// _outStream << " uv" << _layer << " += TSeyeDir.xy * displacement;\n"; ++// } ++// ++// // access TS normal map ++// _outStream << " TSnormal = expand(" << textureStr << "(normtex" ++// << _layer << ", uv" << _layer << ")).xyz;\n"; ++// _outStream << " TShalfAngle = normalize(TSlightDir + TSeyeDir);\n"; ++// ++// _outStream << " litResLayer = lit(dot(TSlightDir, TSnormal), " ++// "dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);\n"; ++// ++// if (!_layer) ++// _outStream << " litRes = litResLayer;\n"; ++// else ++// _outStream << " litRes = mix(litRes, litResLayer, " ++// << blendWeightStr << ");\n"; ++// } ++// ++// // sample diffuse texture ++// _outStream << " vec4 diffuseSpecTex" << _layer ++// << " = " << textureStr << "(difftex" << _layer << ", uv" << _layer ++// << ");\n"; ++// ++// // apply to common ++// if (!_layer) ++// { ++// _outStream << " diffuse = diffuseSpecTex0.xyz;\n"; ++// if (_prof->isLayerSpecularMappingEnabled()) ++// _outStream << " specular = diffuseSpecTex0.w;\n"; ++// } ++// else ++// { ++// _outStream << " diffuse = mix(diffuse, diffuseSpecTex" << _layer ++// << ".xyz, " << blendWeightStr << ");\n"; ++// ++// if (_prof->isLayerSpecularMappingEnabled()) ++// { ++// _outStream << " specular = mix(specular, diffuseSpecTex" << _layer ++// << ".w, " << blendWeightStr << ");\n"; ++// } ++// } ++// ++// // End early-out ++// // Disable - causing some issues even when trying to force the use of texldd ++// // if (layer && prof->_isSM3Available()) ++// // _outStream << " } // early-out blend value\n"; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpFooter( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// if (_tt == Ogre::LOW_LOD) ++// { ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// this->generateFpDynamicShadows(_prof, _terrain, _tt, _outStream); ++// _outStream << " outputCol.xyz = diffuse * rtshadow;\n"; ++// } ++// else ++// { ++// _outStream << " outputCol.xyz = diffuse;\n"; ++// } ++// } ++// else ++// { ++// if (_terrain->getGlobalColourMapEnabled() && ++// _prof->isGlobalColourMapEnabled()) ++// { ++// // sample colour map and apply to diffuse ++// _outStream << " diffuse *= " << textureStr ++// << "(globalColourMap, uv).xyz;\n"; ++// } ++// ++// if (_prof->isLightmapEnabled()) ++// { ++// // sample lightmap ++// _outStream << " shadow = " << textureStr << "(lightMap, uv).x;\n"; ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// this->generateFpDynamicShadows(_prof, _terrain, _tt, _outStream); ++// } ++// ++// // diffuse lighting ++// _outStream << " outputCol.xyz += ambient * diffuse + litRes.y * " ++// "lightDiffuseColour * diffuse * shadow;\n"; ++// ++// // specular default ++// if (!_prof->isLayerSpecularMappingEnabled()) ++// _outStream << " specular = 1.0;\n"; ++// ++// if (_tt == Ogre::RENDER_COMPOSITE_MAP) ++// { ++// // Lighting embedded in alpha ++// _outStream << " outputCol.w = shadow;\n"; ++// } ++// else ++// { ++// // Apply specular ++// _outStream << " outputCol.xyz += litRes.z * lightSpecularColour * " ++// "specular * shadow;\n"; ++// ++// if (_prof->getParent()->getDebugLevel()) ++// { ++// _outStream << " outputCol.xy += lodInfo.xy;\n"; ++// } ++// } ++// } ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// if (fog) ++// { ++// _outStream << " outputCol.xyz = mix(outputCol.xyz, fogColour, fogVal);\n"; ++// } ++// ++// if (glslVersion == "120") ++// _outStream << " gl_FragColor = outputCol;\n"; ++// ++// // Final return ++// _outStream << "\n}\n"; ++// } ++// ++// ///////////////////////////////////////////////// ++// void ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadowsHelpers( ++// const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, ++// Ogre::TechniqueType /*_tt*/, Ogre::StringStream &_outStream) ++// { ++// // TODO make filtering configurable ++// _outStream << ++// "// Simple PCF\n" ++// "// Number of samples in one dimension (square for total samples)\n" ++// "#define NUM_SHADOW_SAMPLES_1D 2.0\n" ++// "#define SHADOW_FILTER_SCALE 1.0\n" ++// ++// "#define SHADOW_SAMPLES NUM_SHADOW_SAMPLES_1D*NUM_SHADOW_SAMPLES_1D\n" ++// ++// "vec4 offsetSample(vec4 uv, vec2 offset, float invMapSize)\n" ++// "{\n" ++// " return vec4(uv.xy + offset * invMapSize * uv.w, uv.z, uv.w);\n" ++// "}\n"; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << ++// "float calcDepthShadow(sampler2D shadowMap, vec4 uv, " ++// "float invShadowMapSize)\n" ++// "{\n" ++// " // 4-sample PCF\n" ++// " float shadow = 0.0;\n" ++// " float offset = (NUM_SHADOW_SAMPLES_1D/2.0 - 0.5) *SHADOW_FILTER_SCALE;" ++// "\n" ++// " for (float y = -offset; y <= offset; y += SHADOW_FILTER_SCALE)\n" ++// " for (float x = -offset; x <= offset; x += SHADOW_FILTER_SCALE)\n" ++// " {\n" ++// " vec4 newUV = offsetSample(uv, vec2(x, y), invShadowMapSize);\n" ++// " // manually project and assign derivatives\n" ++// " // to avoid gradient issues inside loops\n" ++// " newUV = newUV / newUV.w;\n"; ++// // The following line used to be: ++// // " float depth = tex2d(shadowMap, newUV.xy).x;\n" ++// if (glslVersion == "120") ++// _outStream << ++// " float depth = texture2D(shadowMap, newUV.xy).x;\n"; ++// else ++// { ++// _outStream << ++// " float depth = textureGrad(shadowMap, newUV.xy, " ++// " vec2(1.0, 1.0), vec2(1.0, 1.0)).x;\n"; ++// } ++// _outStream << ++// // " if (depth >= 1.0 || depth >= uv.z)\n" ++// " if (depth >= 1.0 || depth >= newUV.z)\n" ++// " shadow += 1.0;\n" ++// " }\n" ++// " shadow /= (SHADOW_SAMPLES); \n" ++// " return shadow;\n" ++// "}\n"; ++// } ++// else ++// { ++// _outStream << ++// "float calcSimpleShadow(sampler2D shadowMap, vec4 shadowMapPos)\n" ++// "{\n" ++// " return " << textureStr << "Proj(shadowMap, shadowMapPos).x;\n" ++// "}\n"; ++// } ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// Ogre::uint numTextures = ++// _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << "float calcPSSMDepthShadow("; ++// } ++// else ++// { ++// _outStream << "float calcPSSMSimpleShadow("; ++// } ++// ++// _outStream << "\n "; ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "sampler2D shadowMap" << i << ", "; ++// ++// _outStream << "\n "; ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "vec4 lsPos" << i << ", "; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << "\n "; ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "float invShadowmapSize" << i << ", "; ++// } ++// ++// _outStream << "\n" ++// " vec4 pssmSplitPoints, float camDepth)\n" ++// "{\n" ++// " float shadow = 1.0;\n" ++// " // calculate shadow\n"; ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// { ++// if (!i) ++// { ++// _outStream << " if (camDepth <= pssmSplitPoints." ++// << this->GetChannel(i) << ")\n"; ++// } ++// else if (i < numTextures-1) ++// { ++// _outStream << " else if (camDepth <= pssmSplitPoints." ++// << this->GetChannel(i) << ")\n"; ++// } ++// else ++// _outStream << " else\n"; ++// ++// _outStream << " {\n"; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << " shadow = calcDepthShadow(shadowMap" << i ++// << ", lsPos" << i << ", invShadowmapSize" << i << ");\n"; ++// } ++// else ++// { ++// _outStream << " shadow = calcSimpleShadow(shadowMap" << i ++// << ", lsPos" << i << ");\n"; ++// } ++// _outStream << " }\n"; ++// } ++// ++// _outStream << " return shadow;\n" ++// "}\n\n\n"; ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFpDynamicShadows( ++// const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, ++// Ogre::TechniqueType /*_tt*/, Ogre::StringStream &_outStream) ++// { ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// Ogre::uint numTextures = ++// _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// ++// _outStream << " float camDepth = uvMisc.z;\n"; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << " float rtshadow = calcPSSMDepthShadow("; ++// } ++// else ++// { ++// _outStream << " float rtshadow = calcPSSMSimpleShadow("; ++// } ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "shadowMap" << i << ", "; ++// ++// _outStream << "\n "; ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "lightSpacePos" << i << ", "; ++// ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << "\n "; ++// ++// for (Ogre::uint i = 0; i < numTextures; ++i) ++// _outStream << "inverseShadowmapSize" << i << ", "; ++// } ++// _outStream << "\n" << ++// " pssmSplitPoints, camDepth);\n"; ++// } ++// else ++// { ++// if (_prof->getReceiveDynamicShadowsDepth()) ++// { ++// _outStream << ++// " float rtshadow = calcDepthShadow(shadowMap0, lightSpacePos0, " ++// "inverseShadowmapSize0);"; ++// } ++// else ++// { ++// _outStream << ++// " float rtshadow = calcSimpleShadow(shadowMap0, lightSpacePos0);"; ++// } ++// } ++// ++// _outStream << " shadow = rtshadow;//min(shadow, rtshadow);\n"; ++// } ++// ++// ///////////////////////////////////////////////// ++// void ++// GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::generateFragmentProgramSource( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// this->generateFpHeader(_prof, _terrain, _tt, _outStream); ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); ++// Ogre::uint numLayers = std::min(maxLayers, ++// static_cast<Ogre::uint>(_terrain->getLayerCount())); ++// ++// for (Ogre::uint i = 0; i < numLayers; ++i) ++// this->generateFpLayer(_prof, _terrain, _tt, i, _outStream); ++// } ++// ++// this->generateFpFooter(_prof, _terrain, _tt, _outStream); ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::updateVpParams( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// Ogre::TechniqueType _tt, ++// #else ++// Ogre::TechniqueType /*_tt*/, ++// #endif ++// const Ogre::GpuProgramParametersSharedPtr &_params) ++// { ++// _params->setIgnoreMissingParams(true); ++// Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); ++// Ogre::uint numLayers = std::min(maxLayers, ++// static_cast<Ogre::uint>(_terrain->getLayerCount())); ++// ++// Ogre::uint numUVMul = numLayers / 4; ++// ++// if (numLayers % 4) ++// ++numUVMul; ++// ++// for (Ogre::uint i = 0; i < numUVMul; ++i) ++// { ++// Ogre::Vector4 uvMul( ++// _terrain->getLayerUVMultiplier(i * 4), ++// _terrain->getLayerUVMultiplier(i * 4 + 1), ++// _terrain->getLayerUVMultiplier(i * 4 + 2), ++// _terrain->getLayerUVMultiplier(i * 4 + 3)); ++// _params->setNamedConstant("uvMul" + ++// Ogre::StringConverter::toString(i), uvMul); ++// } ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// if (_terrain->_getUseVertexCompression() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// Ogre::Real baseUVScale = 1.0f / (_terrain->getSize() - 1); ++// _params->setNamedConstant("baseUVScale", baseUVScale); ++// } ++// #endif ++// } ++// ++// ///////////////////////////////////////////////// ++// Ogre::String GzTerrainMatGen::SM2Profile::ShaderHelperGLSL::GetChannel( ++// Ogre::uint _idx) ++// { ++// Ogre::uint rem = _idx % 4; ++// switch (rem) ++// { ++// case 0: ++// default: ++// return "x"; ++// case 1: ++// return "y"; ++// case 2: ++// return "z"; ++// case 3: ++// return "w"; ++// }; ++// } ++// ++// ///////////////////////////////////////////////// ++// ///////////////////////////////////////////////// ++// // CG Shader helper ++// ///////////////////////////////////////////////// ++// ///////////////////////////////////////////////// ++// ++// ///////////////////////////////////////////////// ++// Ogre::HighLevelGpuProgramPtr ++// GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVertexProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt) ++// { ++// Ogre::HighLevelGpuProgramPtr ret = ++// this->createVertexProgram(_prof, _terrain, _tt); ++// ++// Ogre::StringStream sourceStr; ++// this->generateVertexProgramSource(_prof, _terrain, _tt, sourceStr); ++// ++// ret->setSource(sourceStr.str()); ++// ret->load(); ++// this->defaultVpParams(_prof, _terrain, _tt, ret); ++// ++// return ret; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperCg::defaultVpParams( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, const Ogre::HighLevelGpuProgramPtr &_prog) ++// { ++// Ogre::GpuProgramParametersSharedPtr params = _prog->getDefaultParameters(); ++// params->setIgnoreMissingParams(true); ++// ++// params->setNamedAutoConstant("worldMatrix", ++// Ogre::GpuProgramParameters::ACT_WORLD_MATRIX); ++// ++// params->setNamedAutoConstant("viewProjMatrix", ++// Ogre::GpuProgramParameters::ACT_VIEWPROJ_MATRIX); ++// ++// params->setNamedAutoConstant("lodMorph", ++// Ogre::GpuProgramParameters::ACT_CUSTOM, ++// Ogre::Terrain::LOD_MORPH_CUSTOM_PARAM); ++// ++// params->setNamedAutoConstant("fogParams", ++// Ogre::GpuProgramParameters::ACT_FOG_PARAMS); ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// unsigned int numTextures = 1; ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// params->setNamedAutoConstant("texViewProjMatrix" + ++// Ogre::StringConverter::toString(i), ++// Ogre::GpuProgramParameters::ACT_TEXTURE_VIEWPROJ_MATRIX, i); ++// ++// // Don't add depth range params ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // params->setNamedAutoConstant("depthRange" + ++// // Ogre::StringConverter::toString(i), ++// // Ogre::GpuProgramParameters::ACT_SHADOW_SCENE_DEPTH_RANGE, i); ++// // } ++// } ++// } ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// if (_terrain->_getUseVertexCompression() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// Ogre::Matrix4 posIndexToObjectSpace; ++// _terrain->getPointTransform(&posIndexToObjectSpace); ++// params->setNamedConstant("posIndexToObjectSpace", posIndexToObjectSpace); ++// } ++// #endif ++// } ++// ++// ///////////////////////////////////////////////// ++// void ++// GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpDynamicShadows( ++// const SM2Profile *_prof, const Ogre::Terrain * /*_terrain*/, ++// Ogre::TechniqueType /*_tt*/, Ogre::StringStream &_outStream) ++// { ++// unsigned int numTextures = 1; ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// ++// // Calculate the position of vertex in light space ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// _outStream << " oLightSpacePos" << i << " = mul(texViewProjMatrix" ++// << i << ", worldPos);\n"; ++// ++// // Don't linearize depth range: RTSS PSSM implementation uses ++// // view-space depth ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // // make linear ++// // outStream << "oLightSpacePos" << i << ".z = (oLightSpacePos" << i ++// // << ".z - depthRange" << i << ".x) * depthRange" << i ++// // << ".w;\n"; ++// // } ++// } ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// _outStream << " // pass cam depth\n oUVMisc.z = oPos.z;\n"; ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// unsigned int GzTerrainMatGen::SM2Profile::ShaderHelperCg:: ++// generateVpDynamicShadowsParams(unsigned int _texCoord, const SM2Profile *_prof, ++// const Ogre::Terrain * /*_terrain*/, Ogre::TechniqueType /*_tt*/, ++// Ogre::StringStream &_outStream) ++// { ++// // out semantics & params ++// unsigned int numTextures = 1; ++// ++// if (_prof->getReceiveDynamicShadowsPSSM()) ++// { ++// numTextures = _prof->getReceiveDynamicShadowsPSSM()->getSplitCount(); ++// } ++// ++// for (unsigned int i = 0; i < numTextures; ++i) ++// { ++// _outStream << ", out float4 oLightSpacePos" << i ++// << " : TEXCOORD" << _texCoord++ << "\n" ++// << ", uniform float4x4 texViewProjMatrix" << i << "\n"; ++// ++// // Don't add depth range params ++// // if (prof->getReceiveDynamicShadowsDepth()) ++// // { ++// // _outStream << ", uniform float4 depthRange" << i ++// // << " // x = min, y = max, z = range, w = 1/range\n"; ++// // } ++// } ++// ++// return _texCoord; ++// } ++// ++// ///////////////////////////////////////////////// ++// // This method is identical to ++// // TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg::generateVpHeader() ++// // but is needed because generateVpDynamicShadowsParams() is not declared ++// // virtual. ++// void GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpHeader( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// _outStream << "void main_vp(\n"; ++// ++// bool compression = false; ++// ++// #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 8 ++// compression = _terrain->_getUseVertexCompression() && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// #endif ++// ++// if (compression) ++// { ++// _outStream << "float2 posIndex : POSITION,\nfloat height : TEXCOORD0,\n"; ++// } ++// else ++// { ++// _outStream << "float4 pos : POSITION,\nfloat2 uv : TEXCOORD0,\n"; ++// } ++// ++// if (_tt != Ogre::RENDER_COMPOSITE_MAP) ++// _outStream << "float2 delta : TEXCOORD1,\n"; ++// ++// _outStream << ++// "uniform float4x4 worldMatrix,\n" ++// "uniform float4x4 viewProjMatrix,\n" ++// "uniform float2 lodMorph,\n"; ++// ++// if (compression) ++// { ++// _outStream << ++// "uniform float4x4 posIndexToObjectSpace,\n" ++// "uniform float baseUVScale,\n"; ++// } ++// ++// // uv multipliers ++// Ogre::uint maxLayers = _prof->getMaxLayers(_terrain); ++// Ogre::uint numLayers = std::min(maxLayers, ++// static_cast<unsigned int>(_terrain->getLayerCount())); ++// ++// unsigned int numUVMultipliers = (numLayers / 4); ++// ++// if (numLayers % 4) ++// ++numUVMultipliers; ++// ++// for (unsigned int i = 0; i < numUVMultipliers; ++i) ++// _outStream << "uniform float4 uvMul" << i << ",\n"; ++// ++// _outStream << ++// "out float4 oPos : POSITION,\n" ++// "out float4 oPosObj : TEXCOORD0\n"; ++// ++// unsigned int texCoordSet = 1; ++// _outStream << ", out float4 oUVMisc : TEXCOORD" << texCoordSet++ ++// << " // xy = uv, z = camDepth\n"; ++// ++// // layer UV's premultiplied, packed as xy/zw ++// unsigned int numUVSets = numLayers / 2; ++// ++// if (numLayers % 2) ++// ++numUVSets; ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// for (unsigned int i = 0; i < numUVSets; ++i) ++// { ++// _outStream << ", out float4 oUV" << i ++// << " : TEXCOORD" << texCoordSet++ << "\n"; ++// } ++// } ++// ++// if (_prof->getParent()->getDebugLevel() && _tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// _outStream << ", out float2 lodInfo : TEXCOORD" << texCoordSet++ << "\n"; ++// } ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// ++// if (fog) ++// { ++// _outStream << ++// ", uniform float4 fogParams\n" ++// ", out float fogVal : COLOR\n"; ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// { ++// texCoordSet = generateVpDynamicShadowsParams(texCoordSet, _prof, ++// _terrain, _tt, _outStream); ++// } ++// ++// // check we haven't exceeded texture coordinates ++// if (texCoordSet > 8) ++// { ++// OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS, ++// "Requested options require too many texture coordinate sets! " ++// "Try reducing the number of layers.", ++// __FUNCTION__); ++// } ++// ++// _outStream << ++// ")\n" ++// "{\n"; ++// ++// if (compression) ++// { ++// _outStream << " float4 pos;\n" ++// << " pos = mul(posIndexToObjectSpace, float4(posIndex, height, 1));\n" ++// << " float2 uv = float2(posIndex.x * baseUVScale, 1.0 - " ++// << "(posIndex.y * baseUVScale));\n"; ++// } ++// ++// _outStream << ++// " float4 worldPos = mul(worldMatrix, pos);\n" ++// " oPosObj = pos;\n"; ++// ++// if (_tt != Ogre::RENDER_COMPOSITE_MAP) ++// { ++// // determine whether to apply the LOD morph to this vertex ++// // we store the deltas against all vertices so we only want to apply ++// // the morph to the ones which would disappear. The target LOD which is ++// // being morphed to is stored in lodMorph.y, and the LOD at which ++// // the vertex should be morphed is stored in uv.w. If we subtract ++// // the former from the latter, and arrange to only morph if the ++// // result is negative (it will only be -1 in fact, since after that ++// // the vertex will never be indexed), we will achieve our aim. ++// // sign(vertexLOD - targetLOD) == -1 is to morph ++// _outStream << ++// " float toMorph = -min(0, sign(delta.y - lodMorph.y));\n"; ++// ++// // this will either be 1 (morph) or 0 (don't morph) ++// if (_prof->getParent()->getDebugLevel()) ++// { ++// // x == LOD level (-1 since value is target level, we want to ++// // display actual) ++// _outStream << "lodInfo.x = (lodMorph.y - 1) / " ++// << _terrain->getNumLodLevels() << ";\n"; ++// ++// // y == LOD morph ++// _outStream << "lodInfo.y = toMorph * lodMorph.x;\n"; ++// } ++// ++// // morph ++// switch (_terrain->getAlignment()) ++// { ++// case Ogre::Terrain::ALIGN_X_Y: ++// _outStream << " worldPos.z += delta.x * toMorph * lodMorph.x;\n"; ++// break; ++// case Ogre::Terrain::ALIGN_X_Z: ++// _outStream << " worldPos.y += delta.x * toMorph * lodMorph.x;\n"; ++// break; ++// case Ogre::Terrain::ALIGN_Y_Z: ++// _outStream << " worldPos.x += delta.x * toMorph * lodMorph.x;\n"; ++// break; ++// default: ++// gzerr << "Invalid alignment\n"; ++// }; ++// } ++// ++// // generate UVs ++// if (_tt != Ogre::LOW_LOD) ++// { ++// for (unsigned int i = 0; i < numUVSets; ++i) ++// { ++// unsigned int layer = i * 2; ++// unsigned int uvMulIdx = layer / 4; ++// ++// _outStream << " oUV" << i << ".xy = " << " uv.xy * uvMul" ++// << uvMulIdx << "." << getChannel(layer) << ";\n"; ++// _outStream << " oUV" << i << ".zw = " << " uv.xy * uvMul" ++// << uvMulIdx << "." << getChannel(layer+1) << ";\n"; ++// } ++// } ++// } ++// ++// ///////////////////////////////////////////////// ++// // This method is identical to ++// // TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg::generateVpFooter() ++// // but is needed because generateVpDynamicShadows() is not declared virtual. ++// void GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateVpFooter( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, Ogre::StringStream &_outStream) ++// { ++// _outStream << " oPos = mul(viewProjMatrix, worldPos);\n" ++// << " oUVMisc.xy = uv.xy;\n"; ++// ++// bool fog = _terrain->getSceneManager()->getFogMode() != Ogre::FOG_NONE && ++// _tt != Ogre::RENDER_COMPOSITE_MAP; ++// if (fog) ++// { ++// if (_terrain->getSceneManager()->getFogMode() == Ogre::FOG_LINEAR) ++// { ++// _outStream << ++// " fogVal = saturate((oPos.z - fogParams.y) * fogParams.w);\n"; ++// } ++// else ++// { ++// _outStream << ++// " fogVal = 1 - saturate(1 / (exp(oPos.z * fogParams.x)));\n"; ++// } ++// } ++// ++// if (_prof->isShadowingEnabled(_tt, _terrain)) ++// this->generateVpDynamicShadows(_prof, _terrain, _tt, _outStream); ++// ++// _outStream << "}\n"; ++// } ++// ++// ///////////////////////////////////////////////// ++// void GzTerrainMatGen::SM2Profile::ShaderHelperCg:: ++// generateVertexProgramSource(const SM2Profile *_prof, ++// const Ogre::Terrain* _terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream) ++// { ++// this->generateVpHeader(_prof, _terrain, _tt, _outStream); ++// ++// if (_tt != Ogre::LOW_LOD) ++// { ++// unsigned int maxLayers = _prof->getMaxLayers(_terrain); ++// unsigned int numLayers = std::min(maxLayers, ++// static_cast<unsigned int>(_terrain->getLayerCount())); ++// ++// for (unsigned int i = 0; i < numLayers; ++i) ++// this->generateVpLayer(_prof, _terrain, _tt, i, _outStream); ++// } ++// ++// this->generateVpFooter(_prof, _terrain, _tt, _outStream); ++// } ++// ++// ///////////////////////////////////////////////// ++// Ogre::HighLevelGpuProgramPtr ++// GzTerrainMatGen::SM2Profile::ShaderHelperCg::generateFragmentProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt) ++// { ++// Ogre::HighLevelGpuProgramPtr ret = this->createFragmentProgram(_prof, ++// _terrain, _tt); ++// ++// Ogre::StringStream sourceStr; ++// ++// this->generateFragmentProgramSource(_prof, _terrain, _tt, sourceStr); ++// ++// ret->setSource(sourceStr.str()); ++// ++// ret->load(); ++// ++// this->defaultFpParams(_prof, _terrain, _tt, ret); ++// ++// return ret; ++// } + + ///////////////////////////////////////////////// + ///////////////////////////////////////////////// +diff -ruN original/gazebo-9.0.0/gazebo/rendering/HeightmapPrivate.hh patched/gazebo-9.0.0/gazebo/rendering/HeightmapPrivate.hh +--- original/gazebo-9.0.0/gazebo/rendering/HeightmapPrivate.hh 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/HeightmapPrivate.hh 2018-06-02 22:56:03.580661743 +0200 +@@ -25,6 +25,9 @@ + + #include "gazebo/rendering/RenderTypes.hh" + ++// ogre 1.11 fix ++// #include "deps/ogre111/OgreTerrainMaterialShaderHelpers.h" ++ + namespace Ogre + { + class PageManager; +@@ -56,183 +59,184 @@ + /// \brief Destructor + public: virtual ~GzTerrainMatGen(); + +- /// \brief Shader model 2 profile target. +- public: class SM2Profile : +- public Ogre::TerrainMaterialGeneratorA::SM2Profile +- { +- /// \brief Constructor +- public: SM2Profile(Ogre::TerrainMaterialGenerator *_parent, +- const Ogre::String &_name, const Ogre::String &_desc); +- +- /// \brief Destructor +- public: virtual ~SM2Profile(); +- +- public: Ogre::MaterialPtr generate(const Ogre::Terrain *_terrain); +- +- public: Ogre::MaterialPtr generateForCompositeMap( +- const Ogre::Terrain *_terrain); +- +- public: void UpdateParams(const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain); +- +- public: void UpdateParamsForCompositeMap(const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain); +- +- protected: virtual void addTechnique(const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain, TechniqueType _tt); +- +-#ifdef __clang__ +-#pragma clang diagnostic push +-#pragma clang diagnostic ignored "-Woverloaded-virtual" +-#endif // ifdef __clang__ +- /// \brief Utility class to help with generating shaders for GLSL. +- /// The class contains a collection of functions that are used to +- /// dynamically generate a complete vertex or fragment shader program +- /// in a string format. +- protected: class ShaderHelperGLSL : +- public Ogre::TerrainMaterialGeneratorA::SM2Profile::ShaderHelperGLSL +- { +- public: virtual Ogre::HighLevelGpuProgramPtr generateVertexProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt); +- +- public: virtual Ogre::HighLevelGpuProgramPtr generateFragmentProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt); +- +- public: virtual void updateParams(const SM2Profile *_prof, +- const Ogre::MaterialPtr &_mat, +- const Ogre::Terrain *_terrain, bool _compositeMap); +- +- protected: virtual void generateVpHeader(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVpFooter(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVertexProgramSource( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void defaultVpParams(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- const Ogre::HighLevelGpuProgramPtr &_prog); +- +- protected: virtual unsigned int generateVpDynamicShadowsParams( +- unsigned int _texCoordStart, const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVpDynamicShadows( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFpHeader(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, +- TechniqueType tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFpLayer(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType tt, +- Ogre::uint _layer, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFpFooter(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, +- TechniqueType tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFpDynamicShadowsParams( +- Ogre::uint *_texCoord, Ogre::uint *_sampler, +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFpDynamicShadowsHelpers( +- const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, +- TechniqueType tt, +- Ogre::StringStream &_outStream); +- +- protected: void generateFpDynamicShadows(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateFragmentProgramSource( +- const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void updateVpParams(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- const Ogre::GpuProgramParametersSharedPtr &_params); +- +- private: Ogre::String GetChannel(Ogre::uint _idx); +- }; +- +- // Needed to allow access from ShaderHelperGLSL to protected members +- // of SM2Profile. +- friend ShaderHelperGLSL; +- +- /// Keeping the CG shader for reference. +- /// \brief Utility class to help with generating shaders for Cg / HLSL. +- /// Original implementation from Ogre that generates Cg shaders +- protected: class ShaderHelperCg : +- public Ogre::TerrainMaterialGeneratorA::SM2Profile::ShaderHelperCg +- { +- public: virtual Ogre::HighLevelGpuProgramPtr generateFragmentProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt); +- +- public: virtual Ogre::HighLevelGpuProgramPtr generateVertexProgram( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt); +- +- protected: virtual void generateVpHeader(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVpFooter(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVertexProgramSource( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void defaultVpParams(const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- const Ogre::HighLevelGpuProgramPtr &_prog); +- +- protected: virtual unsigned int generateVpDynamicShadowsParams( +- unsigned int _texCoordStart, const SM2Profile *_prof, +- const Ogre::Terrain *_terrain, TechniqueType _tt, +- Ogre::StringStream &_outStream); +- +- protected: virtual void generateVpDynamicShadows( +- const SM2Profile *_prof, const Ogre::Terrain *_terrain, +- TechniqueType _tt, +- Ogre::StringStream &_outStream); +- }; +- +- // Needed to allow access from ShaderHelperCg to protected members +- // of SM2Profile. +- friend ShaderHelperCg; +- +-#ifdef __clang__ +-#pragma clang diagnostic pop +- +-// ifdef __clang__ +-#endif +- }; ++// /// \brief Shader model 2 profile target. ++// public: class SM2Profile : ++// public Ogre::TerrainMaterialGeneratorA::SM2Profile ++// { ++// /// \brief Constructor ++// public: SM2Profile(Ogre::TerrainMaterialGenerator *_parent, ++// const Ogre::String &_name, const Ogre::String &_desc); ++// ++// /// \brief Destructor ++// public: virtual ~SM2Profile(); ++// ++// public: Ogre::MaterialPtr generate(const Ogre::Terrain *_terrain); ++// ++// public: Ogre::MaterialPtr generateForCompositeMap( ++// const Ogre::Terrain *_terrain); ++// ++// public: void UpdateParams(const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain); ++// ++// public: void UpdateParamsForCompositeMap(const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain); ++// ++// protected: virtual void addTechnique(const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt); ++// ++// #ifdef __clang__ ++// #pragma clang diagnostic push ++// #pragma clang diagnostic ignored "-Woverloaded-virtual" ++// #endif // ifdef __clang__ ++// /// \brief Utility class to help with generating shaders for GLSL. ++// /// The class contains a collection of functions that are used to ++// /// dynamically generate a complete vertex or fragment shader program ++// /// in a string format. ++// protected: class ShaderHelperGLSL : ++// public Ogre::ShaderHelperGLSL ++// { ++// public: virtual Ogre::HighLevelGpuProgramPtr generateVertexProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt); ++// ++// public: virtual Ogre::HighLevelGpuProgramPtr generateFragmentProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt); ++// ++// public: virtual void updateParams(const SM2Profile *_prof, ++// const Ogre::MaterialPtr &_mat, ++// const Ogre::Terrain *_terrain, bool _compositeMap); ++// ++// protected: virtual void generateVpHeader(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVpFooter(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVertexProgramSource( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void defaultVpParams(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// const Ogre::HighLevelGpuProgramPtr &_prog); ++// ++// protected: virtual unsigned int generateVpDynamicShadowsParams( ++// unsigned int _texCoordStart, const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVpDynamicShadows( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFpHeader(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFpLayer(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType tt, ++// Ogre::uint _layer, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFpFooter(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFpDynamicShadowsParams( ++// Ogre::uint *_texCoord, Ogre::uint *_sampler, ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFpDynamicShadowsHelpers( ++// const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: void generateFpDynamicShadows(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateFragmentProgramSource( ++// const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void updateVpParams(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// const Ogre::GpuProgramParametersSharedPtr &_params); ++// ++// private: Ogre::String GetChannel(Ogre::uint _idx); ++// }; ++// ++// // Needed to allow access from ShaderHelperGLSL to protected members ++// // of SM2Profile. ++// friend ShaderHelperGLSL; ++// ++// /// Keeping the CG shader for reference. ++// /// \brief Utility class to help with generating shaders for Cg / HLSL. ++// /// Original implementation from Ogre that generates Cg shaders ++// protected: class ShaderHelperCg : ++// public Ogre::ShaderHelperCg ++// { ++// public: virtual Ogre::HighLevelGpuProgramPtr generateFragmentProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt); ++// ++// public: virtual Ogre::HighLevelGpuProgramPtr generateVertexProgram( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt); ++// ++// protected: virtual void generateVpHeader(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVpFooter(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVertexProgramSource( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void defaultVpParams(const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// const Ogre::HighLevelGpuProgramPtr &_prog); ++// ++// protected: virtual unsigned int generateVpDynamicShadowsParams( ++// unsigned int _texCoordStart, const SM2Profile *_prof, ++// const Ogre::Terrain *_terrain, Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// ++// protected: virtual void generateVpDynamicShadows( ++// const SM2Profile *_prof, const Ogre::Terrain *_terrain, ++// Ogre::TechniqueType _tt, ++// Ogre::StringStream &_outStream); ++// }; ++// ++// // Needed to allow access from ShaderHelperCg to protected members ++// // of SM2Profile. ++// friend ShaderHelperCg; ++// ++// #ifdef __clang__ ++// #pragma clang diagnostic pop ++// ++// // ifdef __clang__ ++// #endif ++// }; + }; + ++ + /// \internal + /// \brief Custom terrain material generator. + /// A custom material generator that lets user specify their own material +diff -ruN original/gazebo-9.0.0/gazebo/rendering/InertiaVisual.cc patched/gazebo-9.0.0/gazebo/rendering/InertiaVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/InertiaVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/InertiaVisual.cc 2018-06-02 18:58:05.734368911 +0200 +@@ -104,7 +104,7 @@ + p6 += _pose.Pos(); + + dPtr->crossLines = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST); +- dPtr->crossLines->setMaterial("Gazebo/Green"); ++ dPtr->crossLines->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/Green")); + dPtr->crossLines->AddPoint(p1); + dPtr->crossLines->AddPoint(p2); + dPtr->crossLines->AddPoint(p3); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/LaserVisual.cc patched/gazebo-9.0.0/gazebo/rendering/LaserVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/LaserVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/LaserVisual.cc 2018-06-02 19:04:35.671943290 +0200 +@@ -132,25 +132,25 @@ + // intersected an object. + dPtr->rayStrips.push_back( + this->CreateDynamicLine(rendering::RENDERING_TRIANGLE_STRIP)); +- dPtr->rayStrips[j]->setMaterial("Gazebo/BlueLaser"); ++ dPtr->rayStrips[j]->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/BlueLaser")); + + // No hit ray strips fill in-between the ray lines in areas that have + // not intersected an object. + dPtr->noHitRayStrips.push_back( + this->CreateDynamicLine(rendering::RENDERING_TRIANGLE_STRIP)); +- dPtr->noHitRayStrips[j]->setMaterial("Gazebo/LightBlueLaser"); ++ dPtr->noHitRayStrips[j]->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/LightBlueLaser")); + + // Deadzone ray fans display areas that are between the sensor's origin + // and start of the rays. + dPtr->deadzoneRayFans.push_back( + this->CreateDynamicLine(rendering::RENDERING_TRIANGLE_FAN)); +- dPtr->deadzoneRayFans[j]->setMaterial("Gazebo/BlackTransparent"); ++ dPtr->deadzoneRayFans[j]->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/BlackTransparent")); + dPtr->deadzoneRayFans[j]->AddPoint(ignition::math::Vector3d(0, 0, 0)); + + // Individual ray lines + dPtr->rayLines.push_back( + this->CreateDynamicLine(rendering::RENDERING_LINE_LIST)); +- dPtr->rayLines[j]->setMaterial("Gazebo/BlueLaser"); ++ dPtr->rayLines[j]->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/BlueLaser")); + + this->SetVisibilityFlags(GZ_VISIBILITY_GUI); + } +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Light.cc patched/gazebo-9.0.0/gazebo/rendering/Light.cc +--- original/gazebo-9.0.0/gazebo/rendering/Light.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Light.cc 2018-06-02 19:11:18.886907076 +0200 +@@ -208,7 +208,7 @@ + this->dataPtr->line = + this->dataPtr->visual->CreateDynamicLine(RENDERING_LINE_LIST); + +- this->dataPtr->line->setMaterial("Gazebo/LightOn"); ++ this->dataPtr->line->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/LightOn")); + + this->dataPtr->line->setVisibilityFlags(GZ_VISIBILITY_GUI); + +@@ -383,9 +383,9 @@ + if (this->dataPtr->light->getType() != Ogre::Light::LT_DIRECTIONAL) + { + if (_s) +- this->dataPtr->line->setMaterial("Gazebo/PurpleGlow"); ++ this->dataPtr->line->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/PurpleGlow")); + else +- this->dataPtr->line->setMaterial("Gazebo/LightOn"); ++ this->dataPtr->line->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/LightOn")); + } + + return true; +diff -ruN original/gazebo-9.0.0/gazebo/rendering/LogicalCameraVisual.cc patched/gazebo-9.0.0/gazebo/rendering/LogicalCameraVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/LogicalCameraVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/LogicalCameraVisual.cc 2018-06-02 19:11:04.733623728 +0200 +@@ -117,7 +117,7 @@ + line->AddPoint(ignition::math::Vector3d( + _msg.far_clip(), farWidth, -farHeight)); + +- line->setMaterial("Gazebo/WhiteGlow"); ++ line->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/WhiteGlow")); + line->setVisibilityFlags(GZ_VISIBILITY_GUI); + + // Draw green lines from the near clipping plane to the origin +@@ -138,7 +138,7 @@ + sourceLine->AddPoint(ignition::math::Vector3d( + _msg.near_clip(), nearWidth, -nearHeight)); + +- sourceLine->setMaterial("Gazebo/PurpleGlow"); ++ sourceLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/PurpleGlow")); + sourceLine->setVisibilityFlags(GZ_VISIBILITY_GUI); + + this->SetVisibilityFlags(GZ_VISIBILITY_GUI); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/ogre_gazebo.h patched/gazebo-9.0.0/gazebo/rendering/ogre_gazebo.h +--- original/gazebo-9.0.0/gazebo/rendering/ogre_gazebo.h 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/ogre_gazebo.h 2018-06-02 22:02:45.233964005 +0200 +@@ -31,7 +31,7 @@ + #include <OGRE/OgrePlugin.h> + #include <OGRE/OgreDataStream.h> + #include <OGRE/OgreLogManager.h> +-#include <OGRE/OgreWindowEventUtilities.h> ++#include <OGRE/Bites/OgreWindowEventUtilities.h> + #include <OGRE/OgreSceneQuery.h> + #include <OGRE/OgreRoot.h> + #include <OGRE/OgreSceneManager.h> +diff -ruN original/gazebo-9.0.0/gazebo/rendering/OriginVisual.cc patched/gazebo-9.0.0/gazebo/rendering/OriginVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/OriginVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/OriginVisual.cc 2018-06-02 21:18:02.414946952 +0200 +@@ -54,19 +54,19 @@ + + dPtr->xLine = this->CreateDynamicLine( + rendering::RENDERING_LINE_LIST); +- dPtr->xLine->setMaterial("Gazebo/Red"); ++ dPtr->xLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/Red")); + dPtr->xLine->AddPoint(ignition::math::Vector3d::Zero); + dPtr->xLine->AddPoint(ignition::math::Vector3d::UnitX*dPtr->length); + + dPtr->yLine = this->CreateDynamicLine( + rendering::RENDERING_LINE_LIST); +- dPtr->yLine->setMaterial("Gazebo/Green"); ++ dPtr->yLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/Green")); + dPtr->yLine->AddPoint(ignition::math::Vector3d::Zero); + dPtr->yLine->AddPoint(ignition::math::Vector3d::UnitY*dPtr->length); + + dPtr->zLine = this->CreateDynamicLine( + rendering::RENDERING_LINE_LIST); +- dPtr->zLine->setMaterial("Gazebo/Blue"); ++ dPtr->zLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/Blue")); + dPtr->zLine->AddPoint(ignition::math::Vector3d::Zero); + dPtr->zLine->AddPoint(ignition::math::Vector3d::UnitZ*dPtr->length); + +diff -ruN original/gazebo-9.0.0/gazebo/rendering/RenderEngine.cc patched/gazebo-9.0.0/gazebo/rendering/RenderEngine.cc +--- original/gazebo-9.0.0/gazebo/rendering/RenderEngine.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/RenderEngine.cc 2018-06-02 21:21:19.426983596 +0200 +@@ -798,8 +798,10 @@ + + // int multiRenderTargetCount = capabilities->getNumMultiRenderTargets(); + +- bool hasFBO = +- capabilities->hasCapability(Ogre::RSC_FBO); ++ bool hasFBO = true; ++ // as of Ogre 1.10.12 (see documentation: deprecated list): ++ // »All targetted APIs by Ogre support this feature.« ++ // capabilities->hasCapability(Ogre::RSC_FBO); + + bool hasGLSL = + std::find(profiles.begin(), profiles.end(), "glsl") != profiles.end(); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/RTShaderSystem.cc patched/gazebo-9.0.0/gazebo/rendering/RTShaderSystem.cc +--- original/gazebo-9.0.0/gazebo/rendering/RTShaderSystem.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/RTShaderSystem.cc 2018-06-02 21:35:48.021180627 +0200 +@@ -270,7 +270,7 @@ + try + { + success = this->dataPtr->shaderGenerator->createShaderBasedTechnique( +- curMaterialName, ++ *Ogre::MaterialManager::getSingleton().getByName(curMaterialName), + Ogre::MaterialManager::DEFAULT_SCHEME_NAME, + this->dataPtr->scenes[s]->Name() + + Ogre::RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME); +@@ -295,7 +295,7 @@ + this->dataPtr->shaderGenerator->getRenderState( + this->dataPtr->scenes[s]->Name() + + Ogre::RTShader::ShaderGenerator::DEFAULT_SCHEME_NAME, +- curMaterialName, 0); ++ curMaterialName, curMaterial->getGroup(), 0); + + // Remove all sub render states. + renderState->reset(); +@@ -394,11 +394,11 @@ + for (; it != itEnd; ++it) + { + struct stat st; +- if (stat((*it)->archive->getName().c_str(), &st) == 0) ++ if (stat((*it).archive->getName().c_str(), &st) == 0) + { +- if ((*it)->archive->getName().find("rtshaderlib") != Ogre::String::npos) ++ if ((*it).archive->getName().find("rtshaderlib") != Ogre::String::npos) + { +- coreLibsPath = (*it)->archive->getName() + "/"; ++ coreLibsPath = (*it).archive->getName() + "/"; + + // setup patch name for rt shader cache in tmp + char *tmpdir; +@@ -537,7 +537,7 @@ + // OGRE samples. They should be compared and tested. + // Set up caster material - this is just a standard depth/shadow map caster + // sceneMgr->setShadowTextureCasterMaterial("PSSM/shadow_caster"); +- sceneMgr->setShadowTextureCasterMaterial("Gazebo/shadow_caster"); ++ sceneMgr->setShadowTextureCasterMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/shadow_caster")); + + // Disable fog on the caster pass. + // Ogre::MaterialPtr passCaterMaterial = +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Scene.cc patched/gazebo-9.0.0/gazebo/rendering/Scene.cc +--- original/gazebo-9.0.0/gazebo/rendering/Scene.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Scene.cc 2018-06-02 21:37:14.570872712 +0200 +@@ -3095,7 +3095,7 @@ + this->dataPtr->manager->setShadowTechnique( + Ogre::SHADOWTYPE_TEXTURE_ADDITIVE); + this->dataPtr->manager->setShadowTextureCasterMaterial( +- "DeferredRendering/Shadows/RSMCaster_Spot"); ++ Ogre::MaterialManager::getSingleton().getByName("DeferredRendering/Shadows/RSMCaster_Spot")); + this->dataPtr->manager->setShadowTextureCount(1); + this->dataPtr->manager->setShadowFarDistance(150); + // Use a value of "2" to use a different depth buffer pool and +diff -ruN original/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/DataManager.cpp patched/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/DataManager.cpp +--- original/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/DataManager.cpp 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/DataManager.cpp 2018-06-02 21:45:47.545276142 +0200 +@@ -682,7 +682,7 @@ + buffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); + const Ogre::PixelBox &pb = buffer->getCurrentLock(); + +- Ogre::uint32 *pbptr = static_cast < Ogre::uint32*>(pb.data); ++ Ogre::uint32 *pbptr = reinterpret_cast< Ogre::uint32*>(pb.data); + size_t x, y, z; + + for (z = pb.front; z < pb.back; z++) +diff -ruN original/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/LightningManager.cpp patched/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/LightningManager.cpp +--- original/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/LightningManager.cpp 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/skyx/src/VClouds/LightningManager.cpp 2018-06-02 21:46:43.111668253 +0200 +@@ -283,7 +283,7 @@ + if (k < mLightnings.size()) + { + pos = mVClouds->getGeometryManager()->getSceneNode()-> +- _getFullTransform().inverseAffine() * ++ _getFullTransform().inverse() * + mSceneNodes.at(k)->_getDerivedPosition(); + + mVolCloudsLightningMaterial-> +diff -ruN original/gazebo-9.0.0/gazebo/rendering/SonarVisual.cc patched/gazebo-9.0.0/gazebo/rendering/SonarVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/SonarVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/SonarVisual.cc 2018-06-02 21:15:41.675877345 +0200 +@@ -73,7 +73,7 @@ + reinterpret_cast<SonarVisualPrivate *>(this->dataPtr); + + dPtr->sonarRay = this->CreateDynamicLine(rendering::RENDERING_LINE_LIST); +- dPtr->sonarRay->setMaterial("Gazebo/RedGlow"); ++ dPtr->sonarRay->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/RedGlow")); + dPtr->sonarRay->AddPoint(0, 0, 0); + dPtr->sonarRay->AddPoint(0, 0, 0); + +diff -ruN original/gazebo-9.0.0/gazebo/rendering/TransmitterVisual.cc patched/gazebo-9.0.0/gazebo/rendering/TransmitterVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/TransmitterVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/TransmitterVisual.cc 2018-06-02 21:38:32.640571364 +0200 +@@ -75,7 +75,7 @@ + TransmitterVisualPrivate *dPtr = + reinterpret_cast<TransmitterVisualPrivate *>(this->dataPtr); + dPtr->points = this->CreateDynamicLine(rendering::RENDERING_POINT_LIST); +- dPtr->points->setMaterial("Gazebo/PointCloud"); ++ dPtr->points->setMaterial(Ogre::MaterialManager::getSingleton().getByName("Gazebo/PointCloud")); + } + + ///////////////////////////////////////////////// +diff -ruN original/gazebo-9.0.0/gazebo/rendering/Visual.cc patched/gazebo-9.0.0/gazebo/rendering/Visual.cc +--- original/gazebo-9.0.0/gazebo/rendering/Visual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/Visual.cc 2018-06-02 21:40:40.440038072 +0200 +@@ -1068,7 +1068,7 @@ + Ogre::SimpleRenderable *simpleRenderable = + dynamic_cast<Ogre::SimpleRenderable *>(obj); + if (simpleRenderable) +- simpleRenderable->setMaterial(this->dataPtr->myMaterialName); ++ simpleRenderable->setMaterial(Ogre::MaterialManager::getSingleton().getByName(this->dataPtr->myMaterialName)); + } + } + } +@@ -2134,7 +2134,7 @@ + transform[3][0] = transform[3][1] = transform[3][2] = 0; + transform[3][3] = 1; + // get oriented bounding box in object's local space +- bb.transformAffine(transform); ++ bb.transform(transform); + + min = Conversions::ConvertIgn(bb.getMinimum()); + max = Conversions::ConvertIgn(bb.getMaximum()); +diff -ruN original/gazebo-9.0.0/gazebo/rendering/WindowManager.cc patched/gazebo-9.0.0/gazebo/rendering/WindowManager.cc +--- original/gazebo-9.0.0/gazebo/rendering/WindowManager.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/WindowManager.cc 2018-06-02 21:44:19.255703696 +0200 +@@ -188,9 +188,8 @@ + + if (_windowId < this->dataPtr->windows.size()) + { +- float lastFPS, bestFPS, worstFPS = 0; +- this->dataPtr->windows[_windowId]->getStatistics( +- lastFPS, avgFPS, bestFPS, worstFPS); ++ auto stats = this->dataPtr->windows[_windowId]->getStatistics(); ++ avgFPS = stats.avgFPS; + } + + return avgFPS; +@@ -199,8 +198,10 @@ + ////////////////////////////////////////////////// + uint32_t WindowManager::TriangleCount(const uint32_t _windowId) const + { +- if (_windowId < this->dataPtr->windows.size()) +- return this->dataPtr->windows[_windowId]->getTriangleCount(); ++ if (_windowId < this->dataPtr->windows.size()) { ++ auto stats = this->dataPtr->windows[_windowId]->getStatistics(); ++ return stats.triangleCount; ++ } + else + return 0; + } +diff -ruN original/gazebo-9.0.0/gazebo/rendering/WireBox.cc patched/gazebo-9.0.0/gazebo/rendering/WireBox.cc +--- original/gazebo-9.0.0/gazebo/rendering/WireBox.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/WireBox.cc 2018-06-02 21:39:38.540302005 +0200 +@@ -28,7 +28,7 @@ + { + this->dataPtr->parent = _parent; + this->dataPtr->lines = new DynamicLines(RENDERING_LINE_LIST); +- this->dataPtr->lines->setMaterial("BaseWhiteNoLighting"); ++ this->dataPtr->lines->setMaterial(Ogre::MaterialManager::getSingleton().getByName("BaseWhiteNoLighting")); + this->dataPtr->parent->AttachObject(this->dataPtr->lines); + this->dataPtr->lines->setVisibilityFlags(GZ_VISIBILITY_GUI); + +diff -ruN original/gazebo-9.0.0/gazebo/rendering/WrenchVisual.cc patched/gazebo-9.0.0/gazebo/rendering/WrenchVisual.cc +--- original/gazebo-9.0.0/gazebo/rendering/WrenchVisual.cc 2018-01-25 23:25:48.000000000 +0100 ++++ patched/gazebo-9.0.0/gazebo/rendering/WrenchVisual.cc 2018-06-02 21:44:35.492292605 +0200 +@@ -150,7 +150,7 @@ + dPtr->forceLine = dPtr->forceVisual->CreateDynamicLine(RENDERING_LINE_LIST); + dPtr->forceLine->AddPoint(ignition::math::Vector3d::Zero); + dPtr->forceLine->AddPoint(ignition::math::Vector3d(0, 0, 0.1)); +- dPtr->forceLine->setMaterial("__GAZEBO_TRANS_PURPLE_MATERIAL__"); ++ dPtr->forceLine->setMaterial(Ogre::MaterialManager::getSingleton().getByName("__GAZEBO_TRANS_PURPLE_MATERIAL__")); + + this->SetVisibilityFlags(GZ_VISIBILITY_GUI); +
\ No newline at end of file |