From b0dd2721862eb8d6b1fadcc10b4276e2a169e800 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 14 Jan 2011 11:00:11 +0000 Subject: [PATCH] From Brad Christiansen, "Attached is a fix which implements the lazy loading of optional layers (if requested) in the new osgb/osgt formats." --- include/osgDB/InputStream | 2 +- src/osgDB/InputStream.cpp | 5 ++- .../serializers/osgTerrain/ImageLayer.cpp | 43 ++++++++++++++++++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/include/osgDB/InputStream b/include/osgDB/InputStream index 3037f2620..0b0c70817 100644 --- a/include/osgDB/InputStream +++ b/include/osgDB/InputStream @@ -136,7 +136,7 @@ public: // Global reading functions osg::Array* readArray(); osg::PrimitiveSet* readPrimitiveSet(); - osg::Image* readImage(); + osg::Image* readImage(bool readFromExternal=true); osg::Object* readObject( osg::Object* existingObj=0 ); osg::Object* readObjectFields( const std::string& className, osg::Object* existingObj=0); diff --git a/src/osgDB/InputStream.cpp b/src/osgDB/InputStream.cpp index a2620896e..ad31a94cf 100644 --- a/src/osgDB/InputStream.cpp +++ b/src/osgDB/InputStream.cpp @@ -476,8 +476,9 @@ osg::PrimitiveSet* InputStream::readPrimitiveSet() return primitive.release(); } -osg::Image* InputStream::readImage() +osg::Image* InputStream::readImage(bool readFromExternal) { + std::string className="osg::Image"; unsigned int id = 0; @@ -497,7 +498,7 @@ osg::Image* InputStream::readImage() if ( getException() ) return NULL; osg::ref_ptr image = NULL; - bool readFromExternal = true; + switch ( decision ) { case IMAGE_INLINE_DATA: diff --git a/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp b/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp index 8e36b4d8a..16ececa78 100644 --- a/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp +++ b/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp @@ -3,10 +3,49 @@ #include #include +#include + + +static bool checkImage( const osgTerrain::ImageLayer& im ) +{ return im.getImage() != NULL; } + +static bool readImage( osgDB::InputStream& is, osgTerrain::ImageLayer& il ) +{ + + if(!is.isBinary()) is >> osgDB::BEGIN_BRACKET; + + bool deferExternalLayerLoading = osgTerrain::TerrainTile::getTileLoadedCallback().valid() ? + osgTerrain::TerrainTile::getTileLoadedCallback()->deferExternalLayerLoading() : false; + + + osg::ref_ptr image = is.readImage(!deferExternalLayerLoading); + if (image.valid()) + { + if(image->valid()) + { + il.setImage(image.get()); + } + } + if(!is.isBinary()) is >> osgDB::END_BRACKET; + + return true; +} + +static bool writeImage( osgDB::OutputStream& os, const osgTerrain::ImageLayer& il ) +{ + const osg::Image* image = il.getImage(); + + if(!os.isBinary()) os << osgDB::BEGIN_BRACKET << std::endl; + os.writeImage(image); + if(!os.isBinary()) os << osgDB::END_BRACKET << std::endl; + + return true; +} + REGISTER_OBJECT_WRAPPER( osgTerrain_ImageLayer, new osgTerrain::ImageLayer, osgTerrain::ImageLayer, "osg::Object osgTerrain::Layer osgTerrain::ImageLayer" ) -{ - ADD_IMAGE_SERIALIZER( Image, osg::Image, NULL ); // _image +{ + ADD_USER_SERIALIZER( Image ); }