#include #include #include #include static int readValue( osgDB::InputStream& is ) { int value = osg::StateAttribute::INHERIT; if ( is.isBinary() ) is >> value; else { std::string enumValue; is >> enumValue; if ( enumValue=="OFF" ) value = osg::StateAttribute::OFF; else if ( enumValue=="ON" ) value = osg::StateAttribute::ON; else if ( enumValue=="INHERIT" ) value = osg::StateAttribute::INHERIT; else if ( enumValue=="OFF|OVERRIDE" ) value = osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE; else if ( enumValue=="OFF|PROTECTED" ) value = osg::StateAttribute::OFF|osg::StateAttribute::PROTECTED; else if ( enumValue=="ON|OVERRIDE" ) value = osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE; else if ( enumValue=="ON|PROTECTED" ) value = osg::StateAttribute::ON|osg::StateAttribute::PROTECTED; } return value; } static void readModes( osgDB::InputStream& is, osg::StateSet::ModeList& modes ) { unsigned int size = 0; is >> size; if ( size>0 ) { is >> osgDB::BEGIN_BRACKET; for ( unsigned int i=0; i> mode; int value = readValue( is ); modes[mode.get()] = (osg::StateAttribute::Values)value; } is >> osgDB::END_BRACKET; } } static void readAttributes( osgDB::InputStream& is, osg::StateSet::AttributeList& attrs ) { unsigned int size = 0; is >> size; if ( size>0 ) { is >> osgDB::BEGIN_BRACKET; for ( unsigned int i=0; i( is.readObject() ); is >> osgDB::PROPERTY("Value"); int value = readValue( is ); if ( sa ) attrs[sa->getTypeMemberPair()] = osg::StateSet::RefAttributePair(sa,value); } is >> osgDB::END_BRACKET; } } static void writeValue( osgDB::OutputStream& os, int value ) { if ( os.isBinary() ) os << value; else { if ( value==osg::StateAttribute::OFF ) os << std::string("OFF"); else if ( value==osg::StateAttribute::ON ) os << std::string("ON"); else if ( value==osg::StateAttribute::INHERIT ) os << std::string("INHERIT"); else if ( value==osg::StateAttribute::OFF+osg::StateAttribute::OVERRIDE ) os << std::string("OFF|OVERRIDE"); else if ( value==osg::StateAttribute::OFF+osg::StateAttribute::PROTECTED ) os << std::string("OFF|PROTECTED"); else if ( value==osg::StateAttribute::ON+osg::StateAttribute::OVERRIDE ) os << std::string("ON|OVERRIDE"); else if ( value==osg::StateAttribute::ON+osg::StateAttribute::PROTECTED ) os << std::string("ON|PROTECTED"); else os << std::string("INHERIT"); } } static void writeModes( osgDB::OutputStream& os, const osg::StateSet::ModeList& modes ) { os << modes.size(); if ( modes.size()>0 ) { os << osgDB::BEGIN_BRACKET << std::endl; for ( osg::StateSet::ModeList::const_iterator itr=modes.begin(); itr!=modes.end(); ++itr ) { os << GLENUM(itr->first); writeValue(os, itr->second); os << std::endl; } os << osgDB::END_BRACKET; } os << std::endl; } static void writeAttributes( osgDB::OutputStream& os, const osg::StateSet::AttributeList& attrs ) { os << attrs.size(); if ( attrs.size()>0 ) { os << osgDB::BEGIN_BRACKET << std::endl; for ( osg::StateSet::AttributeList::const_iterator itr=attrs.begin(); itr!=attrs.end(); ++itr ) { os << itr->second.first.get(); os << osgDB::PROPERTY("Value"); writeValue(os, itr->second.second); os << std::endl; } os << osgDB::END_BRACKET; } os << std::endl; } // _modeList static bool checkModeList( const osg::StateSet& ss ) { return ss.getModeList().size()>0; } static bool readModeList( osgDB::InputStream& is, osg::StateSet& ss ) { osg::StateSet::ModeList modes; readModes( is, modes ); for ( osg::StateSet::ModeList::iterator itr=modes.begin(); itr!=modes.end(); ++itr ) { ss.setMode( itr->first, itr->second ); } return true; } static bool writeModeList( osgDB::OutputStream& os, const osg::StateSet& ss ) { writeModes( os, ss.getModeList() ); return true; } // _attributeList static bool checkAttributeList( const osg::StateSet& ss ) { return ss.getAttributeList().size()>0; } static bool readAttributeList( osgDB::InputStream& is, osg::StateSet& ss ) { osg::StateSet::AttributeList attrs; readAttributes( is, attrs ); for ( osg::StateSet::AttributeList::iterator itr=attrs.begin(); itr!=attrs.end(); ++itr ) { ss.setAttribute( itr->second.first.get(), itr->second.second ); } return true; } static bool writeAttributeList( osgDB::OutputStream& os, const osg::StateSet& ss ) { writeAttributes( os, ss.getAttributeList() ); return true; } // _textureModeList static bool checkTextureModeList( const osg::StateSet& ss ) { return ss.getTextureModeList().size()>0; } static bool readTextureModeList( osgDB::InputStream& is, osg::StateSet& ss ) { unsigned int size = 0; is >> size >> osgDB::BEGIN_BRACKET; osg::StateSet::ModeList modes; for ( unsigned int i=0; i> osgDB::PROPERTY("Data"); readModes( is, modes ); for ( osg::StateSet::ModeList::iterator itr=modes.begin(); itr!=modes.end(); ++itr ) { ss.setTextureMode( i, itr->first, itr->second ); } modes.clear(); } is >> osgDB::END_BRACKET; return true; } static bool writeTextureModeList( osgDB::OutputStream& os, const osg::StateSet& ss ) { const osg::StateSet::TextureModeList& tml = ss.getTextureModeList(); os << tml.size() << osgDB::BEGIN_BRACKET << std::endl; for ( osg::StateSet::TextureModeList::const_iterator itr=tml.begin(); itr!=tml.end(); ++itr ) { os << osgDB::PROPERTY("Data"); writeModes( os, *itr ); } os << osgDB::END_BRACKET << std::endl; return true; } // _textureAttributeList static bool checkTextureAttributeList( const osg::StateSet& ss ) { return ss.getTextureAttributeList().size()>0; } static bool readTextureAttributeList( osgDB::InputStream& is, osg::StateSet& ss ) { unsigned int size = 0; is >> size >> osgDB::BEGIN_BRACKET; osg::StateSet::AttributeList attrs; for ( unsigned int i=0; i> osgDB::PROPERTY("Data"); readAttributes( is, attrs ); for ( osg::StateSet::AttributeList::iterator itr=attrs.begin(); itr!=attrs.end(); ++itr ) { ss.setTextureAttribute( i, itr->second.first.get(), itr->second.second ); } attrs.clear(); } is >> osgDB::END_BRACKET; return true; } static bool writeTextureAttributeList( osgDB::OutputStream& os, const osg::StateSet& ss ) { const osg::StateSet::TextureAttributeList& tal = ss.getTextureAttributeList(); os << tal.size() << osgDB::BEGIN_BRACKET << std::endl; for ( osg::StateSet::TextureAttributeList::const_iterator itr=tal.begin(); itr!=tal.end(); ++itr ) { os << osgDB::PROPERTY("Data"); writeAttributes( os, *itr ); } os << osgDB::END_BRACKET << std::endl; return true; } // _uniformList static bool checkUniformList( const osg::StateSet& ss ) { return ss.getUniformList().size()>0; } static bool readUniformList( osgDB::InputStream& is, osg::StateSet& ss ) { unsigned int size = 0; is >> size >> osgDB::BEGIN_BRACKET; for ( unsigned int i=0; i( is.readObject() ); is >> osgDB::PROPERTY("Value"); int value = readValue( is ); if ( uniform ) ss.addUniform( uniform, (osg::StateAttribute::Values)value ); } is >> osgDB::END_BRACKET; return true; } static bool writeUniformList( osgDB::OutputStream& os, const osg::StateSet& ss ) { const osg::StateSet::UniformList& ul = ss.getUniformList(); os << ul.size() << osgDB::BEGIN_BRACKET << std::endl; for ( osg::StateSet::UniformList::const_iterator itr=ul.begin(); itr!=ul.end(); ++itr ) { os << itr->second.first.get(); os << osgDB::PROPERTY("Value"); writeValue(os, itr->second.second); os << std::endl; } os << osgDB::END_BRACKET << std::endl; return true; } REGISTER_OBJECT_WRAPPER( StateSet, new osg::StateSet, osg::StateSet, "osg::Object osg::StateSet" ) { ADD_USER_SERIALIZER( ModeList ); // _modeList ADD_USER_SERIALIZER( AttributeList ); // _attributeList ADD_USER_SERIALIZER( TextureModeList ); // _textureModeList ADD_USER_SERIALIZER( TextureAttributeList ); // _textureAttributeList ADD_USER_SERIALIZER( UniformList ); // _uniformList ADD_INT_SERIALIZER( RenderingHint, osg::StateSet::DEFAULT_BIN ); // _renderingHint BEGIN_ENUM_SERIALIZER( RenderBinMode, INHERIT_RENDERBIN_DETAILS ); ADD_ENUM_VALUE( INHERIT_RENDERBIN_DETAILS ); ADD_ENUM_VALUE( USE_RENDERBIN_DETAILS ); ADD_ENUM_VALUE( OVERRIDE_RENDERBIN_DETAILS ); END_ENUM_SERIALIZER(); // _binMode ADD_INT_SERIALIZER( BinNumber, 0 ); // _binNum ADD_STRING_SERIALIZER( BinName, "" ); // _binName ADD_BOOL_SERIALIZER( NestRenderBins, true ); // _nestRenderBins ADD_OBJECT_SERIALIZER( UpdateCallback, osg::StateSet::Callback, NULL ); // _updateCallback ADD_OBJECT_SERIALIZER( EventCallback, osg::StateSet::Callback, NULL ); // _eventCallback }