diff --git a/include/osgTerrain/Locator b/include/osgTerrain/Locator index 48b8e784e..d7274a458 100644 --- a/include/osgTerrain/Locator +++ b/include/osgTerrain/Locator @@ -102,6 +102,9 @@ class OSGTERRAIN_EXPORT Locator : public osg::Object } bool computeLocalBounds(Locator& source, osg::Vec3d& bottomLeft, osg::Vec3d& topRight); + + void setDefinedInFile(bool flag) { _definedInFile = flag; } + bool getDefinedInFile() const { return _definedInFile; } protected: @@ -115,6 +118,8 @@ class OSGTERRAIN_EXPORT Locator : public osg::Object osg::Matrixd _transform; osg::Matrixd _inverse; + + bool _definedInFile; }; diff --git a/src/osgPlugins/gdal/DataSetLayer.cpp b/src/osgPlugins/gdal/DataSetLayer.cpp index bae12685f..a2921f2f0 100644 --- a/src/osgPlugins/gdal/DataSetLayer.cpp +++ b/src/osgPlugins/gdal/DataSetLayer.cpp @@ -120,6 +120,11 @@ void DataSetLayer::setUpLocator() 0.0, 0.0, 1.0, 0.0, geoTransform[0], geoTransform[3], 0.0, 1.0); + locator->setTransform(matrix); + locator->setDefinedInFile(true); + + setLocator(locator.get()); + } else if (_dataset->GetGCPCount()>0 && _dataset->GetGCPProjection()) { @@ -162,23 +167,15 @@ void DataSetLayer::setUpLocator() adfDstGeoTransform[2], adfDstGeoTransform[5], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, adfDstGeoTransform[0], adfDstGeoTransform[3], 0.0, 1.0); + + locator->setTransform(matrix); + locator->setDefinedInFile(true); + + setLocator(locator.get()); } else { osg::notify(osg::NOTICE) << " No GeoTransform or GCP's - unable to compute position in space"<< std::endl; - - matrix.set( 1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0); - } - - osg::notify(osg::NOTICE)<<"Matrix = "<setTransform(matrix); - - setLocator(locator.get()); - } diff --git a/src/osgPlugins/osgTerrain/Terrain.cpp b/src/osgPlugins/osgTerrain/Terrain.cpp index 3567e0eb7..02f0ad575 100644 --- a/src/osgPlugins/osgTerrain/Terrain.cpp +++ b/src/osgPlugins/osgTerrain/Terrain.cpp @@ -26,275 +26,246 @@ osgDB::RegisterDotOsgWrapperProxy Terrain_Proxy Terrain_writeLocalData ); -osgTerrain::Layer* readLayer(osgDB::Input& fr) +osgTerrain::Layer* readLayer(osgDB::Input& fr, bool& itrAdvanced) { osg::ref_ptr layer; osg::ref_ptr locator; - int entry = fr[0].getNoNestedBrackets(); - - fr += 2; - - while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + // read any locator data first. + if (fr.matchSequence("Locator %w %f %f %f")) { - bool itrAdvanced = false; - - if (fr.matchSequence("CompositeLayer {")) - { - - osg::ref_ptr cl = new osgTerrain::CompositeLayer; - int local_entry = fr[0].getNoNestedBrackets(); + double x,y,w,h; + fr[2].getFloat(x); + fr[3].getFloat(y); + fr[4].getFloat(w); + fr[5].getFloat(h); - fr += 2; - while (!fr.eof() && fr[0].getNoNestedBrackets()>local_entry) - { - osgTerrain::Layer* layer = readLayer(fr); - if (layer) cl->addLayer(layer); + locator = new osgTerrain::Locator; - ++fr; - } - - layer = cl.get(); - - itrAdvanced = true; - - ++fr; + 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); - } - - if (fr.matchSequence("ProxyLayer %w") || 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) - { - layer = proxyLayer; - - osgTerrain::Locator* locator = layer->getLocator(); - osg::notify(osg::NOTICE)<<"Locator = "<getLocator()) - { - osg::notify(osg::NOTICE)<<" format = "<getFormat()<getTransform()< 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(); - - itrAdvanced = true; - - ++fr; - } - - 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 (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("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; - } - - if (!itrAdvanced) - { - if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Layer - unreconised token : "<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("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; + } + + + 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::NOTICE)<<"Composite layer "<addLayer(layer); + if (!localAdvanced) ++fr; + + } + + layer = cl.get(); + + osg::notify(osg::NOTICE)<<"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()) { @@ -304,6 +275,48 @@ osgTerrain::Layer* readLayer(osgDB::Input& fr) 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; @@ -399,7 +412,7 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) if (fr.matchSequence("ElevationLayer {")) { - osgTerrain::Layer* layer = readLayer(fr); + osgTerrain::Layer* layer = readNestedLayer(fr); if (layer) terrain.setElevationLayer(layer); @@ -416,7 +429,7 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) ++fr; } - osgTerrain::Layer* layer = readLayer(fr); + osgTerrain::Layer* layer = readNestedLayer(fr); if (layer) terrain.setColorLayer(layerNum, layer); itrAdvanced = true; diff --git a/src/osgTerrain/Locator.cpp b/src/osgTerrain/Locator.cpp index fb7bb67fa..1a8b0545f 100644 --- a/src/osgTerrain/Locator.cpp +++ b/src/osgTerrain/Locator.cpp @@ -24,7 +24,8 @@ using namespace osgTerrain; // Locator::Locator(): _coordinateSystemType(PROJECTED), - _ellipsoidModel(new osg::EllipsoidModel()) + _ellipsoidModel(new osg::EllipsoidModel()), + _definedInFile(false) { } @@ -34,7 +35,8 @@ Locator::Locator(const Locator& locator,const osg::CopyOp& copyop): _ellipsoidModel(locator._ellipsoidModel), _format(locator._format), _cs(locator._cs), - _transform(locator._transform) + _transform(locator._transform), + _definedInFile(locator._definedInFile) { } diff --git a/src/osgWrappers/osgTerrain/Locator.cpp b/src/osgWrappers/osgTerrain/Locator.cpp index c3f8e9e2b..7a0a3d25b 100644 --- a/src/osgWrappers/osgTerrain/Locator.cpp +++ b/src/osgWrappers/osgTerrain/Locator.cpp @@ -147,6 +147,16 @@ BEGIN_OBJECT_REFLECTOR(osgTerrain::Locator) __bool__computeLocalBounds__Locator_R1__osg_Vec3d_R1__osg_Vec3d_R1, "", ""); + I_Method1(void, setDefinedInFile, IN, bool, flag, + Properties::NON_VIRTUAL, + __void__setDefinedInFile__bool, + "", + ""); + I_Method0(bool, getDefinedInFile, + Properties::NON_VIRTUAL, + __bool__getDefinedInFile, + "", + ""); I_StaticMethod4(bool, convertLocalCoordBetween, IN, const osgTerrain::Locator &, source, IN, const osg::Vec3d &, sourceNDC, IN, const osgTerrain::Locator &, destination, IN, osg::Vec3d &, destinationNDC, __bool__convertLocalCoordBetween__C5_Locator_R1__C5_osg_Vec3d_R1__C5_Locator_R1__osg_Vec3d_R1_S, "", @@ -157,6 +167,9 @@ BEGIN_OBJECT_REFLECTOR(osgTerrain::Locator) I_SimpleProperty(osgTerrain::Locator::CoordinateSystemType, CoordinateSystemType, __CoordinateSystemType__getCoordinateSystemType, __void__setCoordinateSystemType__CoordinateSystemType); + I_SimpleProperty(bool, DefinedInFile, + __bool__getDefinedInFile, + __void__setDefinedInFile__bool); I_SimpleProperty(osg::EllipsoidModel *, EllipsoidModel, __osg_EllipsoidModel_P1__getEllipsoidModel, __void__setEllipsoidModel__osg_EllipsoidModel_P1);