From acd7e65687e867123782a17e66e5436903939c56 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 21 Jul 2008 17:28:22 +0000 Subject: [PATCH] Added basic image sequencing --- .../osgimagesequence/osgimagesequence.cpp | 57 ++++---------- include/osg/Image | 3 + include/osg/ImageSequence | 18 +++-- include/osg/ImageStream | 2 - src/osg/ImageSequence.cpp | 74 ++++++++++++++++++- src/osgWrappers/osg/Image.cpp | 19 +++++ src/osgWrappers/osg/ImageStream.cpp | 6 -- 7 files changed, 119 insertions(+), 60 deletions(-) diff --git a/examples/osgimagesequence/osgimagesequence.cpp b/examples/osgimagesequence/osgimagesequence.cpp index 41bb3dc7b..82143f4cc 100644 --- a/examples/osgimagesequence/osgimagesequence.cpp +++ b/examples/osgimagesequence/osgimagesequence.cpp @@ -35,46 +35,20 @@ // including using of texture extensions. // - -typedef std::vector< osg::ref_ptr > ImageList; - - -class MyGraphicsContext { - public: - MyGraphicsContext() +struct ImageUpdateCallback : public osg::StateAttribute::Callback +{ + /** do customized update code.*/ + virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv) + { + const osg::FrameStamp* fs = nv!=0 ? nv->getFrameStamp() : 0; + osg::Texture2D* texture2D = dynamic_cast(attr); + if (texture2D && texture2D->getImage() && fs) { - osg::ref_ptr traits = new osg::GraphicsContext::Traits; - traits->x = 0; - traits->y = 0; - traits->width = 1; - traits->height = 1; - traits->windowDecoration = false; - traits->doubleBuffer = false; - traits->sharedContext = 0; - traits->pbuffer = true; - - _gc = osg::GraphicsContext::createGraphicsContext(traits.get()); - - if (!_gc) - { - traits->pbuffer = false; - _gc = osg::GraphicsContext::createGraphicsContext(traits.get()); - } - - if (_gc.valid()) - { - _gc->realize(); - _gc->makeCurrent(); - } + texture2D->getImage()->update(fs); } - - bool valid() const { return _gc.valid() && _gc->isRealized(); } - - private: - osg::ref_ptr _gc; + } }; - osg::StateSet* createState() { // read 4 2d images @@ -89,22 +63,19 @@ osg::StateSet* createState() imageSequence->addImage(image_2.get(), 0.25); imageSequence->addImage(image_3.get(), 0.25); - imageSequence->setImage(image_0->s(),image_0->t(),image_0->r(), - image_0->getInternalTextureFormat(), - image_0->getPixelFormat(),image_0->getDataType(), - image_0->data(), - osg::Image::NO_DELETE, - image_0->getPacking()); - osg::Texture2D* texture = new osg::Texture2D; texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR); texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR); texture->setWrap(osg::Texture2D::WRAP_R,osg::Texture2D::REPEAT); texture->setResizeNonPowerOfTwoHint(false); texture->setImage(imageSequence.get()); + //texture->setTextureSize(512,512); + + texture->setUpdateCallback(new ImageUpdateCallback); // create the StateSet to store the texture data osg::StateSet* stateset = new osg::StateSet; + stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON); return stateset; diff --git a/include/osg/Image b/include/osg/Image index 0f12ca953..1375754e2 100644 --- a/include/osg/Image +++ b/include/osg/Image @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -293,6 +294,8 @@ class OSG_EXPORT Image : public Object /** Get the const PixelBufferObject.*/ const PixelBufferObject* getPixelBufferObject() const { return _bufferObject.get(); } + + virtual void update(const osg::FrameStamp* fs) {} protected : diff --git a/include/osg/ImageSequence b/include/osg/ImageSequence index 49a11d5eb..80fee41f3 100644 --- a/include/osg/ImageSequence +++ b/include/osg/ImageSequence @@ -58,19 +58,23 @@ class OSG_EXPORT ImageSequence : public ImageStream void addImage(osg::Image* image, double duration = 0.040); - virtual void update(osg::FrameStamp* fs); + virtual void update(const osg::FrameStamp* fs); protected: virtual ~ImageSequence() {} - double _referenceTime; - double _timeMultiplier; + void setImageToChild(const osg::Image* image); + + double _referenceTime; + double _timeMultiplier; - - OpenThreads::Mutex _mutex; - FileNameDurationSequence _fileNameDurationSequence; - ImageDurationSequence _imageDuationSequence; + OpenThreads::Mutex _mutex; + FileNameDurationSequence _fileNameDurationSequence; + ImageDurationSequence _imageDuationSequence; + + ImageDurationSequence::iterator _imageIterator; + double _imageIteratorTime; }; diff --git a/include/osg/ImageStream b/include/osg/ImageStream index a47e2b0db..0b4dd86c1 100644 --- a/include/osg/ImageStream +++ b/include/osg/ImageStream @@ -15,7 +15,6 @@ #define OSG_IMAGESTREAM 1 #include -#include namespace osg { @@ -79,7 +78,6 @@ class OSG_EXPORT ImageStream : public Image virtual void setVolume(float) {} virtual float getVolume() const { return 0.0f; } - virtual void update(osg::FrameStamp* fs) {} protected: virtual void applyLoopingMode() {} diff --git a/src/osg/ImageSequence.cpp b/src/osg/ImageSequence.cpp index ee4417482..f419554ac 100644 --- a/src/osg/ImageSequence.cpp +++ b/src/osg/ImageSequence.cpp @@ -13,13 +13,19 @@ #include #include +#include +#include + +#include using namespace osg; ImageSequence::ImageSequence() { - _referenceTime = 0.0; + _referenceTime = DBL_MAX; + _imageIteratorTime = DBL_MAX; _timeMultiplier = 1.0; + _imageIterator = _imageDuationSequence.end(); } ImageSequence::ImageSequence(const ImageSequence& is,const CopyOp& copyop): @@ -36,17 +42,81 @@ int ImageSequence::compare(const Image& rhs) const void ImageSequence::addImageFile(const std::string& fileName, double duration) { + if (duration<0.01) duration = 0.01; + OpenThreads::ScopedLock lock(_mutex); _fileNameDurationSequence.push_back(FileNameDurationPair(fileName, duration)); } void ImageSequence::addImage(osg::Image* image, double duration) { + if (duration<0.01) duration = 0.01; + OpenThreads::ScopedLock lock(_mutex); _imageDuationSequence.push_back(ImageDurationPair(image, duration)); + + if (_imageIterator==_imageDuationSequence.end()) + { + _imageIterator = _imageDuationSequence.begin(); + _imageIteratorTime = _referenceTime; + setImageToChild(_imageIterator->first.get()); + } + } -void ImageSequence::update(osg::FrameStamp* fs) +void ImageSequence::setImageToChild(const osg::Image* image) +{ + setImage(image->s(),image->t(),image->r(), + image->getInternalTextureFormat(), + image->getPixelFormat(),image->getDataType(), + const_cast(image->data()), + osg::Image::NO_DELETE, + image->getPacking()); +} + +void ImageSequence::update(const osg::FrameStamp* fs) { OpenThreads::ScopedLock lock(_mutex); + // osg::notify(osg::NOTICE)<<"ImageSequence::update("<getSimulationTime(); + } + + if (_imageIteratorTime == DBL_MAX) + { + _imageIteratorTime = _referenceTime; + } + + double time = (fs->getSimulationTime() - _referenceTime)*_timeMultiplier; + + // osg::notify(osg::NOTICE)<<"time = "< #include -#include #include #include #include @@ -148,11 +147,6 @@ BEGIN_OBJECT_REFLECTOR(osg::ImageStream) __float__getVolume, "", ""); - I_Method1(void, update, IN, osg::FrameStamp *, fs, - Properties::VIRTUAL, - __void__update__osg_FrameStamp_P1, - "", - ""); I_ProtectedMethod0(void, applyLoopingMode, Properties::VIRTUAL, Properties::NON_CONST,