Further work on osg::ImageSequence/osgDB::ImagePager

This commit is contained in:
Robert Osfield
2008-07-21 21:00:57 +00:00
parent 73bcc2613c
commit 041a06b89d
12 changed files with 168 additions and 68 deletions

View File

@@ -53,6 +53,9 @@
namespace osg {
// forward declare
class NodeVisitor;
/** Image class for encapsulating the storage texture image data. */
class OSG_EXPORT Image : public Object
{
@@ -295,7 +298,7 @@ class OSG_EXPORT Image : public Object
/** Get the const PixelBufferObject.*/
const PixelBufferObject* getPixelBufferObject() const { return _bufferObject.get(); }
virtual void update(const osg::FrameStamp* fs) {}
virtual void update(NodeVisitor* nv) {}
protected :

View File

@@ -16,6 +16,7 @@
#include <OpenThreads/Mutex>
#include <osg/ImageStream>
#include <osg/StateAttribute>
#include <list>
@@ -30,7 +31,7 @@ class OSG_EXPORT ImageSequence : public ImageStream
ImageSequence();
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
ImageSequence(const ImageSequence& ImageSequence,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
ImageSequence(const ImageSequence& ImageSequence, const CopyOp& copyop=CopyOp::SHALLOW_COPY);
virtual Object* cloneType() const { return new ImageSequence(); }
virtual Object* clone(const CopyOp& copyop) const { return new ImageSequence(*this,copyop); }
@@ -47,18 +48,25 @@ class OSG_EXPORT ImageSequence : public ImageStream
virtual void setTimeMultiplier(double tm) { _timeMultiplier = tm; }
virtual double getTimeMultiplier() const { return _timeMultiplier; }
typedef std::list< osg::ref_ptr<osg::Image> > Images;
typedef std::list< std::string > FileNames;
typedef std::pair<osg::ref_ptr<osg::Image>, double> ImageDurationPair;
typedef std::pair<std::string, double> FileNameDurationPair;
void setDuration(double duration) { _duration = duration; }
double getDuration() const { return _duration; }
typedef std::list<ImageDurationPair> ImageDurationSequence;
typedef std::list<FileNameDurationPair> FileNameDurationSequence;
void setPruneOldImages(bool prune) { _pruneOldImages = prune; }
bool getPruneOldImages() const { return _pruneOldImages; }
void addImageFile(const std::string& fileName, double duration = 0.040);
void addImageFile(const std::string& fileName);
void addImage(osg::Image* image, double duration = 0.040);
void addImage(osg::Image* image);
virtual void update(const osg::FrameStamp* fs);
virtual void update(NodeVisitor* nv);
struct OSG_EXPORT UpdateCallback : public osg::StateAttribute::Callback
{
virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv);
};
protected:
@@ -70,10 +78,15 @@ class OSG_EXPORT ImageSequence : public ImageStream
double _timeMultiplier;
OpenThreads::Mutex _mutex;
FileNameDurationSequence _fileNameDurationSequence;
ImageDurationSequence _imageDuationSequence;
FileNames _fileNames;
double _duration;
bool _pruneOldImages;
double _imageHeadTime;
Images _images;
ImageDurationSequence::iterator _imageIterator;
Images::iterator _imageIterator;
double _imageIteratorTime;

View File

@@ -284,6 +284,30 @@ class OSG_EXPORT NodeVisitor : public virtual Referenced
const DatabaseRequestHandler* getDatabaseRequestHandler() const { return _databaseRequestHandler.get(); }
/** Callback for managing database paging, such as generated by PagedLOD nodes.*/
class ImageRequestHandler : public osg::Referenced
{
public:
ImageRequestHandler():
Referenced(true) {}
virtual void requestNodeFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest) = 0;
protected:
virtual ~ImageRequestHandler() {}
};
/** Set the handler for image requests.*/
void setImageRequestHandler(ImageRequestHandler* handler) { _imageRequestHandler = handler; }
/** Get the handler for image requests.*/
ImageRequestHandler* getImageRequestHandler() { return _imageRequestHandler.get(); }
/** Get the const handler for image requests.*/
const ImageRequestHandler* getImageRequestHandler() const { return _imageRequestHandler.get(); }
protected:
@@ -301,6 +325,7 @@ class OSG_EXPORT NodeVisitor : public virtual Referenced
ref_ptr<Referenced> _userData;
ref_ptr<DatabaseRequestHandler> _databaseRequestHandler;
ref_ptr<ImageRequestHandler> _imageRequestHandler;
};

View File

@@ -15,6 +15,7 @@
#define OSGDB_IMAGEPAGER 1
#include <osg/Image>
#include <osg/NodeVisitor>
#include <OpenThreads/Thread>
#include <OpenThreads/Mutex>
@@ -24,7 +25,7 @@
namespace osgDB
{
class OSGDB_EXPORT ImagePager : public osg::Referenced
class OSGDB_EXPORT ImagePager : public osg::NodeVisitor::ImageRequestHandler
{
public:
@@ -33,12 +34,12 @@ class OSGDB_EXPORT ImagePager : public osg::Referenced
struct ImageRequest : public osg::Referenced
{
ImageRequest():
osg::Referenced(true) {}
osg::Referenced(true),
_timeToMergeBy(0.0) {}
double _timeToMergeBy;
std::string _fileName;
osg::ref_ptr<ReaderWriter::Options> _loadOptions;
osg::ref_ptr<osg::Object> _objectToAttachTo;
osg::ref_ptr<osg::Image> _loadedImage;
@@ -76,8 +77,10 @@ class OSGDB_EXPORT ImagePager : public osg::Referenced
std::string _name;
};
virtual void requestNodeFile(const std::string& fileName,osg::Object* attachmentPoint, double timeToMergeBy, const osg::FrameStamp* framestamp, osg::ref_ptr<osg::Referenced>& imageRequest);
/** Return true if there are pending updates to the scene graph that require a call to updateSceneGraph(double). */
bool requiresUpdateSceneGraph() const;
virtual bool requiresUpdateSceneGraph() const;
/** Merge the changes to the scene graph. */
virtual void updateSceneGraph(double currentFrameTime);