diff --git a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp index 51b4bc0fd..bdd15d128 100644 --- a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp +++ b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp @@ -234,11 +234,42 @@ protected: }; -struct CustomTileLoadedCallback : public osgTerrain::TerrainTile::TileLoadedCallback +struct WhiteListTileLoadedCallback : public osgTerrain::TerrainTile::TileLoadedCallback { - CustomTileLoadedCallback() + WhiteListTileLoadedCallback() { } + + void allow(const std::string& setname) { _setWhiteList.insert(setname); } + + typedef std::set SetWhiteList; + SetWhiteList _setWhiteList; + + bool layerAcceptable(const std::string& setname) const + { + if (setname.empty()) return true; + + return _setWhiteList.count(setname)!=0; + } + + bool readImageLayer(osgTerrain::ImageLayer* imageLayer, const osgDB::ReaderWriter::Options* options) const + { + if (!imageLayer->getImage() && + !imageLayer->getFileName().empty()) + { + if (layerAcceptable(imageLayer->getSetName())) + { + osg::ref_ptr image = osgDB::readImageFile(imageLayer->getFileName(), options); + std::cout<<"ok readingImageLayer("<getSetName()<<","<getFileName()<<" success="<valid()<setImage(image.get()); + } + else + { + std::cout<<"disallowed readingImageLayer("<getSetName()<<","<getFileName()<getImage()!=0; + } virtual bool deferExternalLayerLoading() const { @@ -247,7 +278,144 @@ struct CustomTileLoadedCallback : public osgTerrain::TerrainTile::TileLoadedCall virtual void loaded(osgTerrain::TerrainTile* tile, const osgDB::ReaderWriter::Options* options) const { - osg::notify(osg::NOTICE)<<"Need to decide what to do here guys"<getNumColorLayers(); ++i) + { + osgTerrain::Layer* layer = tile->getColorLayer(i); + osgTerrain::ImageLayer* imageLayer = dynamic_cast(layer); + if (imageLayer) + { + readImageLayer(imageLayer, options); + continue; + } + + osgTerrain::SwitchLayer* switchLayer = dynamic_cast(layer); + if (switchLayer) + { + for(unsigned int si=0; sigetNumLayers(); ++si) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(switchLayer->getLayer(si)); + if (imageLayer) + { + if (readImageLayer(imageLayer, options)) + { + // replace SwitchLayer by + tile->setColorLayer(i, imageLayer); + continue; + } + } + } + continue; + } + + osgTerrain::CompositeLayer* compositeLayer = dynamic_cast(layer); + if (compositeLayer) + { + for(unsigned int ci=0; cigetNumLayers(); ++ci) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(compositeLayer->getLayer(ci)); + if (imageLayer) + { + readImageLayer(imageLayer, options); + } + } + continue; + } + } + + // assign colour layers over missing layers + osgTerrain::Layer* validLayer = 0; + for(unsigned int i=0; igetNumColorLayers(); ++i) + { + osgTerrain::Layer* layer = tile->getColorLayer(i); + osgTerrain::ImageLayer* imageLayer = dynamic_cast(layer); + if (imageLayer) + { + if (imageLayer->getImage()!=0) + { + validLayer = imageLayer; + } + continue; + } + + osgTerrain::SwitchLayer* switchLayer = dynamic_cast(layer); + if (switchLayer) + { + for(unsigned int si=0; sigetNumLayers(); ++si) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(switchLayer->getLayer(si)); + if (imageLayer && imageLayer->getImage()!=0) + { + validLayer = imageLayer; + } + } + continue; + } + + osgTerrain::CompositeLayer* compositeLayer = dynamic_cast(layer); + if (compositeLayer) + { + for(unsigned int ci=0; cigetNumLayers(); ++ci) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(switchLayer->getLayer(ci)); + if (imageLayer && imageLayer->getImage()!=0) + { + validLayer = imageLayer; + } + } + continue; + } + } + + if (validLayer) + { + // fill in any missing layers + for(unsigned int i=0; igetNumColorLayers(); ++i) + { + osgTerrain::Layer* layer = tile->getColorLayer(i); + osgTerrain::ImageLayer* imageLayer = dynamic_cast(layer); + if (imageLayer) + { + if (imageLayer->getImage()==0) + { + tile->setColorLayer(i, validLayer); + break; + } + continue; + } + + osgTerrain::SwitchLayer* switchLayer = dynamic_cast(layer); + if (switchLayer) + { + for(unsigned int si=0; sigetNumLayers(); ++si) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(switchLayer->getLayer(si)); + if (imageLayer && imageLayer->getImage()==0) + { + tile->setColorLayer(i, validLayer); + break; + } + } + continue; + } + + osgTerrain::CompositeLayer* compositeLayer = dynamic_cast(layer); + if (compositeLayer) + { + for(unsigned int ci=0; cigetNumLayers(); ++ci) + { + osgTerrain::ImageLayer* imageLayer = dynamic_cast(switchLayer->getLayer(ci)); + if (imageLayer && imageLayer->getImage()==0) + { + tile->setColorLayer(i, validLayer); + break; + } + } + continue; + } + } + } } }; @@ -261,7 +429,13 @@ int main( int argc, char **argv ) // set the tile loaded callback to load the optional imagery - osgTerrain::TerrainTile::setTileLoadedCallback(new CustomTileLoadedCallback()); + osg::ref_ptr whiteList = new WhiteListTileLoadedCallback; + std::string setname; + while(arguments.read("--allow",setname)) + { + whiteList->allow(setname); + } + osgTerrain::TerrainTile::setTileLoadedCallback(whiteList.get()); // construct the viewer. osgViewer::Viewer viewer(arguments);