diff --git a/include/osg/ImageSequence b/include/osg/ImageSequence index 5ab254946..ad675fce9 100644 --- a/include/osg/ImageSequence +++ b/include/osg/ImageSequence @@ -73,7 +73,9 @@ class OSG_EXPORT ImageSequence : public ImageStream { PRE_LOAD_ALL_IMAGES, PAGE_AND_RETAIN_IMAGES, - PAGE_AND_DISCARD_USED_IMAGES + PAGE_AND_DISCARD_USED_IMAGES, + LOAD_AND_RETAIN_IN_UPDATE_TRAVERSAL, + LOAD_AND_DISCARD_IN_UPDATE_TRAVERSAL }; void setMode(Mode mode); @@ -135,6 +137,8 @@ protected: int imageIndex(double time); + // setImage without aquiring mutex. + void _setImage(unsigned int pos, osg::Image* image); double _referenceTime; double _timeMultiplier; diff --git a/src/osg/ImageSequence.cpp b/src/osg/ImageSequence.cpp index 344fa81c7..74bbeb2dc 100644 --- a/src/osg/ImageSequence.cpp +++ b/src/osg/ImageSequence.cpp @@ -148,6 +148,11 @@ void ImageSequence::setImage(unsigned int pos, osg::Image* image) { OpenThreads::ScopedLock lock(_mutex); + _setImage(pos,image); +} + +void ImageSequence::_setImage(unsigned int pos, osg::Image* image) +{ if (pos>=_imageDataList.size()) _imageDataList.resize(pos+1); _imageDataList[pos]._image = image; @@ -196,8 +201,8 @@ void ImageSequence::setImageToChild(int pos) return; } - - if (_mode==PAGE_AND_DISCARD_USED_IMAGES && _previousAppliedImageIndex>=0) + bool discardOldImages = _mode==PAGE_AND_DISCARD_USED_IMAGES || _mode==LOAD_AND_DISCARD_IN_UPDATE_TRAVERSAL; + if (discardOldImages && _previousAppliedImageIndex>=0) { if (_previousAppliedImageIndex(0, int(time/_timePerImage)); @@ -358,8 +365,26 @@ void ImageSequence::update(osg::NodeVisitor* nv) { i = osg::minimum(i, _imageDataList.size()-1); - OSG_INFO<<"Requesting file, entry="<