Added support for boundary equalization to GeometryTechnique

This commit is contained in:
Robert Osfield
2010-04-01 21:06:56 +00:00
parent 15afc29018
commit a8bbf0a809
12 changed files with 927 additions and 284 deletions

View File

@@ -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;
}