From Wang Rui, "I modified the Serializer header to add a UPDATE_TO_VERSION_SCOPED

macro, which could set version within brackets and reset it after
that. All related serializers are also modified so that the
backward-compatibility bug reported by Farshid can be fixed.
"

From Robert Osfield, removed the use of osg::Referenced and creating the proxy object on the heap.
This commit is contained in:
Robert Osfield 2012-10-09 16:05:50 +00:00
parent 16de7e9f33
commit 9fab99ddd9
8 changed files with 28 additions and 7 deletions

View File

@ -50,7 +50,9 @@ public:
ObjectWrapper( osg::Object* proto, const std::string& name,
const std::string& associates );
void setUpdatedVersion( int ver ) { _version = ver; }
int getUpdatedVersion() const { return _version; }
const osg::Object* getProto() const { return _proto.get(); }
const std::string& getName() const { return _name; }
@ -83,6 +85,23 @@ protected:
int _version; // Last updated version of the wrapper
};
struct UpdateWrapperVersionProxy
{
UpdateWrapperVersionProxy( ObjectWrapper* w, int v ): _wrapper(w)
{
_lastVersion = w->getUpdatedVersion();
w->setUpdatedVersion(v);
}
~UpdateWrapperVersionProxy()
{
_wrapper->setUpdatedVersion(_lastVersion);
}
ObjectWrapper* _wrapper;
int _lastVersion;
};
class Registry;
class OSGDB_EXPORT ObjectWrapperManager : public osg::Referenced

View File

@ -977,6 +977,9 @@ public:
#define UPDATE_TO_VERSION(VER) \
wrapper->setUpdatedVersion( (VER) );
#define UPDATE_TO_VERSION_SCOPED(VER) \
osgDB::UpdateWrapperVersionProxy uwvp(wrapper, (VER));
#define REMOVE_SERIALIZER(PROP) \
wrapper->markSerializerAsRemoved( #PROP );

View File

@ -79,8 +79,8 @@ REGISTER_OBJECT_WRAPPER( Node,
ADD_HEXINT_SERIALIZER( NodeMask, 0xffffffff ); // _nodeMask
ADD_USER_SERIALIZER( Descriptions ); // _descriptions, deprecated
UPDATE_TO_VERSION( 77 )
{
UPDATE_TO_VERSION_SCOPED( 77 )
REMOVE_SERIALIZER( Descriptions );
}

View File

@ -42,9 +42,8 @@ REGISTER_OBJECT_WRAPPER( Object,
END_ENUM_SERIALIZER(); // _dataVariance
ADD_USER_SERIALIZER( UserData ); // _userData, deprecated
UPDATE_TO_VERSION( 77 )
{
UPDATE_TO_VERSION_SCOPED( 77 )
REMOVE_SERIALIZER( UserData );
ADD_OBJECT_SERIALIZER( UserDataContainer, osg::UserDataContainer, NULL );
}

View File

@ -145,8 +145,8 @@ REGISTER_OBJECT_WRAPPER( PagedLOD,
ADD_USER_SERIALIZER( RangeDataList ); // _perRangeDataList
ADD_USER_SERIALIZER( Children ); // _children (which are not loaded from external)
UPDATE_TO_VERSION( 70 )
{
UPDATE_TO_VERSION_SCOPED( 70 )
REMOVE_SERIALIZER( FrameNumberOfLastTraversal );
}

View File

@ -15,8 +15,8 @@ REGISTER_OBJECT_WRAPPER( osgText_Text3D,
ADD_ENUM_VALUE( PER_GLYPH );
END_ENUM_SERIALIZER(); // _renderMode
UPDATE_TO_VERSION( 68 )
{
UPDATE_TO_VERSION_SCOPED( 68 )
ADD_VEC4_SERIALIZER( Color, osg::Vec4(1.0,1.0,1.0,1.0) ); // _color
}
}

View File

@ -42,8 +42,8 @@ REGISTER_OBJECT_WRAPPER( osgVolume_Locator,
ADD_MATRIXD_SERIALIZER( Transform, osg::Matrixd() ); // _transform
ADD_USER_SERIALIZER( LocatorCallbacks );
UPDATE_TO_VERSION( 90 )
{
UPDATE_TO_VERSION_SCOPED( 90 )
REMOVE_SERIALIZER( LocatorCallbacks );
}
}

View File

@ -28,8 +28,8 @@ REGISTER_OBJECT_WRAPPER( osgVolume_VolumeTile,
"osg::Object osg::Node osg::Group osgVolume::VolumeTile" )
{
ADD_OBJECT_SERIALIZER( Volume, osgVolume::Volume, NULL ); // _volume
UPDATE_TO_VERSION( 90 )
{
UPDATE_TO_VERSION_SCOPED( 90 )
REMOVE_SERIALIZER( Volume );
}