diff --git a/include/osgDB/InputStream b/include/osgDB/InputStream index 915776b32..801abf7bd 100644 --- a/include/osgDB/InputStream +++ b/include/osgDB/InputStream @@ -69,6 +69,7 @@ public: bool isBinary() const { return _in->isBinary(); } bool getUseFloatMatrix() const { return _useFloatMatrix; } + const osgDB::Options* getOptions() const { return _options.get(); } // Serialization related functions InputStream& operator>>( bool& b ) { _in->readBool(b); checkStream(); return *this; } @@ -163,6 +164,7 @@ protected: std::vector _fields; osg::ref_ptr _in; osg::ref_ptr _exception; + osg::ref_ptr _options; }; void InputStream::throwException( const std::string& msg ) diff --git a/include/osgDB/OutputStream b/include/osgDB/OutputStream index 85758b48b..f1cbdd773 100644 --- a/include/osgDB/OutputStream +++ b/include/osgDB/OutputStream @@ -77,6 +77,7 @@ public: bool isBinary() const { return _out->isBinary(); } const std::string& getSchemaName() const { return _schemaName; } + const osgDB::Options* getOptions() const { return _options.get(); } void setWriteImageHint( WriteImageHint hint ) { _writeImageHint = hint; } WriteImageHint getWriteImageHint() const { return _writeImageHint; } @@ -172,6 +173,7 @@ protected: std::stringstream _compressSource; osg::ref_ptr _out; osg::ref_ptr _exception; + osg::ref_ptr _options; }; void OutputStream::throwException( const std::string& msg ) diff --git a/src/osgDB/InputStream.cpp b/src/osgDB/InputStream.cpp index 57b4675fa..15f24ec2f 100644 --- a/src/osgDB/InputStream.cpp +++ b/src/osgDB/InputStream.cpp @@ -27,6 +27,7 @@ InputStream::InputStream( const osgDB::Options* options ) : _byteSwap(0), _useFloatMatrix(false), _forceReadingImage(false) { if ( !options ) return; + _options = options; std::string schema; StringList optionList; diff --git a/src/osgDB/OutputStream.cpp b/src/osgDB/OutputStream.cpp index edca48310..d4b211b58 100644 --- a/src/osgDB/OutputStream.cpp +++ b/src/osgDB/OutputStream.cpp @@ -25,6 +25,7 @@ OutputStream::OutputStream( const osgDB::Options* options ) : _writeImageHint(WRITE_USE_IMAGE_HINT) { if ( !options ) return; + _options = options; StringList optionList; split( options->getOptionString(), optionList ); @@ -323,10 +324,10 @@ void OutputStream::writeImage( const osg::Image* img ) case OutputStream::WRITE_EXTERNAL_FILE: decision = IMAGE_EXTERNAL; break; case OutputStream::WRITE_USE_EXTERNAL: decision = IMAGE_WRITE_OUT; break; default: - if ( img->getWriteHint()==osg::Image::STORE_INLINE && isBinary() ) + if ( img->getWriteHint()==osg::Image::EXTERNAL_FILE ) + decision = IMAGE_EXTERNAL; + else if ( isBinary() ) decision = IMAGE_INLINE_DATA; - else if ( img->getWriteHint()==osg::Image::EXTERNAL_FILE ) - decision = IMAGE_WRITE_OUT; break; } diff --git a/src/osgWrappers/serializers/CMakeLists.txt b/src/osgWrappers/serializers/CMakeLists.txt index ded54824c..0b62f6637 100644 --- a/src/osgWrappers/serializers/CMakeLists.txt +++ b/src/osgWrappers/serializers/CMakeLists.txt @@ -34,4 +34,5 @@ SET(TARGET_COMMON_LIBRARIES ADD_SUBDIRECTORY(osg) ADD_SUBDIRECTORY(osgParticle) +ADD_SUBDIRECTORY(osgTerrain) ADD_SUBDIRECTORY(osgText) diff --git a/src/osgWrappers/serializers/osg/PagedLOD.cpp b/src/osgWrappers/serializers/osg/PagedLOD.cpp index 98260b747..cce4e1b5d 100644 --- a/src/osgWrappers/serializers/osg/PagedLOD.cpp +++ b/src/osgWrappers/serializers/osg/PagedLOD.cpp @@ -2,6 +2,41 @@ #include #include #include +#include + +// _databasePath +static bool checkDatabasePath( const osg::PagedLOD& node ) +{ + return true; +} + +static bool readDatabasePath( osgDB::InputStream& is, osg::PagedLOD& node ) +{ + bool hasPath; is >> hasPath; + if ( !hasPath ) + { + if ( is.getOptions() && !is.getOptions()->getDatabasePathList().empty() ) + { + const std::string& optionPath = is.getOptions()->getDatabasePathList().front(); + if ( !optionPath.empty() ) node.setDatabasePath( optionPath ); + } + } + else + { + std::string path; is.readWrappedString( path ); + node.setDatabasePath( path ); + } + return true; +} + +static bool writeDatabasePath( osgDB::OutputStream& os, const osg::PagedLOD& node ) +{ + os << (!node.getDatabasePath().empty()); + if ( !node.getDatabasePath().empty() ) + os.writeWrappedString( node.getDatabasePath() ); + os << std::endl; + return true; +} // _perRangeDataList static bool checkRangeDataList( const osg::PagedLOD& node ) @@ -15,16 +50,18 @@ static bool readRangeDataList( osgDB::InputStream& is, osg::PagedLOD& node ) for ( unsigned int i=0; i> offset >> scale >> timeStamp >> frameNumber; - node.setFileName( i, name ); + } + is >> osgDB::END_BRACKET; + + size = 0; is >> osgDB::PROPERTY("PriorityList") >> size >> osgDB::BEGIN_BRACKET; + for ( unsigned int i=0; i> offset >> scale; + node.setPriorityOffset( i, offset ); node.setPriorityScale( i, scale ); - node.setTimeStamp( i, timeStamp ); - node.setFrameNumber( i, frameNumber ); } is >> osgDB::END_BRACKET; return true; @@ -37,8 +74,15 @@ static bool writeRangeDataList( osgDB::OutputStream& os, const osg::PagedLOD& no for ( unsigned int i=0; i +#include +#include +#include + +static bool checkLayers( const osgTerrain::CompositeLayer& layer ) +{ + return layer.getNumLayers()>0; +} + +static bool readLayers( osgDB::InputStream& is, osgTerrain::CompositeLayer& layer ) +{ + unsigned int size = 0; is >> size >> osgDB::BEGIN_BRACKET; + for ( unsigned int i=0; i( is.readObject() ); + if ( child ) layer.addLayer( child ); + } + is >> osgDB::END_BRACKET; + return true; +} + +static bool writeLayers( osgDB::OutputStream& os, const osgTerrain::CompositeLayer& layer ) +{ + unsigned int size = layer.getNumLayers(); + os << size << osgDB::BEGIN_BRACKET << std::endl; + for ( unsigned int i=0; i +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_ContourLayer, + new osgTerrain::ContourLayer, + osgTerrain::ContourLayer, + "osg::Object osgTerrain::Layer osgTerrain::ContourLayer" ) +{ + ADD_OBJECT_SERIALIZER( TransferFunction, osg::TransferFunction1D, NULL ); // _tf +} diff --git a/src/osgWrappers/serializers/osgTerrain/GeometryTechnique.cpp b/src/osgWrappers/serializers/osgTerrain/GeometryTechnique.cpp new file mode 100644 index 000000000..f5c1d03c9 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/GeometryTechnique.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +static bool checkFilterMatrix( const osgTerrain::GeometryTechnique& tech ) +{ + return true; +} + +static bool readFilterMatrix( osgDB::InputStream& is, osgTerrain::GeometryTechnique& tech ) +{ + osg::Matrix3 matrix; + is >> osgDB::BEGIN_BRACKET; + for ( int r=0; r<3; ++r ) + { + is >> matrix(r, 0) >> matrix(r, 1) >> matrix(r, 2); + } + is >> osgDB::END_BRACKET; + tech.setFilterMatrix( matrix ); + return true; +} + +static bool writeFilterMatrix( osgDB::OutputStream& os, const osgTerrain::GeometryTechnique& tech ) +{ + const osg::Matrix3& matrix = tech.getFilterMatrix(); + os << osgDB::BEGIN_BRACKET << std::endl; + for ( int r=0; r<3; ++r ) + { + os << matrix(r, 0) << matrix(r, 1) << matrix(r, 2) << std::endl; + } + os << osgDB::END_BRACKET << std::endl; + return true; +} + +REGISTER_OBJECT_WRAPPER( osgTerrain_GeometryTechnique, + new osgTerrain::GeometryTechnique, + osgTerrain::GeometryTechnique, + "osg::Object osgTerrain::TerrainTechnique osgTerrain::GeometryTechnique" ) +{ + ADD_FLOAT_SERIALIZER( FilterBias, 0.0f ); // _filterBias + ADD_FLOAT_SERIALIZER( FilterWidth, 0.1f ); // _filterWidth + ADD_USER_SERIALIZER( FilterMatrix ); // _filterMatrix +} diff --git a/src/osgWrappers/serializers/osgTerrain/HeightFieldLayer.cpp b/src/osgWrappers/serializers/osgTerrain/HeightFieldLayer.cpp new file mode 100644 index 000000000..d7c054cf8 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/HeightFieldLayer.cpp @@ -0,0 +1,12 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_HeightFieldLayer, + new osgTerrain::HeightFieldLayer, + osgTerrain::HeightFieldLayer, + "osg::Object osgTerrain::Layer osgTerrain::HeightFieldLayer" ) +{ + ADD_OBJECT_SERIALIZER( HeightField, osg::HeightField, NULL ); // _heightField +} diff --git a/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp b/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp new file mode 100644 index 000000000..8e36b4d8a --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/ImageLayer.cpp @@ -0,0 +1,12 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_ImageLayer, + new osgTerrain::ImageLayer, + osgTerrain::ImageLayer, + "osg::Object osgTerrain::Layer osgTerrain::ImageLayer" ) +{ + ADD_IMAGE_SERIALIZER( Image, osg::Image, NULL ); // _image +} diff --git a/src/osgWrappers/serializers/osgTerrain/Layer.cpp b/src/osgWrappers/serializers/osgTerrain/Layer.cpp new file mode 100644 index 000000000..04e8c48c8 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/Layer.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +static bool checkValidDataOperator( const osgTerrain::Layer& layer ) +{ + return layer.getValidDataOperator()!=NULL; +} + +static bool readValidDataOperator( osgDB::InputStream& is, osgTerrain::Layer& layer ) +{ + unsigned int type; is >> type; + switch ( type ) + { + case 1: + { + float value; is >> value; + layer.setValidDataOperator( new osgTerrain::NoDataValue(value) ); + } + break; + case 2: + { + float min, max; is >> min >> max; + layer.setValidDataOperator( new osgTerrain::ValidRange(min, max) ); + } + break; + default: + break; + } + return true; +} + +static bool writeValidDataOperator( osgDB::OutputStream& os, const osgTerrain::Layer& layer ) +{ + const osgTerrain::NoDataValue* ndv = dynamic_cast( layer.getValidDataOperator() ); + if ( ndv ) + { + os << (unsigned int)1 << ndv->getValue() << std::endl; + return true; + } + + const osgTerrain::ValidRange* vr = dynamic_cast( layer.getValidDataOperator() ); + if ( vr ) + { + os << (unsigned int)2 << vr->getMinValue() << vr->getMaxValue() << std::endl; + return true; + } + + os << (unsigned int)0 << std::endl; + return true; +} + +REGISTER_OBJECT_WRAPPER( osgTerrain_Layer, + new osgTerrain::Layer, + osgTerrain::Layer, + "osg::Object osgTerrain::Layer" ) +{ + ADD_STRING_SERIALIZER( FileName, "" ); // _filename + ADD_OBJECT_SERIALIZER( Locator, osgTerrain::Locator, NULL ); // _locator + ADD_UINT_SERIALIZER( MinLevel, 0 ); // _minLevel + ADD_UINT_SERIALIZER( MaxLevel, MAXIMUM_NUMBER_OF_LEVELS ); // _maxLevel + ADD_USER_SERIALIZER( ValidDataOperator ); // _validDataOperator + ADD_VEC4_SERIALIZER( DefaultValue, osg::Vec4() ); // _defaultValue + ADD_GLENUM_SERIALIZER( MinFilter, osg::Texture::FilterMode, osg::Texture::LINEAR_MIPMAP_LINEAR ); // _minFilter + ADD_GLENUM_SERIALIZER( MagFilter, osg::Texture::FilterMode, osg::Texture::LINEAR ); // _magFilter +} diff --git a/src/osgWrappers/serializers/osgTerrain/Locator.cpp b/src/osgWrappers/serializers/osgTerrain/Locator.cpp new file mode 100644 index 000000000..1c86b7e52 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/Locator.cpp @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_Locator, + new osgTerrain::Locator, + osgTerrain::Locator, + "osg::Object osgTerrain::Locator" ) +{ + BEGIN_ENUM_SERIALIZER( CoordinateSystemType, PROJECTED ); + ADD_ENUM_VALUE( GEOCENTRIC ); + ADD_ENUM_VALUE( GEOGRAPHIC ); + ADD_ENUM_VALUE( PROJECTED ); + END_ENUM_SERIALIZER(); // _coordinateSystemType + + ADD_STRING_SERIALIZER( Format, "" ); // _format + ADD_STRING_SERIALIZER( CoordinateSystem, "" ); // _cs + ADD_OBJECT_SERIALIZER( EllipsoidModel, osg::EllipsoidModel, NULL ); // _ellipsoidModel + ADD_MATRIXD_SERIALIZER( Transform, osg::Matrixd() ); // _transform + ADD_BOOL_SERIALIZER( DefinedInFile, false ); // _definedInFile + ADD_BOOL_SERIALIZER( TransformScaledByResolution, false ); // _transformScaledByResolution +} diff --git a/src/osgWrappers/serializers/osgTerrain/ProxyLayer.cpp b/src/osgWrappers/serializers/osgTerrain/ProxyLayer.cpp new file mode 100644 index 000000000..ee6d3d617 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/ProxyLayer.cpp @@ -0,0 +1,12 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_ProxyLayer, + new osgTerrain::ProxyLayer, + osgTerrain::ProxyLayer, + "osg::Object osgTerrain::Layer osgTerrain::ProxyLayer" ) +{ + ADD_OBJECT_SERIALIZER( Implementation, osgTerrain::Layer, NULL ); // _implementation +} diff --git a/src/osgWrappers/serializers/osgTerrain/SwitchLayer.cpp b/src/osgWrappers/serializers/osgTerrain/SwitchLayer.cpp new file mode 100644 index 000000000..3fc14b463 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/SwitchLayer.cpp @@ -0,0 +1,12 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_SwitchLayer, + new osgTerrain::SwitchLayer, + osgTerrain::SwitchLayer, + "osg::Object osgTerrain::Layer osgTerrain::CompositeLayer osgTerrain::SwitchLayer" ) +{ + ADD_INT_SERIALIZER( ActiveLayer, -1 ); // _activeLayer +} diff --git a/src/osgWrappers/serializers/osgTerrain/Terrain.cpp b/src/osgWrappers/serializers/osgTerrain/Terrain.cpp new file mode 100644 index 000000000..ae5c73d5a --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/Terrain.cpp @@ -0,0 +1,13 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_Terrain, + new osgTerrain::Terrain, + osgTerrain::Terrain, + "osg::Object osg::Node osg::Group osgTerrain::Terrain" ) +{ + ADD_FLOAT_SERIALIZER( SampleRatio, 1.0f ); // _sampleRatio + ADD_FLOAT_SERIALIZER( VerticalScale, 1.0f ); // _verticalScale +} diff --git a/src/osgWrappers/serializers/osgTerrain/TerrainTechnique.cpp b/src/osgWrappers/serializers/osgTerrain/TerrainTechnique.cpp new file mode 100644 index 000000000..101bc84a9 --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/TerrainTechnique.cpp @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +REGISTER_OBJECT_WRAPPER( osgTerrain_TerrainTechnique, + new osgTerrain::TerrainTechnique, + osgTerrain::TerrainTechnique, + "osg::Object osgTerrain::TerrainTechnique" ) +{ +} diff --git a/src/osgWrappers/serializers/osgTerrain/TerrainTile.cpp b/src/osgWrappers/serializers/osgTerrain/TerrainTile.cpp new file mode 100644 index 000000000..84d979d1c --- /dev/null +++ b/src/osgWrappers/serializers/osgTerrain/TerrainTile.cpp @@ -0,0 +1,69 @@ +#include +#include +#include +#include + +// _tileID +static bool checkTileID( const osgTerrain::TerrainTile& tile ) +{ + return tile.getTileID().valid(); +} + +static bool readTileID( osgDB::InputStream& is, osgTerrain::TerrainTile& tile ) +{ + osgTerrain::TileID id; + is >> id.level >> id.x >> id.y; + tile.setTileID( id ); + return true; +} + +static bool writeTileID( osgDB::OutputStream& os, const osgTerrain::TerrainTile& tile ) +{ + const osgTerrain::TileID& id = tile.getTileID(); + os << id.level << id.x << id.y << std::endl; + return true; +} + +// _colorLayers +static bool checkColorLayers( const osgTerrain::TerrainTile& tile ) +{ + return tile.getNumColorLayers()>0; +} + +static bool readColorLayers( osgDB::InputStream& is, osgTerrain::TerrainTile& tile ) +{ + unsigned int size = 0; is >> size >> osgDB::BEGIN_BRACKET; + for ( unsigned int i=0; i( is.readObject() ); + if ( layer ) tile.setColorLayer( i, layer ); + } + is >> osgDB::END_BRACKET; + return true; +} + +static bool writeColorLayers( osgDB::OutputStream& os, const osgTerrain::TerrainTile& tile ) +{ + unsigned int size = tile.getNumColorLayers(); + os << size << osgDB::BEGIN_BRACKET << std::endl; + for ( unsigned int i=0; i