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
{
// 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
{
public:
@@ -70,6 +92,44 @@ namespace osgAnimation
void copyFrom(osg::Geometry& from);
struct UpdateVertex : public osg::Drawable::UpdateCallback
{
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);
if(!geom)
return;
if(!geom->getSkeleton() && !geom->getParents().empty())
{
FindNearestParentSkeleton finder;
if(geom->getParents().size() > 1)
osg::notify(osg::WARN) << "A RigGeometry should not have multi parent ( " << geom->getName() << " )" << std::endl;
geom->getParents()[0]->accept(finder);
if(!finder._root.valid())
{
osg::notify(osg::WARN) << "A RigGeometry did not find a parent skeleton for RigGeomtry ( " << geom->getName() << " )" << std::endl;
return;
}
geom->buildVertexInfluenceSet();
geom->setSkeleton(finder._root.get());
}
if(!geom->getSkeleton())
return;
if(geom->getNeedToComputeMatrix())
geom->computeMatrixFromRootSkeleton();
geom->update();
}
};
protected:
osg::ref_ptr<osg::Geometry> _geometry;
@@ -96,39 +156,6 @@ namespace osgAnimation
}
};
struct UpdateVertex : public osg::Drawable::UpdateCallback
{
virtual void update(osg::NodeVisitor*, osg::Drawable* drw)
{
RigGeometry* geom = dynamic_cast<RigGeometry*>(drw);
if (!geom)
return;
if (!geom->getSkeleton() && !geom->getParents().empty())
{
FindNearestParentSkeleton finder;
if (geom->getParents().size() > 1)
osg::notify(osg::WARN) << "A RigGeometry should not have multi parent ( " << geom->getName() << " )" << std::endl;
geom->getParents()[0]->accept(finder);
if (!finder._root.valid())
{
osg::notify(osg::WARN) << "A RigGeometry did not find a parent skeleton for RigGeomtry ( " << geom->getName() << " )" << std::endl;
return;
}
geom->buildVertexInfluenceSet();
geom->setSkeleton(finder._root.get());
}
if (!geom->getSkeleton())
return;
if (geom->getNeedToComputeMatrix())
geom->computeMatrixFromRootSkeleton();
geom->update();
}
};
};
}