From 6cf543cf8c60eaab73c99a30b9d218cf6b57f9b0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 14 Nov 2001 14:10:12 +0000 Subject: [PATCH] Added osgUtil::TransformCallback to help with rigid body animation. --- include/osgUtil/TransformCallback | 34 +++++++++++++++++++++ src/osgUtil/TransformCallback.cpp | 51 +++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 include/osgUtil/TransformCallback create mode 100644 src/osgUtil/TransformCallback.cpp diff --git a/include/osgUtil/TransformCallback b/include/osgUtil/TransformCallback new file mode 100644 index 000000000..b285cb2e3 --- /dev/null +++ b/include/osgUtil/TransformCallback @@ -0,0 +1,34 @@ +//C++ header + +#ifndef OSGUTIL_TRANSFORMCALLBACK +#define OSGUTIL_TRANSFORMCALLBACK 1 + +#include +#include + +namespace osgUtil +{ + +class OSGUTIL_EXPORT TransformCallback : public osg::NodeCallback +{ + + public: + + TransformCallback(const osg::Vec3& pivot,const osg::Vec3& axis,float angularVelocity); + + virtual void operator() (osg::Node* node, osg::NodeVisitor* nv); + + protected: + + float _angular_velocity; + osg::Vec3 _pivot; + osg::Vec3 _axis; + + int _previousTraversalNumber; + double _previousTime; + +}; + +}; + +#endif diff --git a/src/osgUtil/TransformCallback.cpp b/src/osgUtil/TransformCallback.cpp new file mode 100644 index 000000000..78d603d91 --- /dev/null +++ b/src/osgUtil/TransformCallback.cpp @@ -0,0 +1,51 @@ +#include + +#include + +using namespace osgUtil; + +TransformCallback::TransformCallback(const osg::Vec3& pivot,const osg::Vec3& axis,float angularVelocity) +{ + _pivot = pivot; + _axis = axis; + _angular_velocity = angularVelocity; + + _previousTraversalNumber = -1; + _previousTime = -1.0; +} + +void TransformCallback::operator() (osg::Node* node, osg::NodeVisitor* nv) +{ + osg::Transform* transform = dynamic_cast(node); + if (nv && transform) + { + + const osg::FrameStamp* fs = nv->getFrameStamp(); + if (!fs) return; // not frame stamp, no handle on the time so can't move. + + + // ensure that we do not operate on this node more than + // once during this traversal. This is an issue since node + // can be shared between multiple parents. + if (nv->getTraversalNumber()!=_previousTraversalNumber) + { + double newTime = fs->getReferenceTime(); + float delta_angle = _angular_velocity*(newTime-_previousTime); + + osg::Matrix mat = osg::Matrix::trans(-_pivot)* + osg::Matrix::rotate(delta_angle,_axis)* + osg::Matrix::trans(_pivot); + + + // update the specified transform + transform->preMult(mat); + + _previousTraversalNumber = nv->getTraversalNumber(); + _previousTime = newTime; + } + } + + // must call any nested node callbacks and continue subgraph traversal. + traverse(node,nv); + +}