Added continuous recording of the animation path to the RecordAnimationPathHandler

This commit is contained in:
Robert Osfield 2008-05-26 17:30:43 +00:00
parent 7592e50cde
commit cac6e2facb
4 changed files with 35 additions and 12 deletions

View File

@ -116,7 +116,7 @@ class OSG_EXPORT AnimationPath : public virtual osg::Object
matrix.preMult(osg::Matrixd::rotate(_rotation.inverse()));
matrix.preMult(osg::Matrixd::translate(-_position));
}
protected:
osg::Vec3d _position;
@ -164,6 +164,7 @@ class OSG_EXPORT AnimationPath : public virtual osg::Object
/** Given a specific time, return the local ControlPoint frame for a point. */
virtual bool getInterpolatedControlPoint(double time,ControlPoint& controlPoint) const;
/** Insert a control point into the AnimationPath.*/
void insert(double time,const ControlPoint& controlPoint);
double getFirstTime() const { if (!_timeControlPointMap.empty()) return _timeControlPointMap.begin()->first; else return 0.0;}
@ -200,6 +201,9 @@ class OSG_EXPORT AnimationPath : public virtual osg::Object
/** Write the animation path to a flat ASCII file stream. */
void write(std::ostream& out) const;
/** Write the control point to a flat ASCII file stream. */
void write(TimeControlPointMap::const_iterator itr, std::ostream& out) const;
protected:
virtual ~AnimationPath() {}

View File

@ -22,6 +22,8 @@
#include <osgViewer/GraphicsWindow>
#include <osgViewer/Viewer>
#include <fstream>
namespace osgViewer {
/** Event handler for adding on screen help to Viewers.*/
@ -241,6 +243,7 @@ public:
protected:
std::string _filename;
std::ofstream _fout;
int _keyEventToggleRecord;
int _keyEventTogglePlayback;

View File

@ -98,6 +98,12 @@ void AnimationPath::read(std::istream& in)
}
}
void AnimationPath::write(TimeControlPointMap::const_iterator itr, std::ostream& fout) const
{
const ControlPoint& cp = itr->second;
fout<<itr->first<<" "<<cp.getPosition()<<" "<<cp.getRotation()<<std::endl;
}
void AnimationPath::write(std::ostream& fout) const
{
int prec = fout.precision();
@ -108,8 +114,7 @@ void AnimationPath::write(std::ostream& fout) const
tcpmitr!=tcpm.end();
++tcpmitr)
{
const ControlPoint& cp = tcpmitr->second;
fout<<tcpmitr->first<<" "<<cp.getPosition()<<" "<<cp.getRotation()<<std::endl;
write(tcpmitr, fout);
}
fout.precision(prec);

View File

@ -414,8 +414,16 @@ bool RecordCameraPathHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GU
if (_currentlyRecording && _delta >= _interval)
{
const osg::Matrixd& m = view->getCamera()->getInverseViewMatrix();
_animPath->insert(osg::Timer::instance()->delta_s(_animStartTime, time), osg::AnimationPath::ControlPoint(m.getTrans(), m.getRotate()));
double animationPathTime = osg::Timer::instance()->delta_s(_animStartTime, time);
_animPath->insert(animationPathTime, osg::AnimationPath::ControlPoint(m.getTrans(), m.getRotate()));
_delta = 0.0f;
if (_fout)
{
_animPath->write(_animPath->getTimeControlPointMap().find(animationPathTime), _fout);
_fout.flush();
}
}
else _delta += delta;
@ -437,8 +445,16 @@ bool RecordCameraPathHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GU
_currentlyRecording = true;
_animStartTime = osg::Timer::instance()->tick();
_animPath->clear();
osg::notify(osg::NOTICE)<<"Recording camera path."<<std::endl;
if (!_filename.empty())
{
osg::notify(osg::NOTICE)<<"Recording camera path to file "<<_filename<<std::endl;
_fout.open(_filename.c_str());
}
else
{
osg::notify(osg::NOTICE)<<"Recording camera path."<<std::endl;
}
}
// THe user has requested to STOP recording, write the file!
@ -447,12 +463,7 @@ bool RecordCameraPathHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GU
_currentlyRecording = false;
_delta = 0.0f;
// In the future this will need to be written continuously, rather
// than all at once.
std::ofstream out(_filename.c_str());
osg::notify(osg::NOTICE)<<"Writing camera file: "<<_filename<<std::endl;
_animPath->write(out);
out.close();
if (_fout) _fout.close();
}
return true;