Added support for pruning old images, recording the Duration in the .osg file, and -o filename output support in osgimagesequence.

This commit is contained in:
Robert Osfield
2008-07-22 16:44:49 +00:00
parent 66c2add024
commit c9dc578186
4 changed files with 55 additions and 12 deletions

View File

@@ -42,6 +42,7 @@ ImageSequence::ImageSequence()
_timeMultiplier = 1.0;
_duration = 1.0;
_timePerImage = 1.0;
_pruneOldImages = false;
_imageIteratorTime = DBL_MAX;
@@ -64,16 +65,31 @@ int ImageSequence::compare(const Image& rhs) const
return ImageStream::compare(rhs);
}
void ImageSequence::setDuration(double duration)
{
_duration = duration;
computeTimePerImage();
}
void ImageSequence::computeTimePerImage()
{
if (!_fileNames.empty()) _timePerImage = _duration / double(_fileNames.size());
else if (!_images.empty()) _timePerImage = _duration / double(_images.size());
else _timePerImage = _duration;
}
void ImageSequence::addImageFile(const std::string& fileName)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
_fileNames.push_back(fileName);
computeTimePerImage();
}
void ImageSequence::addImage(osg::Image* image)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
_images.push_back(image);
computeTimePerImage();
if (_imageIterator==_images.end())
{
@@ -115,9 +131,6 @@ void ImageSequence::update(osg::NodeVisitor* nv)
}
double time = (fs->getSimulationTime() - _referenceTime)*_timeMultiplier;
double delta = _fileNames.empty() ?
_duration / _images.size() :
_duration / _fileNames.size();
Images::iterator previous_imageIterator = _imageIterator;
@@ -126,14 +139,20 @@ void ImageSequence::update(osg::NodeVisitor* nv)
if (_imageIterator!=_images.end())
{
// osg::notify(osg::NOTICE)<<" _imageIteratorTime = "<<_imageIteratorTime<<std::endl;
while(time > (_imageIteratorTime + delta))
while(time > (_imageIteratorTime + _timePerImage))
{
_imageIteratorTime += delta;
_imageIteratorTime += _timePerImage;
// osg::notify(osg::NOTICE)<<" _imageIteratorTime = "<<_imageIteratorTime<<std::endl;
++_imageIterator;
if (_imageIterator ==_images.end())
{
if (_pruneOldImages)
{
_images.erase(previous_imageIterator, _imageIterator);
}
// return iterator to begining of set.
_imageIterator = _images.begin();
}
@@ -147,6 +166,11 @@ void ImageSequence::update(osg::NodeVisitor* nv)
if (_imageIterator!=_images.end() && previous_imageIterator != _imageIterator)
{
if (_pruneOldImages)
{
_images.erase(previous_imageIterator, _imageIterator);
}
setImageToChild(_imageIterator->get());
}
}

View File

@@ -27,6 +27,14 @@ bool ImageSequence_readLocalData(Object& obj, Input& fr)
ImageSequence& is = static_cast<ImageSequence&>(obj);
unsigned int numFilesToPreLoad = 1;
double duration;
if (fr.read("Duration", duration))
{
is.setDuration(duration);
}
if (fr.matchSequence("FileNames {"))
{
fr += 2;
@@ -36,12 +44,13 @@ bool ImageSequence_readLocalData(Object& obj, Input& fr)
{
if (fr[0].getStr())
{
#if 1
is.addImageFile(fr[0].getStr());
#else
osg::ref_ptr<osg::Image> image = fr.readImage(fr[0].getStr());
if (image.valid()) is.addImage(image.get());
#endif
if (is.getImages().size() < numFilesToPreLoad)
{
osg::ref_ptr<osg::Image> image = fr.readImage(fr[0].getStr());
if (image.valid()) is.addImage(image.get());
}
}
++fr;
}
@@ -74,6 +83,8 @@ bool ImageSequence_writeLocalData(const Object& obj, Output& fw)
// no current image writing code here
// as it is all handled by osg::Registry::writeImage() via plugins.
fw.indent()<<"Duration "<<is.getDuration()<<std::endl;
if (!is.getFileNames().empty())
{
fw.indent()<<"FileNames {"<<std::endl;