From Romano José Magacho da Silva, added 'p' toggle to animation path

manipulator to allow animations to be paused and resumed.

Added frame rate stats which are output on each repetition of the path.
This commit is contained in:
Robert Osfield 2003-04-08 20:06:37 +00:00
parent 06e773cefb
commit c3fd384eb1
2 changed files with 84 additions and 24 deletions

View File

@ -66,8 +66,14 @@ class OSGGA_EXPORT AnimationPathManipulator : public CameraManipulator
osg::ref_ptr<osg::AnimationPath> _animationPath;
double _timeOffset;
double _timeScale;
double _timeOffset;
double _timeScale;
double _pauseTime;
bool _isPaused;
double _realStartOfTimedPeriod;
double _animStartOfTimedPeriod;
int _numOfFramesSinceStartOfTimedPeriod;
};

View File

@ -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 "<<delta<<" seconds, completing "<<_numOfFramesSinceStartOfTimedPeriod<<" frames,"<<std::endl;
std::cout <<" average frame rate = "<<frameRate<<std::endl;
// reset counters for next loop.
_realStartOfTimedPeriod = time;
_animStartOfTimedPeriod = animTime;
_numOfFramesSinceStartOfTimedPeriod = 0;
}
osg::Matrix matrix;
cp.getMatrix( matrix );