Files
OpenSceneGraph/src/osgWrappers/serializers/osgAnimation/RigGeometry.cpp
Julien Valentin 5aa96727e9 clean and bugfixes
2017-08-31 20:57:19 +02:00

82 lines
2.8 KiB
C++

#include <osgAnimation/RigGeometry>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
namespace wrap_osgAnimationRigGeometry{
static bool checkInfluenceMap( const osgAnimation::RigGeometry& geom )
{
return geom.getInfluenceMap()->size()>0;
}
static bool readInfluenceMap( osgDB::InputStream& is, osgAnimation::RigGeometry& geom )
{
osg::ref_ptr<osgAnimation::VertexInfluenceMap> map = new osgAnimation::VertexInfluenceMap;
unsigned int size = is.readSize(); is >> is.BEGIN_BRACKET;
for ( unsigned int i=0; i<size; ++i )
{
std::string bonename;
unsigned int viSize = 0;
is >> is.PROPERTY("VertexInfluence");
is.readWrappedString(bonename);
viSize = is.readSize(); is >> is.BEGIN_BRACKET;
osgAnimation::VertexInfluence vi;
vi.setName( bonename );
vi.reserve( viSize );
for ( unsigned int j=0; j<viSize; ++j )
{
int index = 0;
float weight = 0.0f;
is >> index >> weight;
vi.push_back( osgAnimation::VertexIndexWeight(index, weight) );
}
(*map)[bonename] = vi;
is >> is.END_BRACKET;
}
is >> is.END_BRACKET;
if ( !map->empty() ) geom.setInfluenceMap( map.get() );
return true;
}
static bool writeInfluenceMap( osgDB::OutputStream& os, const osgAnimation::RigGeometry& geom )
{
const osgAnimation::VertexInfluenceMap* map = geom.getInfluenceMap();
os.writeSize(map->size()); os << os.BEGIN_BRACKET << std::endl;
for ( osgAnimation::VertexInfluenceMap::const_iterator itr=map->begin();
itr!=map->end(); ++itr )
{
std::string name = itr->first;
const osgAnimation::VertexInfluence& vi = itr->second;
if ( name.empty() ) name = "Empty";
os << os.PROPERTY("VertexInfluence");
os.writeWrappedString(name);
os.writeSize(vi.size()) ; os << os.BEGIN_BRACKET << std::endl;
for ( osgAnimation::VertexInfluence::const_iterator vitr=vi.begin();
vitr != vi.end(); ++vitr )
{
os << vitr->first << vitr->second << std::endl;
}
os << os.END_BRACKET << std::endl;
}
os << os.END_BRACKET << std::endl;
return true;
}
REGISTER_OBJECT_WRAPPER( osgAnimation_RigGeometry,
new osgAnimation::RigGeometry,
osgAnimation::RigGeometry,
"osg::Object osg::Drawable osg::Geometry osgAnimation::RigGeometry" )
{
ADD_USER_SERIALIZER( InfluenceMap ); // _vertexInfluenceMap
ADD_OBJECT_SERIALIZER( SourceGeometry, osg::Geometry, NULL ); // _geometry
{
UPDATE_TO_VERSION_SCOPED( 145 )
ADD_OBJECT_SERIALIZER( RigTransformImplementation, osgAnimation::RigTransform, NULL ); // _geometry
}
}
}