From c3fd384eb1d6691a137b2e345b6b7666129ab2d0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 8 Apr 2003 20:06:37 +0000 Subject: [PATCH] =?UTF-8?q?From=20Romano=20Jos=C3=A9=20Magacho=20da=20Silv?= =?UTF-8?q?a,=20added=20'p'=20toggle=20to=20animation=20path=20manipulator?= =?UTF-8?q?=20to=20allow=20animations=20to=20be=20paused=20and=20resumed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added frame rate stats which are output on each repetition of the path. --- include/osgGA/AnimationPathManipulator | 10 ++- src/osgGA/AnimationPathManipulator.cpp | 98 ++++++++++++++++++++------ 2 files changed, 84 insertions(+), 24 deletions(-) diff --git a/include/osgGA/AnimationPathManipulator b/include/osgGA/AnimationPathManipulator index 8eaed78b2..ac8b87972 100644 --- a/include/osgGA/AnimationPathManipulator +++ b/include/osgGA/AnimationPathManipulator @@ -66,8 +66,14 @@ class OSGGA_EXPORT AnimationPathManipulator : public CameraManipulator osg::ref_ptr _animationPath; - double _timeOffset; - double _timeScale; + double _timeOffset; + double _timeScale; + double _pauseTime; + bool _isPaused; + + double _realStartOfTimedPeriod; + double _animStartOfTimedPeriod; + int _numOfFramesSinceStartOfTimedPeriod; }; diff --git a/src/osgGA/AnimationPathManipulator.cpp b/src/osgGA/AnimationPathManipulator.cpp index 194baf617..7438fd7a6 100644 --- a/src/osgGA/AnimationPathManipulator.cpp +++ b/src/osgGA/AnimationPathManipulator.cpp @@ -6,8 +6,13 @@ using namespace osgGA; AnimationPathManipulator::AnimationPathManipulator(osg::AnimationPath* animationPath) { _animationPath = animationPath; - _timeOffset = 0.0f; - _timeScale = 1.0f; + _timeOffset = 0.0; + _timeScale = 1.0; + _isPaused = false; + + _realStartOfTimedPeriod = 0.0; + _animStartOfTimedPeriod = 0.0; + _numOfFramesSinceStartOfTimedPeriod = -1; // need to init. } AnimationPathManipulator::AnimationPathManipulator( const std::string& filename ) @@ -16,25 +21,26 @@ AnimationPathManipulator::AnimationPathManipulator( const std::string& filename _animationPath->setLoopMode(osg::AnimationPath::LOOP); _timeOffset = 0.0f; _timeScale = 1.0f; + _isPaused = false; FILE *fp = fopen( filename.c_str(), "r" ); if( fp == NULL ) { - osg::notify(osg::WARN) << "AnimationPathManipulator: Cannot open animation path file \"" << filename << "\".\n"; - _valid = false; - return; + osg::notify(osg::WARN) << "AnimationPathManipulator: Cannot open animation path file \"" << filename << "\".\n"; + _valid = false; + return; } while( !feof( fp )) { - double time; - osg::Vec3 position; - osg::Quat rotation; - fscanf( fp, "%lf %f %f %f %f %f %f %f\n", - &time, &position[0], &position[1], &position[2], - &rotation[0], &rotation[1], &rotation[2], &rotation[3] ); + double time; + osg::Vec3 position; + osg::Quat rotation; + fscanf( fp, "%lf %f %f %f %f %f %f %f\n", + &time, &position[0], &position[1], &position[2], + &rotation[0], &rotation[1], &rotation[2], &rotation[3] ); - if( !feof(fp)) - _animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation)); + if( !feof(fp)) + _animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation)); } fclose(fp); } @@ -61,11 +67,18 @@ bool AnimationPathManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GU bool retval = false; switch( ea.getEventType() ) { - case GUIEventAdapter::FRAME: - handleFrame( ea.time() ); + case GUIEventAdapter::FRAME: + if( _isPaused ) + { + handleFrame( _pauseTime ); + } + else + { + handleFrame( ea.time() ); + } retval = true; - break; - case GUIEventAdapter::KEYDOWN: + break; + case GUIEventAdapter::KEYDOWN: if (ea.getKey()==' ') { home(ea,us); @@ -73,10 +86,25 @@ bool AnimationPathManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GU us.requestContinuousUpdate(false); return true; } - return false; - - retval = false; - break; + else if(ea.getKey() == 'p') + { + if( _isPaused ) + { + _isPaused = false; + _timeOffset -= ea.time() - _pauseTime; + } + else + { + _isPaused = true; + _pauseTime = ea.time(); + } + us.requestRedraw(); + us.requestContinuousUpdate(false); + return true; + } + + retval = false; + break; default: break; } @@ -86,12 +114,38 @@ bool AnimationPathManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GU void AnimationPathManipulator::getUsage(osg::ApplicationUsage& usage) const { usage.addKeyboardMouseBinding("AnimationPath: Space","Reset the viewing position to start of animation"); + usage.addKeyboardMouseBinding("AnimationPath: p","Pause/resume animation."); } void AnimationPathManipulator::handleFrame( double time ) { osg::AnimationPath::ControlPoint cp; - _animationPath->getInterpolatedControlPoint( (time+_timeOffset)*_timeScale, cp ); + + double animTime = (time+_timeOffset)*_timeScale; + _animationPath->getInterpolatedControlPoint( animTime, cp ); + + if (_numOfFramesSinceStartOfTimedPeriod==-1) + { + _realStartOfTimedPeriod = time; + _animStartOfTimedPeriod = animTime; + + } + + ++_numOfFramesSinceStartOfTimedPeriod; + + double delta = (animTime-_animStartOfTimedPeriod); + if (delta>=_animationPath->getPeriod()) + { + double frameRate = (double)_numOfFramesSinceStartOfTimedPeriod/delta; + std::cout <<"AnimatonPath completed in "<