Added AnimationCompletedCallback, s/getTimeScale and s/getTimeOffset() method to enable finer control of AnimationPathManipulator.

This commit is contained in:
Robert Osfield 2010-12-14 20:07:00 +00:00
parent 65f95fe3fe
commit 3580108b3a
2 changed files with 39 additions and 20 deletions

View File

@ -41,6 +41,21 @@ class OSGGA_EXPORT AnimationPathManipulator : public CameraManipulator
virtual const char* className() const { return "AnimationPath"; } virtual const char* className() const { return "AnimationPath"; }
void setTimeScale(double s) { _timeScale = s; }
double getTimeScale() const { return _timeScale; }
void setTimeOffset(double o) { _timeOffset = o; }
double getTimeOffset() const { return _timeOffset; }
struct AnimationCompletedCallback : public virtual osg::Referenced
{
virtual void completed(const AnimationPathManipulator* apm) = 0;
};
void setAnimationCompletedCallback(AnimationCompletedCallback* acc) { _animationCompletedCallback = acc; }
AnimationCompletedCallback* getAnimationCompletedCallback() { return _animationCompletedCallback.get(); }
const AnimationCompletedCallback* getAnimationCompletedCallback() const { return _animationCompletedCallback.get(); }
void setPrintOutTimingInfo(bool printOutTimingInfo) { _printOutTimingInfo=printOutTimingInfo; } void setPrintOutTimingInfo(bool printOutTimingInfo) { _printOutTimingInfo=printOutTimingInfo; }
bool getPrintOutTimingInfo() const { return _printOutTimingInfo; } bool getPrintOutTimingInfo() const { return _printOutTimingInfo; }
@ -87,6 +102,9 @@ class OSGGA_EXPORT AnimationPathManipulator : public CameraManipulator
double _timeOffset; double _timeOffset;
double _timeScale; double _timeScale;
osg::ref_ptr<AnimationCompletedCallback> _animationCompletedCallback;
double _pauseTime; double _pauseTime;
bool _isPaused; bool _isPaused;

View File

@ -24,8 +24,8 @@ AnimationPathManipulator::AnimationPathManipulator( const std::string& filename
_animationPath = new osg::AnimationPath; _animationPath = new osg::AnimationPath;
_animationPath->setLoopMode(osg::AnimationPath::LOOP); _animationPath->setLoopMode(osg::AnimationPath::LOOP);
_timeOffset = 0.0f; _timeOffset = 0.0;
_timeScale = 1.0f; _timeScale = 1.0;
_isPaused = false; _isPaused = false;
@ -85,7 +85,6 @@ bool AnimationPathManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GU
if (ea.getKey()==' ') if (ea.getKey()==' ')
{ {
_isPaused = false; _isPaused = false;
_timeScale = 1.0;
home(ea,us); home(ea,us);
us.requestRedraw(); us.requestRedraw();
@ -149,8 +148,8 @@ void AnimationPathManipulator::getUsage(osg::ApplicationUsage& usage) const
{ {
usage.addKeyboardMouseBinding("AnimationPath: Space","Reset the viewing position to start of animation"); usage.addKeyboardMouseBinding("AnimationPath: Space","Reset the viewing position to start of animation");
usage.addKeyboardMouseBinding("AnimationPath: p","Pause/resume animation."); usage.addKeyboardMouseBinding("AnimationPath: p","Pause/resume animation.");
usage.addKeyboardMouseBinding("AnimationPath: <","Slow down animation speed."); usage.addKeyboardMouseBinding("AnimationPath: (","Slow down animation speed.");
usage.addKeyboardMouseBinding("AnimationPath: <","Speed up animation speed."); usage.addKeyboardMouseBinding("AnimationPath: )","Speed up animation speed.");
} }
void AnimationPathManipulator::handleFrame( double time ) void AnimationPathManipulator::handleFrame( double time )
@ -169,24 +168,26 @@ void AnimationPathManipulator::handleFrame( double time )
++_numOfFramesSinceStartOfTimedPeriod; ++_numOfFramesSinceStartOfTimedPeriod;
if (_printOutTimingInfo) double animDelta = (animTime-_animStartOfTimedPeriod);
if (animDelta>=_animationPath->getPeriod())
{ {
double animDelta = (animTime-_animStartOfTimedPeriod); if (_animationCompletedCallback.valid())
if (animDelta>=_animationPath->getPeriod())
{ {
_animationCompletedCallback->completed(this);
}
if (_printOutTimingInfo)
{
double delta = time-_realStartOfTimedPeriod; double delta = time-_realStartOfTimedPeriod;
double frameRate = (double)_numOfFramesSinceStartOfTimedPeriod/delta; double frameRate = (double)_numOfFramesSinceStartOfTimedPeriod/delta;
OSG_NOTICE <<"AnimatonPath completed in "<<delta<<" seconds, completing "<<_numOfFramesSinceStartOfTimedPeriod<<" frames,"<<std::endl; OSG_NOTICE <<"AnimatonPath completed in "<<delta<<" seconds, completing "<<_numOfFramesSinceStartOfTimedPeriod<<" frames,"<<std::endl;
OSG_NOTICE <<" average frame rate = "<<frameRate<<std::endl; OSG_NOTICE <<" average frame rate = "<<frameRate<<std::endl;
// reset counters for next loop.
_realStartOfTimedPeriod = time;
_animStartOfTimedPeriod = animTime;
_numOfFramesSinceStartOfTimedPeriod = 0;
} }
// reset counters for next loop.
_realStartOfTimedPeriod = time;
_animStartOfTimedPeriod = animTime;
_numOfFramesSinceStartOfTimedPeriod = 0;
} }
cp.getMatrix( _matrix ); cp.getMatrix( _matrix );