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:
parent
b6404d18c3
commit
a04232a75a
@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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
|
16
src/osgWrappers/serializers/osg/UpdateCallback.cpp
Normal file
16
src/osgWrappers/serializers/osg/UpdateCallback.cpp
Normal 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
|
@ -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
|
16
src/osgWrappers/serializers/osgAnimation/UpdateVertex.cpp
Normal file
16
src/osgWrappers/serializers/osgAnimation/UpdateVertex.cpp
Normal 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
|
Loading…
Reference in New Issue
Block a user