Added support for boundary equalization to GeometryTechnique
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <osgTerrain/Terrain>
|
||||
#include <osgTerrain/GeometryTechnique>
|
||||
#include <osgUtil/UpdateVisitor>
|
||||
|
||||
#include <OpenThreads/ScopedLock>
|
||||
|
||||
@@ -24,6 +25,7 @@ Terrain::Terrain():
|
||||
_verticalScale(1.0),
|
||||
_blendingPolicy(TerrainTile::INHERIT)
|
||||
{
|
||||
setNumChildrenRequiringUpdateTraversal(1);
|
||||
_terrainTechnique = new GeometryTechnique;
|
||||
}
|
||||
|
||||
@@ -34,6 +36,7 @@ Terrain::Terrain(const Terrain& ts, const osg::CopyOp& copyop):
|
||||
_blendingPolicy(ts._blendingPolicy),
|
||||
_terrainTechnique(ts._terrainTechnique)
|
||||
{
|
||||
setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,13 +57,40 @@ Terrain::~Terrain()
|
||||
|
||||
void Terrain::traverse(osg::NodeVisitor& nv)
|
||||
{
|
||||
if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR)
|
||||
{
|
||||
// need to check if any TerrainTechniques need to have their update called on them.
|
||||
osgUtil::UpdateVisitor* uv = dynamic_cast<osgUtil::UpdateVisitor*>(&nv);
|
||||
if (uv)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
||||
for(TerrainTileSet::iterator itr = _updateTerrainTileSet.begin();
|
||||
itr != _updateTerrainTileSet.end();
|
||||
++itr)
|
||||
{
|
||||
TerrainTile* tile = *itr;
|
||||
if (tile->getTerrainTechnique()) tile->getTerrainTechnique()->update(uv);
|
||||
}
|
||||
_updateTerrainTileSet.clear();
|
||||
}
|
||||
}
|
||||
|
||||
Group::traverse(nv);
|
||||
}
|
||||
|
||||
void Terrain::updateTerrainTileOnNextFrame(TerrainTile* terrainTile)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
||||
_updateTerrainTileSet.insert(terrainTile);
|
||||
}
|
||||
|
||||
|
||||
TerrainTile* Terrain::getTile(const TileID& tileID)
|
||||
{
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
||||
|
||||
// OSG_NOTICE<<"Terrain::getTile("<<tileID.level<<", "<<tileID.x<<", "<<tileID.y<<")"<<std::endl;
|
||||
|
||||
TerrainTileMap::iterator itr = _terrainTileMap.find(tileID);
|
||||
if (itr == _terrainTileMap.end()) return 0;
|
||||
|
||||
@@ -95,17 +125,18 @@ void Terrain::registerTerrainTile(TerrainTile* tile)
|
||||
if (!tile) return;
|
||||
|
||||
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
|
||||
|
||||
|
||||
if (tile->getTileID().valid())
|
||||
{
|
||||
_terrainTileMap[tile->getTileID()] = tile;
|
||||
}
|
||||
|
||||
|
||||
_terrainTileSet.insert(tile);
|
||||
|
||||
if (_terrainTileSet.size() > s_maxNumTiles) s_maxNumTiles = _terrainTileSet.size();
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Terrain::registerTerrainTile "<<tile<<" total number of tile "<<_terrainTileSet.size()<<" max = "<<s_maxNumTiles<<std::endl;
|
||||
// OSG_NOTICE<<"Terrain::registerTerrainTile "<<tile<<" total number of tile "<<_terrainTileSet.size()<<" max = "<<s_maxNumTiles<<std::endl;
|
||||
// OSG_NOTICE<<" tileID("<<tile->getTileID().level<<", "<<tile->getTileID().x<<", "<<tile->getTileID().y<<")"<<std::endl;
|
||||
}
|
||||
|
||||
void Terrain::unregisterTerrainTile(TerrainTile* tile)
|
||||
@@ -120,6 +151,7 @@ void Terrain::unregisterTerrainTile(TerrainTile* tile)
|
||||
}
|
||||
|
||||
_terrainTileSet.erase(tile);
|
||||
_updateTerrainTileSet.erase(tile);
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Terrain::unregisterTerrainTile "<<tile<<" total number of tile "<<_terrainTileSet.size()<<" max = "<<s_maxNumTiles<<std::endl;
|
||||
// OSG_NOTICE<<"Terrain::unregisterTerrainTile "<<tile<<" total number of tile "<<_terrainTileSet.size()<<" max = "<<s_maxNumTiles<<std::endl;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user