From 234bfeb6489b673b3894bcabac919dc27d1c40d2 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 22 Apr 2008 11:39:47 +0000 Subject: [PATCH] Removed hardware down sampling hack from GeoemtryTechnique and replaced with Terrain::g/setSampleRatio() usage. --- .../osgmultitexturecontrol/osgmultitexturecontrol.cpp | 1 + include/osgTerrain/Terrain | 11 ++++++++++- src/osgTerrain/GeometryTechnique.cpp | 11 +++++++---- src/osgTerrain/Terrain.cpp | 6 ++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp index 5ed8e720d..10574a4b8 100644 --- a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp +++ b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp @@ -259,6 +259,7 @@ int main( int argc, char **argv ) { terrain = new osgTerrain::Terrain; terrain->addChild(rootnode); + terrain->setSampleRatio(0.25f); rootnode = terrain; } diff --git a/include/osgTerrain/Terrain b/include/osgTerrain/Terrain index e30888d21..8374161ba 100644 --- a/include/osgTerrain/Terrain +++ b/include/osgTerrain/Terrain @@ -36,6 +36,14 @@ class OSGTERRAIN_EXPORT Terrain : public osg::Group virtual void traverse(osg::NodeVisitor& nv); + /** Set the sample ratio hint that TerrainTile should use when building geometry. + * Defaults to 1.0, which means use all original sample points.*/ + void setSampleRatio(float ratio) { _sampleRatio = ratio; } + + /** Get the sample ratio hint.*/ + float getSampleRatio() const { return _sampleRatio; } + + /** Get the TerrainTile for a given TileID.*/ TerrainTile* getTile(const TileID& tileID); @@ -54,10 +62,11 @@ class OSGTERRAIN_EXPORT Terrain : public osg::Group typedef std::map< TileID, TerrainTile* > TerrainTileMap; typedef std::set< TerrainTile* > TerrainTileSet; + float _sampleRatio; + mutable OpenThreads::Mutex _mutex; TerrainTileSet _terrainTileSet; TerrainTileMap _terrainTileMap; - }; diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 21b5ea50b..0b837b8f4 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -13,6 +13,7 @@ #include #include +#include #include @@ -228,23 +229,25 @@ void GeometryTechnique::generateGeometry(Locator* masterLocator, const osg::Vec3 numRows = elevationLayer->getNumRows(); } + float sampleRatio = _terrainTile->getTerrain() ? _terrainTile->getTerrain()->getSampleRatio() : 1.0f; double i_sampleFactor = 1.0; double j_sampleFactor = 1.0; - unsigned int targetSize = 32; - if (numColumns==64 && numColumns>targetSize) + if (sampleRatio!=1.0f) { + unsigned int originalNumColumns = numColumns; unsigned int originalNumRows = numRows; - numColumns = targetSize; - numRows = targetSize; + numColumns = std::max((unsigned int) (float(originalNumColumns)*sqrtf(sampleRatio)), 4u); + numRows = std::max((unsigned int) (float(originalNumRows)*sqrtf(sampleRatio)),4u); i_sampleFactor = double(originalNumColumns-1)/double(numColumns-1); j_sampleFactor = double(originalNumRows-1)/double(numRows-1); } + bool treatBoundariesToValidDataAsDefaultValue = _terrainTile->getTreatBoundariesToValidDataAsDefaultValue(); osg::notify(osg::INFO)<<"TreatBoundariesToValidDataAsDefaultValue="<