diff --git a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp index 050cc66b9..51b4bc0fd 100644 --- a/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp +++ b/examples/osgmultitexturecontrol/osgmultitexturecontrol.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -232,6 +233,24 @@ protected: osg::ref_ptr _terrain; }; + +struct CustomTileLoadedCallback : public osgTerrain::TerrainTile::TileLoadedCallback +{ + CustomTileLoadedCallback() + { + } + + virtual bool deferExternalLayerLoading() const + { + return true; + } + + virtual void loaded(osgTerrain::TerrainTile* tile, const osgDB::ReaderWriter::Options* options) const + { + osg::notify(osg::NOTICE)<<"Need to decide what to do here guys"<addCommandLineOption("-r","Set the terrain sample ratio."); arguments.getApplicationUsage()->addCommandLineOption("--login ","Provide authentication information for http file access."); + + // set the tile loaded callback to load the optional imagery + osgTerrain::TerrainTile::setTileLoadedCallback(new CustomTileLoadedCallback()); + // construct the viewer. osgViewer::Viewer viewer(arguments); diff --git a/include/osgTerrain/TerrainTile b/include/osgTerrain/TerrainTile index d4c8a761c..726e58bf0 100644 --- a/include/osgTerrain/TerrainTile +++ b/include/osgTerrain/TerrainTile @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -145,8 +147,8 @@ class OSGTERRAIN_EXPORT TerrainTile : public osg::Group /** Get the number of colour layers.*/ unsigned int getNumColorLayers() const { return _colorLayers.size(); } - - + + /** Set hint to whether the TerrainTechnique should create per vertex normals for lighting purposes.*/ void setRequiresNormals(bool flag) { _requiresNormals = flag; } @@ -169,6 +171,16 @@ class OSGTERRAIN_EXPORT TerrainTile : public osg::Group /** Compute the bounding volume of the terrain by computing the union of the bounding volumes of all layers.*/ virtual osg::BoundingSphere computeBound() const; + /** Callback for post processing loaded TerrainTile, and for filling in missing elements such as external external imagery.*/ + struct TileLoadedCallback : public osg::Referenced + { + virtual bool deferExternalLayerLoading() const = 0; + virtual void loaded(osgTerrain::TerrainTile* tile, const osgDB::ReaderWriter::Options* options) const = 0; + }; + + static void setTileLoadedCallback(TileLoadedCallback* lc); + static osg::ref_ptr& getTileLoadedCallback(); + protected: virtual ~TerrainTile(); diff --git a/src/osgPlugins/ive/DataInputStream.cpp b/src/osgPlugins/ive/DataInputStream.cpp index dc2173652..c07da5a20 100644 --- a/src/osgPlugins/ive/DataInputStream.cpp +++ b/src/osgPlugins/ive/DataInputStream.cpp @@ -1007,7 +1007,7 @@ osg::Image* DataInputStream::readImage(IncludeImageMode mode) // Only read image name from stream. { std::string filename = readString(); - if(filename.compare("")!=0){ + if(!filename.empty()){ return readImage(filename); } } diff --git a/src/osgPlugins/ive/ImageLayer.cpp b/src/osgPlugins/ive/ImageLayer.cpp index 925a28f5c..0b06beed6 100644 --- a/src/osgPlugins/ive/ImageLayer.cpp +++ b/src/osgPlugins/ive/ImageLayer.cpp @@ -15,6 +15,8 @@ #include "ImageLayer.h" #include "Layer.h" +#include + #include using namespace ive; @@ -59,8 +61,18 @@ void ImageLayer::read(DataInputStream* in) throw Exception("ImageLayer::read(): Could not cast this osgLayer::Layer to an osg::Group."); + bool deferExternalLayerLoading = osgTerrain::TerrainTile::getTileLoadedCallback().valid() ? + osgTerrain::TerrainTile::getTileLoadedCallback()->deferExternalLayerLoading() : false; + // Should we read image data from stream IncludeImageMode includeImg = (IncludeImageMode)in->readChar(); - setImage(in->readImage(includeImg)); - + + if (includeImg==IMAGE_REFERENCE_FILE && deferExternalLayerLoading) + { + setFileName(in->readString()); + } + else + { + setImage(in->readImage(includeImg)); + } } diff --git a/src/osgPlugins/ive/TerrainTile.cpp b/src/osgPlugins/ive/TerrainTile.cpp index 614f2a4d7..7cdf7b15e 100644 --- a/src/osgPlugins/ive/TerrainTile.cpp +++ b/src/osgPlugins/ive/TerrainTile.cpp @@ -66,7 +66,7 @@ void TerrainTile::write(DataOutputStream* out) } writeTerrainTechnique(out, getTerrainTechnique()); - + } void TerrainTile::read(DataInputStream* in) @@ -119,6 +119,8 @@ void TerrainTile::read(DataInputStream* in) setTerrainTechnique(readTerrainTechnique(in)); + if (osgTerrain::TerrainTile::getTileLoadedCallback().valid()) + osgTerrain::TerrainTile::getTileLoadedCallback()->loaded(this, in->getOptions()); } void TerrainTile::writeTerrainTechnique(DataOutputStream* out, osgTerrain::TerrainTechnique* technique) diff --git a/src/osgPlugins/osgTerrain/ImageLayer.cpp b/src/osgPlugins/osgTerrain/ImageLayer.cpp index 6ae125241..07b481e4c 100644 --- a/src/osgPlugins/osgTerrain/ImageLayer.cpp +++ b/src/osgPlugins/osgTerrain/ImageLayer.cpp @@ -13,6 +13,8 @@ #include #include +#include + bool ImageLayer_readLocalData(osg::Object &obj, osgDB::Input &fr); bool ImageLayer_writeLocalData(const osg::Object &obj, osgDB::Output &fw); @@ -36,11 +38,18 @@ bool ImageLayer_readLocalData(osg::Object& obj, osgDB::Input &fr) std::string filename = fr[1].getStr(); if (!filename.empty()) { - osg::ref_ptr image = fr.readImage(filename.c_str()); - if (image.valid()) + bool deferExternalLayerLoading = osgTerrain::TerrainTile::getTileLoadedCallback().valid() ? + osgTerrain::TerrainTile::getTileLoadedCallback()->deferExternalLayerLoading() : false; + + layer.setFileName(filename); + + if (!deferExternalLayerLoading) { - layer.setFileName(filename); - layer.setImage(image.get()); + osg::ref_ptr image = fr.readImage(filename.c_str()); + if (image.valid()) + { + layer.setImage(image.get()); + } } } diff --git a/src/osgPlugins/osgTerrain/TerrainTile.cpp b/src/osgPlugins/osgTerrain/TerrainTile.cpp index 8eb806c24..14246c8c5 100644 --- a/src/osgPlugins/osgTerrain/TerrainTile.cpp +++ b/src/osgPlugins/osgTerrain/TerrainTile.cpp @@ -267,6 +267,9 @@ bool TerrainTile_readLocalData(osg::Object& obj, osgDB::Input &fr) } + if (osgTerrain::TerrainTile::getTileLoadedCallback().valid()) + osgTerrain::TerrainTile::getTileLoadedCallback()->loaded(&terrainTile, fr.getOptions()); + return itrAdvanced; } diff --git a/src/osgTerrain/TerrainTile.cpp b/src/osgTerrain/TerrainTile.cpp index 1fffca7bc..c43ac8c4d 100644 --- a/src/osgTerrain/TerrainTile.cpp +++ b/src/osgTerrain/TerrainTile.cpp @@ -19,6 +19,17 @@ using namespace osg; using namespace osgTerrain; +void TerrainTile::setTileLoadedCallback(TerrainTile::TileLoadedCallback* lc) +{ + getTileLoadedCallback() = lc; +} + +osg::ref_ptr& TerrainTile::getTileLoadedCallback() +{ + static osg::ref_ptr s_TileLoadedCallback; + return s_TileLoadedCallback; +} + TerrainTile::TerrainTile(): _terrain(0), _hasBeenTraversal(false),