diff --git a/include/osgDB/ObjectWrapper b/include/osgDB/ObjectWrapper index 66539821a..8003cb8a3 100644 --- a/include/osgDB/ObjectWrapper +++ b/include/osgDB/ObjectWrapper @@ -21,9 +21,6 @@ namespace osgDB { -typedef std::vector StringList; -extern OSGDB_EXPORT void split( const std::string& src, StringList& list, char separator=' ' ); - struct MethodObject : public osg::Referenced { typedef std::vector< osg::ref_ptr > Parameters; diff --git a/include/osgDB/Serializer b/include/osgDB/Serializer index e524fbd22..1ae562b52 100644 --- a/include/osgDB/Serializer +++ b/include/osgDB/Serializer @@ -28,6 +28,10 @@ namespace osgDB { +typedef std::vector StringList; +extern OSGDB_EXPORT void split( const std::string& src, StringList& list, char separator=' ' ); + + #ifndef OBJECT_CAST #define OBJECT_CAST static_cast #endif @@ -1421,6 +1425,96 @@ public: Setter _setter; }; +template +class BitFlagsSerializer : public osgDB::TemplateSerializer

+{ +public: + typedef TemplateSerializer

ParentType; + typedef P (C::*Getter)() const; + typedef void (C::*Setter)( P ); + + BitFlagsSerializer( const char* name, P def, Getter gf, Setter sf ) + : ParentType(name, def), _getter(gf), _setter(sf) {} + + void add( const char* str, P value ) + { + _lookup.add(str, static_cast(value)); + } + + P getValue( const char* str ) + { return static_cast

(_lookup.getValue(str)); } + + const std::string& getString( P value ) + { return _lookup.getString(static_cast(value)); } + + virtual bool read( osgDB::InputStream& is, osg::Object& obj ) + { + C& object = OBJECT_CAST(obj); + if ( is.isBinary() ) + { + bool ok = false; is >> ok; //code from user serialized ensuring backwards-compatibility + if ( !ok ) return true; + + P mask; + is >> mask; + (object.*_setter)( mask ); + } + else + { + if ( !is.matchString(ParentType::_name) ) //code from user serialized ensuring backwards-compatibility + return true; + P mask=P(); + std::string maskSetString; + is >> maskSetString; + osgDB::StringList maskList; + osgDB::split( maskSetString, maskList, '|' ); + for ( unsigned int i=0; i(obj); + const P mask = (object.*_getter)(); + bool ok = ParentType::_defaultValue!=static_cast

(mask); + if ( os.isBinary() ) + { + os << ok; + if ( !ok ) + return true; + os << (int)mask; //just write int value in binary case + } + else + { + if ( !ok ) + return true; + os << os.PROPERTY(ParentType::_name.c_str()); + + std::string maskString; + const osgDB::IntLookup::ValueToString& v2sm = _lookup.getValueToString(); + for( osgDB::IntLookup::ValueToString::const_iterator itr = v2sm.begin() ; itr != v2sm.end() ; itr++) + if( (mask & itr->first) != 0 ) + maskString += std::string(itr->second + "|"); + + if ( !maskString.size() ) + maskString = std::string("NONE|"); + maskString.erase(maskString.size()-1,1); + os << maskString << std::endl; //remove last "|" + } + return true; + } + +public: + Getter _getter; + Setter _setter; + +protected: + osgDB::IntLookup _lookup; +}; + // ADDING MANIPULATORS #define ADD_SERIALIZER(S) \ wrapper->addSerializer( (S) ) @@ -1745,6 +1839,17 @@ public: #define END_ENUM_SERIALIZER() \ wrapper->addSerializer(serializer.get(), osgDB::BaseSerializer::RW_ENUM); } +#define BEGIN_BITFLAGS_SERIALIZER(PROP, DEF) \ + { typedef osgDB::BitFlagsSerializer MySerializer; \ + osg::ref_ptr serializer = new MySerializer( \ + #PROP, DEF, &MyClass::get##PROP, &MyClass::set##PROP) + +#define ADD_BITFLAG_VALUE(VALUE_NAME, VALUE) \ + serializer->add(#VALUE_NAME, VALUE) + +#define END_BITFLAGS_SERIALIZER() \ + wrapper->addSerializer(serializer.get(), osgDB::BaseSerializer::RW_INT); } + // VERSION CONTROL OPERATORS #define UPDATE_TO_VERSION(VER) \ wrapper->setUpdatedVersion( (VER) ); diff --git a/src/osgWrappers/serializers/osg/Camera.cpp b/src/osgWrappers/serializers/osg/Camera.cpp index 2a57b8209..93e2261ac 100644 --- a/src/osgWrappers/serializers/osg/Camera.cpp +++ b/src/osgWrappers/serializers/osg/Camera.cpp @@ -104,55 +104,6 @@ static void writeBufferAttachment( osgDB::OutputStream& os, const osg::Camera::A os << os.PROPERTY("MultisampleColorSamples") << attachment._multisampleColorSamples << std::endl; } -// _clearMask -static bool checkClearMask( const osg::Camera& node ) -{ - return node.getClearMask()!=(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); -} - -static bool readClearMask( osgDB::InputStream& is, osg::Camera& node ) -{ - GLbitfield mask = 0; - if ( is.isBinary() ) - { - int maskValue; is >> maskValue; - mask = (GLbitfield)maskValue; - } - else - { - std::string maskSetString; is >> maskSetString; - osgDB::StringList maskList; osgDB::split( maskSetString, maskList, '|' ); - for ( unsigned int i=0; i> maskValue; - mask = (GLbitfield)maskValue; - } - else - { - std::string maskSetString; is >> maskSetString; - osgDB::StringList maskList; osgDB::split( maskSetString, maskList, '|' ); - for ( unsigned int i=0; i> mask; - else - { - std::string maskSetString; is >> maskSetString; - osgDB::StringList maskList; osgDB::split( maskSetString, maskList, '|' ); - for ( unsigned int i=0; i