Added Vector serialization and support in lua plugin top enable script users to set/get vector properties such as osg::Array, osg::PrimitiveSet and children lists.
This commit is contained in:
@@ -53,44 +53,50 @@ class OSG_EXPORT Geometry : public Drawable
|
||||
const Array* getVertexArray() const { return _vertexArray.get(); }
|
||||
|
||||
|
||||
void setNormalArray(Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setNormalArray(Array* array) { setNormalArray(array, osg::Array::BIND_UNDEFINED); }
|
||||
void setNormalArray(Array* array, osg::Array::Binding binding);
|
||||
Array* getNormalArray() { return _normalArray.get(); }
|
||||
const Array* getNormalArray() const { return _normalArray.get(); }
|
||||
|
||||
|
||||
|
||||
void setColorArray(Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setColorArray(Array* array) { setColorArray(array, osg::Array::BIND_UNDEFINED); }
|
||||
void setColorArray(Array* array, osg::Array::Binding binding);
|
||||
Array* getColorArray() { return _colorArray.get(); }
|
||||
const Array* getColorArray() const { return _colorArray.get(); }
|
||||
|
||||
|
||||
|
||||
void setSecondaryColorArray(Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setSecondaryColorArray(Array* array) { setSecondaryColorArray(array, osg::Array::BIND_UNDEFINED); }
|
||||
void setSecondaryColorArray(Array* array, osg::Array::Binding binding);
|
||||
Array* getSecondaryColorArray() { return _secondaryColorArray.get(); }
|
||||
const Array* getSecondaryColorArray() const { return _secondaryColorArray.get(); }
|
||||
|
||||
|
||||
void setFogCoordArray(Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setFogCoordArray(Array* array) { setFogCoordArray(array, osg::Array::BIND_UNDEFINED); }
|
||||
void setFogCoordArray(Array* array, osg::Array::Binding binding);
|
||||
Array* getFogCoordArray() { return _fogCoordArray.get(); }
|
||||
const Array* getFogCoordArray() const { return _fogCoordArray.get(); }
|
||||
|
||||
|
||||
void setTexCoordArray(unsigned int unit,Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setTexCoordArray(unsigned int unit, Array* array) { setTexCoordArray(unit, array, osg::Array::BIND_UNDEFINED); }
|
||||
void setTexCoordArray(unsigned int unit, Array* array, osg::Array::Binding binding);
|
||||
Array* getTexCoordArray(unsigned int unit);
|
||||
const Array* getTexCoordArray(unsigned int unit) const;
|
||||
|
||||
unsigned int getNumTexCoordArrays() const { return static_cast<unsigned int>(_texCoordList.size()); }
|
||||
void setTexCoordArrayList(const ArrayList& arrrayList);
|
||||
ArrayList& getTexCoordArrayList() { return _texCoordList; }
|
||||
const ArrayList& getTexCoordArrayList() const { return _texCoordList; }
|
||||
|
||||
|
||||
|
||||
void setVertexAttribArray(unsigned int index, Array* array, osg::Array::Binding binding=osg::Array::BIND_UNDEFINED);
|
||||
void setVertexAttribArray(unsigned int index, Array* array) { setVertexAttribArray(index, array, osg::Array::BIND_UNDEFINED); }
|
||||
void setVertexAttribArray(unsigned int index, Array* array, osg::Array::Binding binding);
|
||||
Array *getVertexAttribArray(unsigned int index);
|
||||
const Array *getVertexAttribArray(unsigned int index) const;
|
||||
|
||||
|
||||
unsigned int getNumVertexAttribArrays() const { return static_cast<unsigned int>(_vertexAttribList.size()); }
|
||||
void setVertexAttribArrayList(const ArrayList& arrayList);
|
||||
ArrayList& getVertexAttribArrayList() { return _vertexAttribList; }
|
||||
const ArrayList& getVertexAttribArrayList() const { return _vertexAttribList; }
|
||||
|
||||
@@ -175,7 +181,7 @@ class OSG_EXPORT Geometry : public Drawable
|
||||
|
||||
/** Set up the vertex arrays for the purpose of rendering, called by drawImplemtation() prior to it calling drawPrimitivesImplementation().*/
|
||||
void drawVertexArraysImplementation(RenderInfo& renderInfo) const;
|
||||
|
||||
|
||||
/** dispatch the primitives to OpenGL, called by drawImplemtation() after calling drawVertexArraysImplementation().*/
|
||||
void drawPrimitivesImplementation(RenderInfo& renderInfo) const;
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ extern "C" {
|
||||
|
||||
#define OPENSCENEGRAPH_MAJOR_VERSION 3
|
||||
#define OPENSCENEGRAPH_MINOR_VERSION 3
|
||||
#define OPENSCENEGRAPH_PATCH_VERSION 1
|
||||
#define OPENSCENEGRAPH_SOVERSION 111
|
||||
#define OPENSCENEGRAPH_PATCH_VERSION 2
|
||||
#define OPENSCENEGRAPH_SOVERSION 112
|
||||
|
||||
/* Convenience macro that can be used to decide whether a feature is present or not i.e.
|
||||
* #if OSG_MIN_VERSION_REQUIRED(2,9,5)
|
||||
|
||||
@@ -137,14 +137,14 @@ public:
|
||||
InputStream& operator>>( osg::BoundingSpheref& bs );
|
||||
InputStream& operator>>( osg::BoundingSphered& bs );
|
||||
|
||||
InputStream& operator>>( osg::Array*& a ) { a = readArray(); return *this; }
|
||||
InputStream& operator>>( osg::Image*& img ) { img = readImage(); return *this; }
|
||||
InputStream& operator>>( osg::PrimitiveSet*& p ) { p = readPrimitiveSet(); return *this; }
|
||||
InputStream& operator>>( osg::Array*& a ) { if (_fileVersion>=112) a = readObjectOfType<osg::Array>(); else a = readArray(); return *this; }
|
||||
InputStream& operator>>( osg::PrimitiveSet*& p ) { if (_fileVersion>=112) p = readObjectOfType<osg::PrimitiveSet>(); else p = readPrimitiveSet(); return *this; }
|
||||
InputStream& operator>>( osg::Object*& obj ) { obj = readObject(); return *this; }
|
||||
|
||||
InputStream& operator>>( osg::ref_ptr<osg::Array>& ptr ) { ptr = readArray(); return *this; }
|
||||
InputStream& operator>>( osg::ref_ptr<osg::Image>& ptr ) { ptr = readImage(); return *this; }
|
||||
InputStream& operator>>( osg::ref_ptr<osg::PrimitiveSet>& ptr ) { ptr = readPrimitiveSet(); return *this; }
|
||||
InputStream& operator>>( osg::ref_ptr<osg::Array>& ptr ) { if (_fileVersion>=112) ptr = readObjectOfType<osg::Array>(); else ptr = readArray(); return *this; }
|
||||
InputStream& operator>>( osg::ref_ptr<osg::PrimitiveSet>& ptr ) { if (_fileVersion>=112) ptr = readObjectOfType<osg::PrimitiveSet>(); else ptr = readPrimitiveSet(); return *this; }
|
||||
|
||||
template<typename T> InputStream& operator>>( osg::ref_ptr<T>& ptr )
|
||||
{ ptr = static_cast<T*>(readObject()); return *this; }
|
||||
@@ -163,7 +163,19 @@ public:
|
||||
osg::Array* readArray();
|
||||
osg::PrimitiveSet* readPrimitiveSet();
|
||||
osg::Image* readImage(bool readFromExternal=true);
|
||||
|
||||
template<typename T>
|
||||
T* readObjectOfType()
|
||||
{
|
||||
osg::ref_ptr<osg::Object> obj = readObject();
|
||||
T* ptr = dynamic_cast<T*>(obj.get());
|
||||
if (ptr) { obj.release(); return ptr; }
|
||||
else return 0;
|
||||
}
|
||||
|
||||
osg::Object* readObject( osg::Object* existingObj=0 );
|
||||
|
||||
|
||||
osg::Object* readObjectFields( const std::string& className, unsigned int id, osg::Object* existingObj=0);
|
||||
|
||||
/// set an input iterator, used directly when not using InputStream with a traditional file releated stream.
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef OSGDB_OUTPUTSTREAM
|
||||
#define OSGDB_OUTPUTSTREAM
|
||||
|
||||
#include <osg/Version>
|
||||
#include <osg/Vec2>
|
||||
#include <osg/Vec3>
|
||||
#include <osg/Vec4>
|
||||
@@ -142,17 +143,16 @@ public:
|
||||
OutputStream& operator<<( const osg::BoundingSpheref& bb );
|
||||
OutputStream& operator<<( const osg::BoundingSphered& bb );
|
||||
|
||||
OutputStream& operator<<( const osg::Array* a ) { writeArray(a); return *this; }
|
||||
OutputStream& operator<<( const osg::Image* img ) { writeImage(img); return *this; }
|
||||
OutputStream& operator<<( const osg::PrimitiveSet* p ) { writePrimitiveSet(p); return *this; }
|
||||
OutputStream& operator<<( const osg::Array* a ) { if (OPENSCENEGRAPH_SOVERSION>=112) writeObject(a); else writeArray(a); return *this; }
|
||||
OutputStream& operator<<( const osg::PrimitiveSet* p ) { if (OPENSCENEGRAPH_SOVERSION>=112) writeObject(p); else writePrimitiveSet(p); return *this; }
|
||||
OutputStream& operator<<( const osg::Object* obj ) { writeObject(obj); return *this; }
|
||||
|
||||
OutputStream& operator<<( const osg::ref_ptr<osg::Array>& ptr ) { writeArray(ptr.get()); return *this; }
|
||||
OutputStream& operator<<( const osg::ref_ptr<osg::Image>& ptr ) { writeImage(ptr.get()); return *this; }
|
||||
OutputStream& operator<<( const osg::ref_ptr<osg::PrimitiveSet>& ptr ) { writePrimitiveSet(ptr.get()); return *this; }
|
||||
OutputStream& operator<<( const osg::ref_ptr<osg::Array>& ptr ) { if (OPENSCENEGRAPH_SOVERSION>=112) writeObject(ptr.get()); else writeArray(ptr.get()); return *this; }
|
||||
OutputStream& operator<<( const osg::ref_ptr<osg::PrimitiveSet>& ptr ) { if (OPENSCENEGRAPH_SOVERSION>=112) writeObject(ptr.get()); else writePrimitiveSet(ptr.get()); return *this; }
|
||||
|
||||
template<typename T> OutputStream& operator<<( const osg::ref_ptr<T>& ptr )
|
||||
{ writeObject(ptr.get()); return *this; }
|
||||
template<typename T> OutputStream& operator<<( const osg::ref_ptr<T>& ptr ) { writeObject(ptr.get()); return *this; }
|
||||
|
||||
// Convenient methods for writing
|
||||
void writeWrappedString( const std::string& str ) { _out->writeWrappedString(str); }
|
||||
|
||||
@@ -135,7 +135,6 @@ public:
|
||||
/** create an object of specified type for provided compound class name in the form libraryName::className. */
|
||||
osg::Object* createObject(const std::string& compoundClassdName) const;
|
||||
|
||||
|
||||
/// template method for getting property data, return true if property available and the type is compatible, otherwise returns false.
|
||||
template<typename T>
|
||||
bool getProperty(const osg::Object* object, const std::string& propertyName, T& value);
|
||||
@@ -250,7 +249,7 @@ inline bool PropertyInterface::getProperty(const osg::Object* object, const std:
|
||||
if (copyPropertyObjectFromObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>())) return true;
|
||||
else
|
||||
{
|
||||
OSG_NOTICE<<"PropertyInterface::getProperty("<<propertyName<<", "<<value->className()<<") Checking UserDataContainer for object ptr"<<std::endl;
|
||||
OSG_NOTICE<<"PropertyInterface::getProperty("<<propertyName<<", Checking UserDataContainer for object ptr"<<std::endl;
|
||||
const osg::UserDataContainer* udc = object->getUserDataContainer();
|
||||
if (udc)
|
||||
{
|
||||
@@ -294,6 +293,7 @@ inline bool PropertyInterface::setProperty(osg::Object* object, const std::strin
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -135,7 +135,8 @@ public:
|
||||
RW_VEC3B, RW_VEC3UB, RW_VEC3S, RW_VEC3US, RW_VEC3I, RW_VEC3UI,
|
||||
RW_VEC4B, RW_VEC4UB, RW_VEC4S, RW_VEC4US, RW_VEC4I, RW_VEC4UI,
|
||||
RW_BOUNDINGBOXF, RW_BOUNDINGBOXD,
|
||||
RW_BOUNDINGSPHEREF, RW_BOUNDINGSPHERED
|
||||
RW_BOUNDINGSPHEREF, RW_BOUNDINGSPHERED,
|
||||
RW_VECTOR
|
||||
};
|
||||
|
||||
BaseSerializer() : _firstVersion(0), _lastVersion(INT_MAX) {}
|
||||
@@ -784,6 +785,345 @@ public:
|
||||
Setter _setter;
|
||||
};
|
||||
|
||||
class VectorBaseSerializer : public BaseSerializer
|
||||
{
|
||||
public:
|
||||
|
||||
VectorBaseSerializer(BaseSerializer::Type elementType):_elementType(elementType) {}
|
||||
|
||||
Type getElementType() const { return _elementType; }
|
||||
|
||||
virtual unsigned int size(const osg::Object& obj) const { return 0; }
|
||||
virtual void resize(osg::Object& obj, unsigned int numElements) const {}
|
||||
virtual void reserve(osg::Object& obj, unsigned int numElements) const {}
|
||||
virtual void clear(osg::Object& obj) const {}
|
||||
virtual void addElement(osg::Object& obj, void* ptr) const {}
|
||||
virtual void insertElement(osg::Object& obj, unsigned int index, void* ptr) const {}
|
||||
virtual void setElement(osg::Object& obj, unsigned int index, void* ptr) const {}
|
||||
virtual void* getElement(osg::Object& obj, unsigned int index) const { return 0; }
|
||||
virtual const void* getElement(const osg::Object& obj, unsigned int index) const { return 0; }
|
||||
|
||||
protected:
|
||||
Type _elementType;
|
||||
};
|
||||
|
||||
|
||||
template<typename C, typename P>
|
||||
class VectorSerializer : public VectorBaseSerializer
|
||||
{
|
||||
public:
|
||||
typedef typename P::value_type ValueType;
|
||||
typedef typename P::const_iterator ConstIterator;
|
||||
typedef P& (C::*Getter)();
|
||||
typedef const P& (C::*ConstGetter)() const;
|
||||
typedef void (C::*Setter)( const P& );
|
||||
|
||||
VectorSerializer( const char* name, ConstGetter cgf, Getter gf, Setter sf, BaseSerializer::Type elementType, unsigned int numElementsOnRow):
|
||||
VectorBaseSerializer(elementType),
|
||||
_name(name),
|
||||
_constgetter(cgf), _getter(gf), _setter(sf),
|
||||
_numElementsOnRow(numElementsOnRow) {}
|
||||
|
||||
virtual const std::string& getName() const { return _name; }
|
||||
|
||||
virtual unsigned int size(const osg::Object& obj) const
|
||||
{
|
||||
const C& object = OBJECT_CAST<const C&>(obj);
|
||||
const P& list = (object.*_constgetter)();
|
||||
return static_cast<unsigned int>(list.size());
|
||||
}
|
||||
virtual void resize(osg::Object& obj, unsigned int numElements) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
list.resize(numElements);
|
||||
}
|
||||
virtual void reserve(osg::Object& obj, unsigned int numElements) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
list.reserve(numElements);
|
||||
}
|
||||
virtual void clear(osg::Object& obj) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
list.clear();
|
||||
}
|
||||
virtual void addElement(osg::Object& obj, void* ptr) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
list.push_back(*reinterpret_cast<ValueType*>(ptr));
|
||||
}
|
||||
virtual void insertElement(osg::Object& obj, unsigned int index, void* ptr) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
if (index>=list.size()) list.resize(index+1);
|
||||
list.insert(list.begin()+index, *reinterpret_cast<ValueType*>(ptr));
|
||||
}
|
||||
virtual void setElement(osg::Object& obj, unsigned int index, void* ptr) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
if (index>=list.size()) list.resize(index+1);
|
||||
list[index] = *reinterpret_cast<ValueType*>(ptr);
|
||||
}
|
||||
virtual void* getElement(osg::Object& obj, unsigned int index) const
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
P& list = (object.*_getter)();
|
||||
if (index>=list.size()) return 0;
|
||||
else return &list[index];
|
||||
}
|
||||
virtual const void* getElement(const osg::Object& obj, unsigned int index) const
|
||||
{
|
||||
const C& object = OBJECT_CAST<const C&>(obj);
|
||||
const P& list = (object.*_constgetter)();
|
||||
if (index>=list.size()) return 0;
|
||||
else return &list[index];
|
||||
}
|
||||
|
||||
virtual bool read( InputStream& is, osg::Object& obj )
|
||||
{
|
||||
C& object = OBJECT_CAST<C&>(obj);
|
||||
unsigned int size = 0;
|
||||
P list;
|
||||
if ( is.isBinary() )
|
||||
{
|
||||
is >> size;
|
||||
for ( unsigned int i=0; i<size; ++i )
|
||||
{
|
||||
ValueType value;
|
||||
is >> value;
|
||||
list.push_back( value );
|
||||
}
|
||||
if ( size>0 ) (object.*_setter)( list );
|
||||
}
|
||||
else if ( is.matchString(_name) )
|
||||
{
|
||||
is >> size;
|
||||
if ( size>0 ) is >> is.BEGIN_BRACKET;
|
||||
for ( unsigned int i=0; i<size; ++i )
|
||||
{
|
||||
ValueType value;
|
||||
is >> value;
|
||||
list.push_back( value );
|
||||
}
|
||||
if ( size>0 )
|
||||
{
|
||||
is >> is.END_BRACKET;
|
||||
(object.*_setter)( list );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||
{
|
||||
const C& object = OBJECT_CAST<const C&>(obj);
|
||||
const P& list = (object.*_constgetter)();
|
||||
unsigned int size = (unsigned int)list.size();
|
||||
if ( os.isBinary() )
|
||||
{
|
||||
os << size;
|
||||
for ( ConstIterator itr=list.begin();
|
||||
itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr);
|
||||
}
|
||||
}
|
||||
else if ( size>0 )
|
||||
{
|
||||
os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
|
||||
if (_numElementsOnRow==0)
|
||||
{
|
||||
for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr);
|
||||
}
|
||||
}
|
||||
else if (_numElementsOnRow==1)
|
||||
{
|
||||
for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr); os << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int i = _numElementsOnRow-1;
|
||||
for (ConstIterator itr=list.begin(); itr!=list.end(); ++itr)
|
||||
{
|
||||
os << (*itr);
|
||||
if (i==0) { os << std::endl; i = _numElementsOnRow-1; }
|
||||
else --i;
|
||||
}
|
||||
if (i!=_numElementsOnRow) os << std::endl;
|
||||
}
|
||||
os << os.END_BRACKET << std::endl;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
std::string _name;
|
||||
ConstGetter _constgetter;
|
||||
Getter _getter;
|
||||
Setter _setter;
|
||||
unsigned int _numElementsOnRow;
|
||||
};
|
||||
|
||||
|
||||
template<typename C>
|
||||
class IsAVectorSerializer : public VectorBaseSerializer
|
||||
{
|
||||
public:
|
||||
typedef typename C::value_type ValueType;
|
||||
typedef typename C::const_iterator ConstIterator;
|
||||
|
||||
IsAVectorSerializer( const char* name, BaseSerializer::Type elementType, unsigned int numElementsOnRow) :
|
||||
VectorBaseSerializer(elementType),
|
||||
_name(name),
|
||||
_numElementsOnRow(numElementsOnRow) {}
|
||||
|
||||
virtual const std::string& getName() const { return _name; }
|
||||
|
||||
virtual unsigned int size(const osg::Object& obj) const
|
||||
{
|
||||
const C& list = OBJECT_CAST<const C&>(obj);
|
||||
return static_cast<unsigned int>(list.size());
|
||||
}
|
||||
virtual void resize(osg::Object& obj, unsigned int numElements) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
list.resize(numElements);
|
||||
}
|
||||
virtual void reserve(osg::Object& obj, unsigned int numElements) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
list.reserve(numElements);
|
||||
}
|
||||
virtual void clear(osg::Object& obj) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
list.clear();
|
||||
}
|
||||
virtual void addElement(osg::Object& obj, void* ptr) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
list.push_back(*reinterpret_cast<ValueType*>(ptr));
|
||||
}
|
||||
virtual void insertElement(osg::Object& obj, unsigned int index, void* ptr) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
if (index>=list.size()) list.resize(index+1);
|
||||
list.insert(list.begin()+index, *reinterpret_cast<ValueType*>(ptr));
|
||||
}
|
||||
virtual void setElement(osg::Object& obj, unsigned int index, void* ptr) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
if (index>=list.size()) list.resize(index+1);
|
||||
list[index] = *reinterpret_cast<ValueType*>(ptr);
|
||||
}
|
||||
virtual void* getElement(osg::Object& obj, unsigned int index) const
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
if (index>=list.size()) return 0;
|
||||
else return &list[index];
|
||||
}
|
||||
|
||||
virtual const void* getElement(const osg::Object& obj, unsigned int index) const
|
||||
{
|
||||
const C& list = OBJECT_CAST<const C&>(obj);
|
||||
if (index>=list.size()) return 0;
|
||||
else return &list[index];
|
||||
}
|
||||
|
||||
virtual bool read( InputStream& is, osg::Object& obj )
|
||||
{
|
||||
C& list = OBJECT_CAST<C&>(obj);
|
||||
unsigned int size = 0;
|
||||
if ( is.isBinary() )
|
||||
{
|
||||
is >> size;
|
||||
for ( unsigned int i=0; i<size; ++i )
|
||||
{
|
||||
ValueType value;
|
||||
is >> value;
|
||||
list.push_back( value );
|
||||
}
|
||||
}
|
||||
else if ( is.matchString(_name) )
|
||||
{
|
||||
is >> size;
|
||||
if ( size>0 ) is >> is.BEGIN_BRACKET;
|
||||
for ( unsigned int i=0; i<size; ++i )
|
||||
{
|
||||
ValueType value;
|
||||
is >> value;
|
||||
list.push_back( value );
|
||||
}
|
||||
if ( size>0 )
|
||||
{
|
||||
is >> is.END_BRACKET;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||
{
|
||||
const C& list = OBJECT_CAST<const C&>(obj);
|
||||
unsigned int size = (unsigned int)list.size();
|
||||
if ( os.isBinary() )
|
||||
{
|
||||
os << size;
|
||||
for ( ConstIterator itr=list.begin();
|
||||
itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr);
|
||||
}
|
||||
}
|
||||
else if ( size>0 )
|
||||
{
|
||||
os << os.PROPERTY((_name).c_str()) << size << os.BEGIN_BRACKET << std::endl;
|
||||
if (_numElementsOnRow==0)
|
||||
{
|
||||
for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr);
|
||||
}
|
||||
}
|
||||
else if (_numElementsOnRow==1)
|
||||
{
|
||||
for ( ConstIterator itr=list.begin(); itr!=list.end(); ++itr )
|
||||
{
|
||||
os << (*itr); os << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int i = _numElementsOnRow-1;
|
||||
for (ConstIterator itr=list.begin(); itr!=list.end(); ++itr)
|
||||
{
|
||||
os << (*itr);
|
||||
if (i==0) { os << std::endl; i = _numElementsOnRow-1; }
|
||||
else --i;
|
||||
}
|
||||
if (i!=_numElementsOnRow) os << std::endl;
|
||||
}
|
||||
os << os.END_BRACKET << std::endl;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
std::string _name;
|
||||
unsigned int _numElementsOnRow;
|
||||
};
|
||||
|
||||
// ADDING MANIPULATORS
|
||||
#define ADD_SERIALIZER(S) \
|
||||
wrapper->addSerializer( (S) )
|
||||
@@ -1062,6 +1402,14 @@ public:
|
||||
wrapper->addSerializer( new osgDB::ListSerializer< MyClass, TYPE >( \
|
||||
#PROP, &MyClass::get##PROP, &MyClass::set##PROP), osgDB::BaseSerializer::RW_LIST )
|
||||
|
||||
|
||||
#define ADD_VECTOR_SERIALIZER(PROP, TYPE, ELEMENTTYPE, NUMELEMENTSONROW) \
|
||||
wrapper->addSerializer( new osgDB::VectorSerializer< MyClass, TYPE >( \
|
||||
#PROP, &MyClass::get##PROP, &MyClass::get##PROP, &MyClass::set##PROP, ELEMENTTYPE, NUMELEMENTSONROW), osgDB::BaseSerializer::RW_VECTOR )
|
||||
|
||||
#define ADD_ISAVECTOR_SERIALIZER(PROP, ELEMENTTYPE, NUMELEMENTSONROW) \
|
||||
wrapper->addSerializer( new osgDB::IsAVectorSerializer< MyClass >( #PROP, ELEMENTTYPE, NUMELEMENTSONROW), osgDB::BaseSerializer::RW_VECTOR )
|
||||
|
||||
#define BEGIN_ENUM_SERIALIZER(PROP, DEF) \
|
||||
{ typedef osgDB::EnumSerializer<MyClass, MyClass::PROP, void> MySerializer; \
|
||||
osg::ref_ptr<MySerializer> serializer = new MySerializer( \
|
||||
|
||||
Reference in New Issue
Block a user