From a0980734ac5d41f02c7697296633cd9c3eb96828 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 18 Jan 2013 16:21:17 +0000 Subject: [PATCH] Added LOAD_AND_RETAIN_IN_UPDATE_TRAVERSAL and LOAD_AND_DISCARD_IN_UPDATE_TRAVERSAL ImageSequence::Mode's to allow for ImageSequence usage without using background paging threads, instead loading all the images on demand in the update traversal. --- include/osg/ImageSequence | 6 +++- src/osg/ImageSequence.cpp | 33 ++++++++++++++++--- src/osgPlugins/p3d/ReaderWriterP3D.cpp | 2 ++ .../deprecated-dotosg/osg/ImageSequence.cpp | 14 ++++++++ .../serializers/osg/ImageSequence.cpp | 2 ++ 5 files changed, 52 insertions(+), 5 deletions(-) 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="<