From Brad Christiansen, "Attached is a fix which implements the lazy loading of optional layers (if requested) in the new osgb/osgt formats."

This commit is contained in:
Robert Osfield
2011-01-14 11:00:11 +00:00
parent 7c30f204e8
commit b0dd272186
3 changed files with 45 additions and 5 deletions

View File

@@ -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);

View File

@@ -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<osg::Image> image = NULL;
bool readFromExternal = true;
switch ( decision )
{
case IMAGE_INLINE_DATA:

View File

@@ -3,10 +3,49 @@
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
#include <osgTerrain/TerrainTile>
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<osg::Image> 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 );
}