From Pjotr Svetachov, "have added some missing serializers for RigGeomery. Withouth them I

ran into two issues.

At first you get a bunch of warnings that osg::ComputeBoundCallback
and osg::UpdateCallback were unsupported wrapper classes when
converting fbx models with skeletal animation to osg(t/b).

The second issue was that when reading, the readers fail to read the
ComputeBoundCallback and UpdateCallback and set them to NULL which
messes up the RigGeometry.

Because a RigGeometry makes his own classes in the constructor it
might be preferable to not write them at all, because now those
classes are being made two times when reading a RigGeometry. But after
thinking about this that would place too much limits on them (you
won't be able to share or name them and save that information or make
a new inherited class from them and write that one) So I ended up
thinking the best way was to just write the files.
"
This commit is contained in:
Robert Osfield 2014-04-29 15:14:39 +00:00
parent b6404d18c3
commit a04232a75a
6 changed files with 149 additions and 66 deletions

View File

@ -24,6 +24,28 @@
namespace osgAnimation namespace osgAnimation
{ {
// The idea is to compute a bounding box with a factor x of the first step we compute the bounding box
class OSGANIMATION_EXPORT RigComputeBoundingBoxCallback : public osg::Drawable::ComputeBoundingBoxCallback
{
public:
RigComputeBoundingBoxCallback(double factor = 2.0): _computed(false), _factor(factor) {}
RigComputeBoundingBoxCallback(const RigComputeBoundingBoxCallback& rhs, const osg::CopyOp& copyop) :
osg::Drawable::ComputeBoundingBoxCallback(rhs, copyop),
_computed(false),
_factor(rhs._factor) {}
META_Object(osgAnimation, RigComputeBoundingBoxCallback);
void reset() { _computed = false; }
virtual osg::BoundingBox computeBound(const osg::Drawable& drawable) const;
protected:
mutable bool _computed;
double _factor;
mutable osg::BoundingBox _boundingBox;
};
class OSGANIMATION_EXPORT RigGeometry : public osg::Geometry class OSGANIMATION_EXPORT RigGeometry : public osg::Geometry
{ {
public: public:
@ -70,37 +92,15 @@ namespace osgAnimation
void copyFrom(osg::Geometry& from); void copyFrom(osg::Geometry& from);
protected:
osg::ref_ptr<osg::Geometry> _geometry;
osg::ref_ptr<RigTransform> _rigTransformImplementation;
VertexInfluenceSet _vertexInfluenceSet;
osg::ref_ptr<VertexInfluenceMap> _vertexInfluenceMap;
osg::Matrix _matrixFromSkeletonToGeometry;
osg::Matrix _invMatrixFromSkeletonToGeometry;
osg::observer_ptr<Skeleton> _root;
bool _needToComputeMatrix;
struct FindNearestParentSkeleton : public osg::NodeVisitor
{
osg::ref_ptr<Skeleton> _root;
FindNearestParentSkeleton() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {}
void apply(osg::Transform& node)
{
if (_root.valid())
return;
_root = dynamic_cast<osgAnimation::Skeleton*>(&node);
traverse(node);
}
};
struct UpdateVertex : public osg::Drawable::UpdateCallback struct UpdateVertex : public osg::Drawable::UpdateCallback
{ {
virtual void update(osg::NodeVisitor*, osg::Drawable* drw) UpdateVertex() {}
{
UpdateVertex(const UpdateCallback&, const osg::CopyOp&) {}
META_Object(osgAnimation, UpdateVertex);
virtual void update(osg::NodeVisitor*, osg::Drawable* drw) {
RigGeometry* geom = dynamic_cast<RigGeometry*>(drw); RigGeometry* geom = dynamic_cast<RigGeometry*>(drw);
if(!geom) if(!geom)
return; return;
@ -129,6 +129,33 @@ namespace osgAnimation
geom->update(); geom->update();
} }
}; };
protected:
osg::ref_ptr<osg::Geometry> _geometry;
osg::ref_ptr<RigTransform> _rigTransformImplementation;
VertexInfluenceSet _vertexInfluenceSet;
osg::ref_ptr<VertexInfluenceMap> _vertexInfluenceMap;
osg::Matrix _matrixFromSkeletonToGeometry;
osg::Matrix _invMatrixFromSkeletonToGeometry;
osg::observer_ptr<Skeleton> _root;
bool _needToComputeMatrix;
struct FindNearestParentSkeleton : public osg::NodeVisitor
{
osg::ref_ptr<Skeleton> _root;
FindNearestParentSkeleton() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {}
void apply(osg::Transform& node)
{
if (_root.valid())
return;
_root = dynamic_cast<osgAnimation::Skeleton*>(&node);
traverse(node);
}
};
}; };
} }

