#include #include #include #include #include #include #include #include #include #include #include bool TerrainTile_readLocalData(osg::Object &obj, osgDB::Input &fr); bool TerrainTile_writeLocalData(const osg::Object &obj, osgDB::Output &fw); osgDB::RegisterDotOsgWrapperProxy TerrainTile_Proxy ( new osgTerrain::TerrainTile, "TerrainTile", "Object Node TerrainTile Group", TerrainTile_readLocalData, TerrainTile_writeLocalData ); bool TerrainTile_readLocalData(osg::Object& obj, osgDB::Input &fr) { osgTerrain::TerrainTile& terrainTile = static_cast(obj); bool itrAdvanced = false; osg::ref_ptr readObject = fr.readObjectOfType(osgDB::type_wrapper()); if (readObject.valid()) itrAdvanced = true; osgTerrain::Locator* locator = dynamic_cast(readObject.get()); if (locator) terrainTile.setLocator(locator); if (fr.matchSequence("ElevationLayer {")) { 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; 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("ProxyLayer %s") || fr.matchSequence("ProxyLayer %w") ) { osgTerrain::ProxyLayer* proxyLayer = new osgTerrain::ProxyLayer; proxyLayer->setFileName(fr[1].getStr()); if (locator) proxyLayer->setLocator(locator); if (minLevel!=0) proxyLayer->setMinLevel(minLevel); if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel); terrainTile.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) { if (locator) readLayer->setLocator(locator); if (minLevel!=0) readLayer->setMinLevel(minLevel); if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel); terrainTile.setElevationLayer(readLayer); } if (readObject.valid()) localAdvanced = true; } if (!localAdvanced) ++fr; } itrAdvanced = true; } bool firstMatched = false; if ((firstMatched = fr.matchSequence("ColorLayer %i {")) || fr.matchSequence("ColorLayer {") ) { unsigned int layerNum = 0; if (firstMatched) { fr[1].getUInt(layerNum); ++fr; } 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; 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("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) { if (locator) proxyLayer->setLocator(locator); if (minLevel!=0) proxyLayer->setMinLevel(minLevel); if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) proxyLayer->setMaxLevel(maxLevel); terrainTile.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) { if (locator) readLayer->setLocator(locator); if (minLevel!=0) readLayer->setMinLevel(minLevel); if (maxLevel!=MAXIMUM_NUMBER_OF_LEVELS) readLayer->setMaxLevel(maxLevel); terrainTile.setColorLayer(layerNum, readLayer); } if (readObject.valid()) localAdvanced = true; } if (!localAdvanced) ++fr; } itrAdvanced = true; } readObject = fr.readObjectOfType(osgDB::type_wrapper()); if (readObject.valid()) { terrainTile.setTerrainTechnique(dynamic_cast(readObject.get())); itrAdvanced = true; } if (osgTerrain::TerrainTile::getTileLoadedCallback().valid()) osgTerrain::TerrainTile::getTileLoadedCallback()->loaded(&terrainTile, fr.getOptions()); return itrAdvanced; } bool TerrainTile_writeLocalData(const osg::Object& obj, osgDB::Output& fw) { const osgTerrain::TerrainTile& terrainTile = static_cast(obj); int prec = fw.precision(); fw.precision(15); if (terrainTile.getLocator()) { fw.writeObject(*terrainTile.getLocator()); } if (terrainTile.getElevationLayer()) { fw.indent()<<"ElevationLayer {"<(terrainTile.getElevationLayer()); if (proxyLayer) { if (!proxyLayer->getFileName().empty()) { const osgTerrain::Locator* locator = proxyLayer->getLocator(); if (locator && !locator->getDefinedInFile()) { fw.writeObject(*locator); } if (proxyLayer->getMinLevel()!=0) { fw.indent()<<"MinLevel "<getMinLevel()<getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS) { fw.indent()<<"MaxLevel "<getMaxLevel()<getFileName()<0) { fw.indent()<<"ColorLayer "<(layer); if (proxyLayer) { const osgTerrain::Locator* locator = proxyLayer->getLocator(); if (locator && !locator->getDefinedInFile()) { fw.writeObject(*locator); } if (proxyLayer->getMinLevel()!=0) { fw.indent()<<"MinLevel "<getMinLevel()<getMaxLevel()!=MAXIMUM_NUMBER_OF_LEVELS) { fw.indent()<<"MaxLevel "<getMaxLevel()<getFileName().empty()) fw.indent()<<"ProxyLayer "<getFileName()<