diff --git a/src/osgPlugins/osgTerrain/CMakeLists.txt b/src/osgPlugins/osgTerrain/CMakeLists.txt index c3d75ad53..7bf08a745 100644 --- a/src/osgPlugins/osgTerrain/CMakeLists.txt +++ b/src/osgPlugins/osgTerrain/CMakeLists.txt @@ -3,6 +3,10 @@ SET(TARGET_SRC Locator.cpp + ImageLayer.cpp + HeightFieldLayer.cpp + CompositeLayer.cpp + Layer.cpp Terrain.cpp GeometryTechnique.cpp ReaderWriterOsgTerrain.cpp diff --git a/src/osgPlugins/osgTerrain/CompositeLayer.cpp b/src/osgPlugins/osgTerrain/CompositeLayer.cpp new file mode 100644 index 000000000..f234f7c0d --- /dev/null +++ b/src/osgPlugins/osgTerrain/CompositeLayer.cpp @@ -0,0 +1,134 @@ +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +bool CompositeLayer_readLocalData(osg::Object &obj, osgDB::Input &fr); +bool CompositeLayer_writeLocalData(const osg::Object &obj, osgDB::Output &fw); + +osgDB::RegisterDotOsgWrapperProxy CompositeLayer_Proxy +( + new osgTerrain::CompositeLayer, + "CompositeLayer", + "Object CompositeLayer Layer", + CompositeLayer_readLocalData, + CompositeLayer_writeLocalData +); + +bool CompositeLayer_readLocalData(osg::Object& obj, osgDB::Input &fr) +{ + osgTerrain::CompositeLayer& layer = static_cast(obj); + + bool itrAdvanced = false; + + osg::notify(osg::NOTICE)<<"Composite layer "< locator = 0; + + do + { + itrAdvanced = false; + + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + locator = dynamic_cast(readObject.get()); + if (readObject.valid()) itrAdvanced = true; + + osg::notify(osg::NOTICE)<<"Composite layer after locator read "< image = osgDB::readObjectFile(std::string(fr[1].getStr())+".gdal"); + osgTerrain::ProxyLayer* proxyLayer = dynamic_cast(image.get()); + if (proxyLayer) + { + if (locator.valid()) + { + proxyLayer->setLocator(locator.get()); + locator = 0; + } + + layer.addLayer(proxyLayer); + } + + fr += 2; + + itrAdvanced = true; + } + else + { + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Layer* readLayer = dynamic_cast(readObject.get()); + if (readLayer) + { + layer.addLayer(readLayer); + if (locator.valid()) + { + readLayer->setLocator(locator.get()); + locator = 0; + } + } + + if (readObject.valid()) itrAdvanced = true; + } + + } while (itrAdvanced); + + if (locator.valid()) layer.setLocator(locator.get()); + + return itrAdvanced; +} + +bool CompositeLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw) +{ + const osgTerrain::CompositeLayer& layer = static_cast(obj); + + for(unsigned int i=0; i(layer.getLayer(i)); + if (proxyLayer) + { + if (!proxyLayer->getFileName().empty()) + { + const osgTerrain::Locator* locator = proxyLayer->getLocator(); + if (locator && !locator->getDefinedInFile()) + { + fw.writeObject(*locator); + } + + fw.indent()<<"ProxyLayer "<getFileName()< + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +bool HeightFieldLayer_readLocalData(osg::Object &obj, osgDB::Input &fr); +bool HeightFieldLayer_writeLocalData(const osg::Object &obj, osgDB::Output &fw); + +osgDB::RegisterDotOsgWrapperProxy HeightFieldLayer_Proxy +( + new osgTerrain::HeightFieldLayer, + "HeightFieldLayer", + "Object HeightFieldLayer Layer", + HeightFieldLayer_readLocalData, + HeightFieldLayer_writeLocalData +); + +bool HeightFieldLayer_readLocalData(osg::Object& obj, osgDB::Input &fr) +{ + osgTerrain::HeightFieldLayer& layer = static_cast(obj); + + bool itrAdvanced = false; + + if (fr.matchSequence("file %w") || fr.matchSequence("file %s")) + { + osg::ref_ptr hf = osgDB::readHeightFieldFile(fr[1].getStr()); + if (hf.valid()) + { + layer.setHeightField(hf.get()); + } + + fr += 2; + itrAdvanced = true; + } + + + return itrAdvanced; +} + +bool HeightFieldLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw) +{ + const osgTerrain::HeightFieldLayer& layer = static_cast(obj); + + if (!layer.getFileName().empty()) + { + fw.indent()<<"file "< + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +bool ImageLayer_readLocalData(osg::Object &obj, osgDB::Input &fr); +bool ImageLayer_writeLocalData(const osg::Object &obj, osgDB::Output &fw); + +osgDB::RegisterDotOsgWrapperProxy ImageLayer_Proxy +( + new osgTerrain::ImageLayer, + "ImageLayer", + "Object ImageLayer Layer", + ImageLayer_readLocalData, + ImageLayer_writeLocalData +); + +bool ImageLayer_readLocalData(osg::Object& obj, osgDB::Input &fr) +{ + osgTerrain::ImageLayer& layer = static_cast(obj); + + bool itrAdvanced = false; + + if (fr.matchSequence("file %w") || fr.matchSequence("file %s")) + { + osg::ref_ptr image = osgDB::readImageFile(fr[1].getStr()); + if (image.valid()) + { + layer.setImage(image.get()); + } + + fr += 2; + itrAdvanced = true; + } + + + return itrAdvanced; +} + +bool ImageLayer_writeLocalData(const osg::Object& obj, osgDB::Output& fw) +{ + const osgTerrain::ImageLayer& layer = static_cast(obj); + + if (!layer.getFileName().empty()) + { + fw.indent()<<"file "< + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +bool Layer_readLocalData(osg::Object &obj, osgDB::Input &fr); +bool Layer_writeLocalData(const osg::Object &obj, osgDB::Output &fw); + +osgDB::RegisterDotOsgWrapperProxy Layer_Proxy +( + new osgTerrain::Layer, + "Layer", + "Object Layer", + Layer_readLocalData, + Layer_writeLocalData +); + +bool Layer_readLocalData(osg::Object& obj, osgDB::Input &fr) +{ + osgTerrain::Layer& layer = static_cast(obj); + + bool itrAdvanced = false; + + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Locator* locator = dynamic_cast(readObject.get()); + if (locator) layer.setLocator(locator); + + unsigned int minLevel=0; + if (fr.read("MinLevel",minLevel)) + { + itrAdvanced = true; + layer.setMinLevel(minLevel); + } + + unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS; + if (fr.read("MaxLevel",maxLevel)) + { + itrAdvanced = true; + layer.setMaxLevel(maxLevel); + } + + return itrAdvanced; +} + +bool Layer_writeLocalData(const osg::Object& obj, osgDB::Output& fw) +{ + const osgTerrain::Layer& layer = static_cast(obj); + + if (layer.getLocator() && !(layer.getLocator()->getDefinedInFile())) + { + fw.writeObject(*layer.getLocator()); + } + + if (layer.getMinLevel()!=0) + { + fw.indent()<<"MinLevel "< layer; - osg::ref_ptr locator; - - // read any locator data first. - if (fr.matchSequence("Locator %w %f %f %f")) - { - - double x,y,w,h; - fr[2].getFloat(x); - fr[3].getFloat(y); - fr[4].getFloat(w); - fr[5].getFloat(h); - - locator = new osgTerrain::Locator; - - if (fr[1].matchWord("GEOCENTRIC")) locator->setCoordinateSystemType(osgTerrain::Locator::GEOCENTRIC); - else if (fr[1].matchWord("GEOGRAPHIC")) locator->setCoordinateSystemType(osgTerrain::Locator::GEOGRAPHIC); - else locator->setCoordinateSystemType(osgTerrain::Locator::PROJECTED); - locator->setTransformAsExtents(x,y,x+w,y+h); - - fr += 6; - itrAdvanced = true; - } - - if (fr.matchSequence("Locator {")) - { - locator = new osgTerrain::Locator; - - int local_entry = fr[0].getNoNestedBrackets(); - - fr += 2; - while (!fr.eof() && fr[0].getNoNestedBrackets()>local_entry) - { - bool localAdvanced = false; - - if (fr.matchSequence("Format %w") || fr.matchSequence("Format %s") ) - { - locator->setFormat(fr[1].getStr()); - - fr += 2; - localAdvanced = true; - } - - if (fr.matchSequence("CoordinateSystemType %w")) - { - if (fr[1].matchWord("GEOCENTRIC")) locator->setCoordinateSystemType(osgTerrain::Locator::GEOCENTRIC); - else if (fr[1].matchWord("GEOGRAPHIC")) locator->setCoordinateSystemType(osgTerrain::Locator::GEOGRAPHIC); - else locator->setCoordinateSystemType(osgTerrain::Locator::PROJECTED); - - fr += 2; - localAdvanced = true; - } - - - - - if (fr.matchSequence("CoordinateSystem %w") || fr.matchSequence("CoordinateSystem %s") ) - { - locator->setCoordinateSystem(fr[1].getStr()); - - fr += 2; - localAdvanced = true; - } - - if (fr.matchSequence("TransformScaledByResolution %w")) - { - locator->setTransformScaledByResolution(fr[1].matchWord("TRUE") || fr[1].matchWord("True") || fr[1].matchWord("true")); - fr += 2; - localAdvanced = true; - } - - if (fr.matchSequence("Transform {")) - { - int tansform_entry = fr[0].getNoNestedBrackets(); - - fr += 2; - - int row=0; - int col=0; - double v; - osg::Matrixd matrix; - while (!fr.eof() && fr[0].getNoNestedBrackets()>tansform_entry) - { - if (fr[0].getFloat(v)) - { - matrix(row,col)=v; - ++col; - if (col>=4) - { - col = 0; - ++row; - } - ++fr; - } - else fr.advanceOverCurrentFieldOrBlock(); - } - - locator->setTransform(matrix); - - ++fr; - localAdvanced = true; - } - - - if (fr.matchSequence("Extents %f %f %f %f")) - { - double minX,minY,maxX,maxY; - fr[1].getFloat(minX); - fr[2].getFloat(minY); - fr[3].getFloat(maxX); - fr[4].getFloat(maxY); - - locator->setTransformAsExtents(minX, minY, maxX, maxY); - - fr += 5; - localAdvanced = true; - } - - if (!localAdvanced) ++fr; - } - - itrAdvanced = true; - - ++fr; - } - - if (fr.matchSequence("EllipsoidLocator %f %f %f %f")) - { - double x,y,w,h; - fr[1].getFloat(x); - fr[2].getFloat(y); - fr[3].getFloat(w); - fr[4].getFloat(h); - - locator = new osgTerrain::Locator; - locator->setCoordinateSystemType(osgTerrain::Locator::GEOCENTRIC); - locator->setTransformAsExtents(x,y,x+w,y+h); - - fr += 5; - itrAdvanced = true; - } - - if (fr.matchSequence("CartesianLocator %f %f %f %f")) - { - double x,y,w,h; - fr[1].getFloat(x); - fr[2].getFloat(y); - fr[3].getFloat(w); - fr[4].getFloat(h); - - locator = new osgTerrain::Locator; - locator->setCoordinateSystemType(osgTerrain::Locator::PROJECTED); - locator->setTransformAsExtents(x,y,x+w,y+h); - - fr += 5; - itrAdvanced = true; - } - - unsigned int minLevel=0; - if (fr.read("MinLevel",minLevel)) - { - itrAdvanced = true; - } - - unsigned int maxLevel = MAXIMUM_NUMBER_OF_LEVELS; - if (fr.read("MaxLevel",maxLevel)) - { - itrAdvanced = true; - } - - - if (fr.matchSequence("CompositeLayer {")) - { - - osg::ref_ptr cl = new osgTerrain::CompositeLayer; - - int local_entry = fr[0].getNoNestedBrackets(); - - fr += 2; - while (!fr.eof() && fr[0].getNoNestedBrackets()>local_entry) - { - osg::notify(osg::INFO)<<"Composite layer "<addLayer(fr[1].getStr()); - fr += 2; - localAdvanced = true; - } - else - { - osgTerrain::Layer* layer = readLayer(fr, localAdvanced); - if (layer) cl->addLayer(layer); - } - - if (!localAdvanced) ++fr; - - } - - layer = cl.get(); - - osg::notify(osg::INFO)<<"End of Composite layer "< image = osgDB::readObjectFile(std::string(fr[1].getStr())+".gdal"); - osgTerrain::ProxyLayer* proxyLayer = dynamic_cast(image.get()); - if (proxyLayer) - { - layer = proxyLayer; - } - else - { - osg::notify(osg::NOTICE)<<"Warning: Failed to create ProxyLayer "< cl = new osgTerrain::CompositeLayer; - - int local_entry = fr[0].getNoNestedBrackets(); - - fr += 2; - while (!fr.eof() && fr[0].getNoNestedBrackets()>local_entry) - { - cl->addLayer(fr[0].getStr()); - ++fr; - } - - layer = cl.get(); - ++fr; - itrAdvanced = true; - } - - if (fr.matchSequence("Image %w") || fr.matchSequence("image %w") || - fr.matchSequence("Image %s") || fr.matchSequence("image %s")) - { - osg::ref_ptr image = osgDB::readImageFile(fr[1].getStr()); - if (image.valid()) - { - osg::ref_ptr imagelayer = new osgTerrain::ImageLayer; - imagelayer->setImage(image.get()); - layer = imagelayer.get(); - } - - fr += 2; - itrAdvanced = true; - } - - if (fr.matchSequence("HeightField %w") || fr.matchSequence("HeightField %s")) - { - osg::ref_ptr hf = osgDB::readHeightFieldFile(fr[1].getStr()); - if (hf.valid()) - { - osg::ref_ptr hflayer = new osgTerrain::HeightFieldLayer; - hflayer->setHeightField(hf.get()); - layer = hflayer.get(); - } - - fr += 2; - itrAdvanced = true; - } - - if (layer.valid() && locator.valid()) - { - layer->setLocator(locator.get()); - } - - layer->setMinLevel(minLevel); - layer->setMaxLevel(maxLevel); - - return layer.release(); -} - -osgTerrain::Layer* readNestedLayer(osgDB::Input& fr) -{ - int entry = fr[0].getNoNestedBrackets(); - - fr += 2; - - osg::ref_ptr compositeLayer = 0; - osg::ref_ptr layer = 0; - - while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) - { - bool itrAdvanced = false; - - osg::ref_ptr new_layer = readLayer(fr,itrAdvanced); - if (new_layer.valid()) - { - if (layer.valid()) - { - compositeLayer = new osgTerrain::CompositeLayer; - compositeLayer->addLayer(layer.get()); - compositeLayer->addLayer(new_layer.get()); - layer = 0; - } - else if (compositeLayer.valid()) - { - compositeLayer->addLayer(new_layer.get()); - } - else - { - layer = new_layer; - } - - } - - if (!itrAdvanced) ++fr; - } - - if (compositeLayer.valid()) return compositeLayer.release(); - if (layer.valid()) return layer.release(); - return 0; -} - osg::TransferFunction* readTransferFunction(osgDB::Input& fr) { osg::ref_ptr tf = new osg::TransferFunction1D; @@ -446,9 +120,46 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) if (fr.matchSequence("ElevationLayer {")) { - osgTerrain::Layer* layer = readNestedLayer(fr); + int entry = fr[0].getNoNestedBrackets(); + fr += 2; - if (layer) terrain.setElevationLayer(layer); + while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + { + bool localAdvanced = false; + + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Locator* locator = dynamic_cast(readObject.get()); + if (readObject.valid()) localAdvanced = true; + + if (fr.matchSequence("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w") ) + { + osg::ref_ptr image = osgDB::readObjectFile(std::string(fr[1].getStr())+".gdal"); + osgTerrain::ProxyLayer* proxyLayer = dynamic_cast(image.get()); + if (proxyLayer) + { + proxyLayer->setLocator(locator); + terrain.setElevationLayer(proxyLayer); + } + + fr += 2; + + localAdvanced = true; + } + else + { + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Layer* readLayer = dynamic_cast(readObject.get()); + if (readLayer) + { + readLayer->setLocator(locator); + terrain.setElevationLayer(readLayer); + } + + if (readObject.valid()) localAdvanced = true; + } + + if (!localAdvanced) ++fr; + } itrAdvanced = true; } @@ -463,8 +174,46 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) ++fr; } - osgTerrain::Layer* layer = readNestedLayer(fr); - if (layer) terrain.setColorLayer(layerNum, layer); + int entry = fr[0].getNoNestedBrackets(); + fr += 2; + + while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + { + bool localAdvanced = false; + + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Locator* locator = dynamic_cast(readObject.get()); + if (readObject.valid()) localAdvanced = true; + + if (fr.matchSequence("ProxyFile %s") || fr.matchSequence("ProxyFile %w") ) + { + osg::ref_ptr image = osgDB::readObjectFile(std::string(fr[1].getStr())+".gdal"); + osgTerrain::ProxyLayer* proxyLayer = dynamic_cast(image.get()); + if (proxyLayer) + { + proxyLayer->setLocator(locator); + terrain.setColorLayer(layerNum, proxyLayer); + } + + fr += 2; + + localAdvanced = true; + } + else + { + osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); + osgTerrain::Layer* readLayer = dynamic_cast(readObject.get()); + if (readLayer) + { + readLayer->setLocator(locator); + terrain.setColorLayer(layerNum, readLayer); + } + + if (readObject.valid()) localAdvanced = true; + } + + if (!localAdvanced) ++fr; + } itrAdvanced = true; } @@ -515,118 +264,6 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) return itrAdvanced; } -bool writeLocator(const osgTerrain::Locator& locator, osgDB::Output& fw) -{ - - fw.indent()<<"Locator {"<getDefinedInFile())) - { - writeLocator(*layer.getLocator(),fw); - } - - if (layer.getMinLevel()!=0) - { - fw.indent()<<"MinLevel "<(&layer); - if (proxyLayer) - { - fw.indent()<<"ProxyLayer "<getFileName()<(&layer); - if (imageLayer) - { - fw.indent()<<"Image "<getFileName()<(&layer); - if (hfLayer) - { - fw.indent()<<"HeightField "<getFileName()<(&layer); - if (compositeLayer) - { - fw.indent()<<"CompositeLayer {"<getNumLayers();++i) - { - if (compositeLayer->getLayer(i)) - { - writeLayer(*(compositeLayer->getLayer(i)), fw); - } - else if (!compositeLayer->getFileName(i).empty()) - { - fw.indent()<<"file "<getFileName(i)<(obj); @@ -634,9 +271,9 @@ bool Terrain_writeLocalData(const osg::Object& obj, osgDB::Output& fw) int prec = fw.precision(); fw.precision(15); - if (terrain.getLocator()) + if (terrain.getLocator()) { - writeLocator(*terrain.getLocator(),fw); + fw.writeObject(*terrain.getLocator()); } if (terrain.getElevationLayer()) @@ -645,8 +282,25 @@ bool Terrain_writeLocalData(const osg::Object& obj, osgDB::Output& fw) fw.moveIn(); - writeLayer(*terrain.getElevationLayer(), fw); - + const osgTerrain::ProxyLayer* proxyLayer = dynamic_cast(terrain.getElevationLayer()); + if (proxyLayer) + { + if (!proxyLayer->getFileName().empty()) + { + const osgTerrain::Locator* locator = proxyLayer->getLocator(); + if (locator && !locator->getDefinedInFile()) + { + fw.writeObject(*locator); + } + + fw.indent()<<"ProxyLayer "<getFileName()<(layer); + if (proxyLayer) + { + const osgTerrain::Locator* locator = proxyLayer->getLocator(); + if (locator && !locator->getDefinedInFile()) + { + fw.writeObject(*locator); + } - writeLayer(*layer, fw); + if (!proxyLayer->getFileName().empty()) fw.indent()<<"ProxyLayer "<getFileName()<