View File

@ -21,12 +21,7 @@
using namespace osgAnimation; using namespace osgAnimation;
// The idea is to compute a bounding box with a factor x of the first step we compute the bounding box // The idea is to compute a bounding box with a factor x of the first step we compute the bounding box
class RigComputeBoundingBoxCallback : public osg::Drawable::ComputeBoundingBoxCallback osg::BoundingBox RigComputeBoundingBoxCallback::computeBound(const osg::Drawable& drawable) const
{
public:
RigComputeBoundingBoxCallback(double factor = 2.0) : _computed(false), _factor(factor) {}
void reset() { _computed = false; }
virtual osg::BoundingBox computeBound(const osg::Drawable& drawable) const
{ {
const osgAnimation::RigGeometry& rig = dynamic_cast<const osgAnimation::RigGeometry&>(drawable); const osgAnimation::RigGeometry& rig = dynamic_cast<const osgAnimation::RigGeometry&>(drawable);
@ -53,11 +48,7 @@ public:
// OSG_NOTICE << "build the bounding box for RigGeometry " << rig.getName() << " " << _boundingBox._min << " " << _boundingBox._max << std::endl; // OSG_NOTICE << "build the bounding box for RigGeometry " << rig.getName() << " " << _boundingBox._min << " " << _boundingBox._max << std::endl;
return _boundingBox; return _boundingBox;
} }
protected:
mutable bool _computed;
double _factor;
mutable osg::BoundingBox _boundingBox;
};
RigGeometry::RigGeometry() RigGeometry::RigGeometry()
{ {

View File

@ -0,0 +1,17 @@
#undef OBJECT_CAST
#define OBJECT_CAST dynamic_cast
#include <osg/Drawable>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
REGISTER_OBJECT_WRAPPER2(osg_ComputeBoundingBoxCallback,
new osg::Drawable::ComputeBoundingBoxCallback,
osg::Drawable::ComputeBoundingBoxCallback,
"osg::ComputeBoundingBoxCallback",
"osg::Object osg::ComputeBoundingBoxCallback") {
}
#undef OBJECT_CAST
#define OBJECT_CAST static_cast

View File

@ -0,0 +1,16 @@
#undef OBJECT_CAST
#define OBJECT_CAST dynamic_cast
#include <osg/Drawable>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
REGISTER_OBJECT_WRAPPER2(osg_Drawable_UpdateCallback,
new osg::Drawable::UpdateCallback,
osg::Drawable::UpdateCallback,
"osg::UpdateCallback",
"osg::Object osg::UpdateCallback") {}
#undef OBJECT_CAST
#define OBJECT_CAST static_cast

View File

@ -0,0 +1,16 @@
#undef OBJECT_CAST
#define OBJECT_CAST dynamic_cast
#include <osgAnimation/RigGeometry>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
REGISTER_OBJECT_WRAPPER(osgAnimation_RigComputeBoundingBoxCallback,
new osgAnimation::RigComputeBoundingBoxCallback,
osgAnimation::RigComputeBoundingBoxCallback,
"osg::Object osg::ComputeBoundingBoxCallback osgAnimation::RigComputeBoundingBoxCallback") {
}
#undef OBJECT_CAST
#define OBJECT_CAST static_cast

View File

@ -0,0 +1,16 @@
#undef OBJECT_CAST
#define OBJECT_CAST dynamic_cast
#include <osgAnimation/RigGeometry>
#include <osgDB/ObjectWrapper>
#include <osgDB/InputStream>
#include <osgDB/OutputStream>
REGISTER_OBJECT_WRAPPER2(osg_Drawable_UpdateCallback,
new osgAnimation::RigGeometry::UpdateVertex,
osgAnimation::RigGeometry::UpdateVertex,
"osgAnimation::UpdateVertex",
"osg::Object osg::UpdateCallback osgAnimation::UpdateVertex") {}
#undef OBJECT_CAST
#define OBJECT_CAST static_cast