From d0890ab250796a88a708fb613c3f47679891f161 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 25 Jul 2008 16:11:51 +0000 Subject: [PATCH] Updated wrappers, and further refined the ImageSequence API --- include/osg/ImageSequence | 22 ++++++------ include/osg/NodeVisitor | 4 +++ include/osgDB/ImagePager | 11 ++++-- src/osg/ImageSequence.cpp | 48 ++++++++++++++++++++----- src/osgDB/ImagePager.cpp | 8 +++++ src/osgWrappers/osg/ImageSequence.cpp | 50 ++++++++++++--------------- src/osgWrappers/osg/Node.cpp | 2 -- src/osgWrappers/osg/NodeVisitor.cpp | 14 ++++++++ src/osgWrappers/osgDB/ImagePager.cpp | 41 ++++++++++++++++++++++ 9 files changed, 149 insertions(+), 51 deletions(-) diff --git a/include/osg/ImageSequence b/include/osg/ImageSequence index b5e5d9a8a..fe3cd58e3 100644 --- a/include/osg/ImageSequence +++ b/include/osg/ImageSequence @@ -49,16 +49,20 @@ class OSG_EXPORT ImageSequence : public ImageStream virtual double getTimeMultiplier() const { return _timeMultiplier; } typedef std::list< osg::ref_ptr > Images; - typedef std::list< std::string > FileNames; + typedef std::vector< std::string > FileNames; + + enum Mode + { + PRE_LOAD_ALL_IMAGES, + PAGE_AND_RETAIN_IMAGES, + PAGE_AND_DISCARD_USED_IMAGES + }; + + void setMode(Mode mode); + Mode getMode() const { return _mode; } void setDuration(double duration); double getDuration() const { return _duration; } - - void setPreLoadTime(double preLoadTime) { _preLoadTime = preLoadTime; } - double getPreLoadTime() const { return _preLoadTime; } - - void setPruneOldImages(bool prune) { _pruneOldImages = prune; } - bool getPruneOldImages() const { return _pruneOldImages; } void addImageFile(const std::string& fileName); @@ -89,10 +93,8 @@ class OSG_EXPORT ImageSequence : public ImageStream double _referenceTime; double _timeMultiplier; + Mode _mode; double _duration; - double _preLoadTime; - - bool _pruneOldImages; double _timePerImage; diff --git a/include/osg/NodeVisitor b/include/osg/NodeVisitor index 53c4cd1d9..1f2d83593 100644 --- a/include/osg/NodeVisitor +++ b/include/osg/NodeVisitor @@ -291,6 +291,10 @@ class OSG_EXPORT NodeVisitor : public virtual Referenced ImageRequestHandler(): Referenced(true) {} + + virtual double getPreLoadTime() const = 0; + + virtual osg::Image* readImageFile(const std::string& fileName) = 0; virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const FrameStamp* framestamp) = 0; diff --git a/include/osgDB/ImagePager b/include/osgDB/ImagePager index 280d550eb..588fa83f8 100644 --- a/include/osgDB/ImagePager +++ b/include/osgDB/ImagePager @@ -32,9 +32,6 @@ class OSGDB_EXPORT ImagePager : public osg::NodeVisitor::ImageRequestHandler ImagePager(); - - - class OSGDB_EXPORT ImageThread : public osg::Referenced, public OpenThreads::Thread { public: @@ -75,8 +72,14 @@ class OSGDB_EXPORT ImagePager : public osg::NodeVisitor::ImageRequestHandler unsigned int getNumImageThreads() const { return _imageThreads.size(); } + void setPreLoadTime(double preLoadTime) { _preLoadTime=preLoadTime; } + virtual double getPreLoadTime() const { return _preLoadTime; } + + virtual osg::Image* readImageFile(const std::string& fileName); + virtual void requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const osg::FrameStamp* framestamp); + /** Return true if there are pending updates to the scene graph that require a call to updateSceneGraph(double). */ virtual bool requiresUpdateSceneGraph() const; @@ -157,6 +160,8 @@ class OSGDB_EXPORT ImagePager : public osg::NodeVisitor::ImageRequestHandler ImageThreads _imageThreads; osg::ref_ptr _completedQueue; + + double _preLoadTime; }; diff --git a/src/osg/ImageSequence.cpp b/src/osg/ImageSequence.cpp index a625d7cd9..8b10e5968 100644 --- a/src/osg/ImageSequence.cpp +++ b/src/osg/ImageSequence.cpp @@ -41,10 +41,9 @@ ImageSequence::ImageSequence() _referenceTime = DBL_MAX; _timeMultiplier = 1.0; + _mode = PRE_LOAD_ALL_IMAGES; _duration = 1.0; - _preLoadTime = 1.0; _timePerImage = 1.0; - _pruneOldImages = true; _fileNamesIterator = _fileNames.end(); _fileNamesIteratorTime = DBL_MAX; @@ -57,10 +56,9 @@ ImageSequence::ImageSequence(const ImageSequence& is,const CopyOp& copyop): osg::ImageStream(is,copyop), _referenceTime(is._referenceTime), _timeMultiplier(is._timeMultiplier), + _mode(is._mode), _duration(is._duration), - _timePerImage(is._timePerImage), - _preLoadTime(is._preLoadTime), - _pruneOldImages(is._pruneOldImages) + _timePerImage(is._timePerImage) { _fileNamesIterator = _fileNames.end(); _fileNamesIteratorTime = DBL_MAX; @@ -162,6 +160,8 @@ void ImageSequence::setImageToChild(const osg::Image* image) { // osg::notify(osg::NOTICE)<<"setImageToChild("<s(),image->t(),image->r(), image->getInternalTextureFormat(), image->getPixelFormat(),image->getDataType(), @@ -195,15 +195,47 @@ void ImageSequence::update(osg::NodeVisitor* nv) } double time = (fs->getSimulationTime() - _referenceTime)*_timeMultiplier; - double preLoadTime = (time+_preLoadTime)*_timeMultiplier; FileNames::iterator previous_fileNamesIterator = _fileNamesIterator; Images::iterator previous_imageIterator = _imageIterator; + bool pruneOldImages = false; + + bool looping = getLoopingMode()==LOOPING; + + switch(_mode) + { + case(PRE_LOAD_ALL_IMAGES): + { + if (_fileNames.size()>_images.size()) + { + for(unsigned int i=_images.size(); i<_fileNames.size(); ++i) + { + osg::Image* image = irh->readImageFile(_fileNames[i]); + _images.push_back(image); + } + } + + irh = 0; + break; + } + case(PAGE_AND_RETAIN_IMAGES): + { + break; + } + case(PAGE_AND_DISCARD_USED_IMAGES): + { + pruneOldImages = true; + break; + } + } + // osg::notify(osg::NOTICE)<<"time = "<getPreLoadTime())*_timeMultiplier; + // // Advance imageIterator // @@ -254,7 +286,7 @@ void ImageSequence::update(osg::NodeVisitor* nv) if (_imageIterator ==_images.end()) { - if (_pruneOldImages) + if (pruneOldImages) { _images.erase(previous_imageIterator, _imageIterator); previous_imageIterator = _images.begin(); @@ -274,7 +306,7 @@ void ImageSequence::update(osg::NodeVisitor* nv) if (_imageIterator!=_images.end() && previous_imageIterator != _imageIterator) { - if (_pruneOldImages) + if (pruneOldImages) { _images.erase(previous_imageIterator, _imageIterator); } diff --git a/src/osgDB/ImagePager.cpp b/src/osgDB/ImagePager.cpp index 122648f06..ce68631d3 100644 --- a/src/osgDB/ImagePager.cpp +++ b/src/osgDB/ImagePager.cpp @@ -244,6 +244,9 @@ ImagePager::ImagePager(): _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 1")); _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 2")); _imageThreads.push_back(new ImageThread(this, ImageThread::HANDLE_ALL_REQUESTS, "Image Thread 3")); + + // 100ms + _preLoadTime = 0.1; } ImagePager::~ImagePager() @@ -279,6 +282,11 @@ int ImagePager::cancel() return result; } +osg::Image* ImagePager::readImageFile(const std::string& fileName) +{ + return osgDB::readImageFile(fileName); +} + void ImagePager::requestImageFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const osg::FrameStamp* framestamp) { // osg::notify(osg::NOTICE)<<"ImagePager::requestNodeFile("< >, osg::ImageSequence::Images) -TYPE_NAME_ALIAS(std::list< std::string >, osg::ImageSequence::FileNames) +TYPE_NAME_ALIAS(std::vector< std::string >, osg::ImageSequence::FileNames) + +BEGIN_ENUM_REFLECTOR(osg::ImageSequence::Mode) + I_DeclaringFile("osg/ImageSequence"); + I_EnumLabel(osg::ImageSequence::PRE_LOAD_ALL_IMAGES); + I_EnumLabel(osg::ImageSequence::PAGE_AND_RETAIN_IMAGES); + I_EnumLabel(osg::ImageSequence::PAGE_AND_DISCARD_USED_IMAGES); +END_REFLECTOR BEGIN_OBJECT_REFLECTOR(osg::ImageSequence) I_DeclaringFile("osg/ImageSequence"); @@ -89,6 +96,16 @@ BEGIN_OBJECT_REFLECTOR(osg::ImageSequence) __double__getTimeMultiplier, "", ""); + I_Method1(void, setMode, IN, osg::ImageSequence::Mode, mode, + Properties::NON_VIRTUAL, + __void__setMode__Mode, + "", + ""); + I_Method0(osg::ImageSequence::Mode, getMode, + Properties::NON_VIRTUAL, + __Mode__getMode, + "", + ""); I_Method1(void, setDuration, IN, double, duration, Properties::NON_VIRTUAL, __void__setDuration__double, @@ -99,26 +116,6 @@ BEGIN_OBJECT_REFLECTOR(osg::ImageSequence) __double__getDuration, "", ""); - I_Method1(void, setPreLoadTime, IN, double, preLoadTime, - Properties::NON_VIRTUAL, - __void__setPreLoadTime__double, - "", - ""); - I_Method0(double, getPreLoadTime, - Properties::NON_VIRTUAL, - __double__getPreLoadTime, - "", - ""); - I_Method1(void, setPruneOldImages, IN, bool, prune, - Properties::NON_VIRTUAL, - __void__setPruneOldImages__bool, - "", - ""); - I_Method0(bool, getPruneOldImages, - Properties::NON_VIRTUAL, - __bool__getPruneOldImages, - "", - ""); I_Method1(void, addImageFile, IN, const std::string &, fileName, Properties::NON_VIRTUAL, __void__addImageFile__C5_std_string_R1, @@ -175,12 +172,9 @@ BEGIN_OBJECT_REFLECTOR(osg::ImageSequence) I_SimpleProperty(osg::ImageSequence::Images &, Images, __Images_R1__getImages, 0); - I_SimpleProperty(double, PreLoadTime, - __double__getPreLoadTime, - __void__setPreLoadTime__double); - I_SimpleProperty(bool, PruneOldImages, - __bool__getPruneOldImages, - __void__setPruneOldImages__bool); + I_SimpleProperty(osg::ImageSequence::Mode, Mode, + __Mode__getMode, + __void__setMode__Mode); I_SimpleProperty(double, ReferenceTime, __double__getReferenceTime, __void__setReferenceTime__double); @@ -239,5 +233,5 @@ END_REFLECTOR STD_LIST_REFLECTOR(std::list< osg::ref_ptr< osg::Image > >) -STD_LIST_REFLECTOR(std::list< std::string >) +STD_VECTOR_REFLECTOR(std::vector< std::string >) diff --git a/src/osgWrappers/osg/Node.cpp b/src/osgWrappers/osg/Node.cpp index c736d25df..3b0ebb864 100644 --- a/src/osgWrappers/osg/Node.cpp +++ b/src/osgWrappers/osg/Node.cpp @@ -487,5 +487,3 @@ STD_VECTOR_REFLECTOR(std::vector< osg::Matrix >) STD_VECTOR_REFLECTOR(std::vector< osg::NodePath >) -STD_VECTOR_REFLECTOR(std::vector< std::string >) - diff --git a/src/osgWrappers/osg/NodeVisitor.cpp b/src/osgWrappers/osg/NodeVisitor.cpp index b70b5b6e7..22c9f8c76 100644 --- a/src/osgWrappers/osg/NodeVisitor.cpp +++ b/src/osgWrappers/osg/NodeVisitor.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -416,11 +417,24 @@ BEGIN_ABSTRACT_OBJECT_REFLECTOR(osg::NodeVisitor::ImageRequestHandler) I_Constructor0(____ImageRequestHandler, "", ""); + I_Method0(double, getPreLoadTime, + Properties::PURE_VIRTUAL, + __double__getPreLoadTime, + "", + ""); + I_Method1(osg::Image *, readImageFile, IN, const std::string &, fileName, + Properties::PURE_VIRTUAL, + __osg_Image_P1__readImageFile__C5_std_string_R1, + "", + ""); I_Method4(void, requestImageFile, IN, const std::string &, fileName, IN, osg::Object *, attachmentPoint, IN, double, timeToMergeBy, IN, const osg::FrameStamp *, framestamp, Properties::PURE_VIRTUAL, __void__requestImageFile__C5_std_string_R1__osg_Object_P1__double__C5_FrameStamp_P1, "", ""); + I_SimpleProperty(double, PreLoadTime, + __double__getPreLoadTime, + 0); END_REFLECTOR BEGIN_VALUE_REFLECTOR(osg::ref_ptr< osg::Referenced >) diff --git a/src/osgWrappers/osgDB/ImagePager.cpp b/src/osgWrappers/osgDB/ImagePager.cpp index 2bec70a09..77874e45c 100644 --- a/src/osgWrappers/osgDB/ImagePager.cpp +++ b/src/osgWrappers/osgDB/ImagePager.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -28,6 +29,36 @@ BEGIN_OBJECT_REFLECTOR(osgDB::ImagePager) I_Constructor0(____ImagePager, "", ""); + I_Method1(osgDB::ImagePager::ImageThread *, getImageThread, IN, unsigned int, i, + Properties::NON_VIRTUAL, + __ImageThread_P1__getImageThread__unsigned_int, + "", + ""); + I_Method1(const osgDB::ImagePager::ImageThread *, getImageThread, IN, unsigned int, i, + Properties::NON_VIRTUAL, + __C5_ImageThread_P1__getImageThread__unsigned_int, + "", + ""); + I_Method0(unsigned int, getNumImageThreads, + Properties::NON_VIRTUAL, + __unsigned_int__getNumImageThreads, + "", + ""); + I_Method1(void, setPreLoadTime, IN, double, preLoadTime, + Properties::NON_VIRTUAL, + __void__setPreLoadTime__double, + "", + ""); + I_Method0(double, getPreLoadTime, + Properties::VIRTUAL, + __double__getPreLoadTime, + "", + ""); + I_Method1(osg::Image *, readImageFile, IN, const std::string &, fileName, + Properties::VIRTUAL, + __osg_Image_P1__readImageFile__C5_std_string_R1, + "", + ""); I_Method4(void, requestImageFile, IN, const std::string &, fileName, IN, osg::Object *, attachmentPoint, IN, double, timeToMergeBy, IN, const osg::FrameStamp *, framestamp, Properties::VIRTUAL, __void__requestImageFile__C5_std_string_R1__osg_Object_P1__double__C5_osg_FrameStamp_P1, @@ -48,6 +79,16 @@ BEGIN_OBJECT_REFLECTOR(osgDB::ImagePager) __int__cancel, "", ""); + I_ArrayProperty(osgDB::ImagePager::ImageThread *, ImageThread, + __ImageThread_P1__getImageThread__unsigned_int, + 0, + __unsigned_int__getNumImageThreads, + 0, + 0, + 0); + I_SimpleProperty(double, PreLoadTime, + __double__getPreLoadTime, + __void__setPreLoadTime__double); END_REFLECTOR BEGIN_ENUM_REFLECTOR(osgDB::ImagePager::ImageThread::Mode)