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:
parent
06e773cefb
commit
c3fd384eb1
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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 );
|
||||
|
Loading…
Reference in New Issue
Block a user