diff --git a/examples/osgimagesequence/osgimagesequence.cpp b/examples/osgimagesequence/osgimagesequence.cpp index 1109713b7..30cfeef8c 100644 --- a/examples/osgimagesequence/osgimagesequence.cpp +++ b/examples/osgimagesequence/osgimagesequence.cpp @@ -34,6 +34,9 @@ #include + + + // // A simple demo demonstrating how to set on an animated texture using an osg::ImageSequence // @@ -94,6 +97,176 @@ osg::Node* createModel() } +osg::ImageStream* s_imageStream = 0; +class MovieEventHandler : public osgGA::GUIEventHandler +{ +public: + + MovieEventHandler():_trackMouse(false),_playToggle(true) {} + + void setMouseTracking(bool track) { _trackMouse = track; } + bool getMouseTracking() const { return _trackMouse; } + + void set(osg::Node* node); + + virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv); + + virtual void getUsage(osg::ApplicationUsage& usage) const; + + typedef std::vector< osg::observer_ptr > ImageStreamList; + +protected: + + virtual ~MovieEventHandler() {} + + class FindImageStreamsVisitor : public osg::NodeVisitor + { + public: + FindImageStreamsVisitor(ImageStreamList& imageStreamList): + _imageStreamList(imageStreamList) {} + + virtual void apply(osg::Geode& geode) + { + apply(geode.getStateSet()); + + for(unsigned int i=0;igetStateSet()); + } + + traverse(geode); + } + + virtual void apply(osg::Node& node) + { + apply(node.getStateSet()); + traverse(node); + } + + inline void apply(osg::StateSet* stateset) + { + if (!stateset) return; + + osg::StateAttribute* attr = stateset->getTextureAttribute(0,osg::StateAttribute::TEXTURE); + if (attr) + { + osg::Texture2D* texture2D = dynamic_cast(attr); + if (texture2D) apply(dynamic_cast(texture2D->getImage())); + + osg::TextureRectangle* textureRec = dynamic_cast(attr); + if (textureRec) apply(dynamic_cast(textureRec->getImage())); + } + } + + inline void apply(osg::ImageStream* imagestream) + { + if (imagestream) + { + _imageStreamList.push_back(imagestream); + s_imageStream = imagestream; + } + } + + ImageStreamList& _imageStreamList; + }; + + + bool _playToggle; + bool _trackMouse; + ImageStreamList _imageStreamList; + +}; + + + +void MovieEventHandler::set(osg::Node* node) +{ + _imageStreamList.clear(); + if (node) + { + FindImageStreamsVisitor fisv(_imageStreamList); + node->accept(fisv); + } +} + + +bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv) +{ + switch(ea.getEventType()) + { + case(osgGA::GUIEventAdapter::KEYDOWN): + { + if (ea.getKey()=='p') + { + for(ImageStreamList::iterator itr=_imageStreamList.begin(); + itr!=_imageStreamList.end(); + ++itr) + { + if ((*itr)->getStatus()==osg::ImageStream::PLAYING) + { + // playing, so pause + std::cout<<"Pause"<pause(); + } + else + { + // playing, so pause + std::cout<<"Play"<play(); + } + } + return true; + } + else if (ea.getKey()=='r') + { + for(ImageStreamList::iterator itr=_imageStreamList.begin(); + itr!=_imageStreamList.end(); + ++itr) + { + std::cout<<"Restart"<rewind(); + (*itr)->play(); + } + return true; + } + else if (ea.getKey()=='L') + { + for(ImageStreamList::iterator itr=_imageStreamList.begin(); + itr!=_imageStreamList.end(); + ++itr) + { + if ( (*itr)->getLoopingMode() == osg::ImageStream::LOOPING) + { + std::cout<<"Toggle Looping Off"<setLoopingMode( osg::ImageStream::NO_LOOPING ); + } + else + { + std::cout<<"Toggle Looping On"<setLoopingMode( osg::ImageStream::LOOPING ); + } + } + return true; + } + return false; + } + + default: + return false; + } + return false; +} + +void MovieEventHandler::getUsage(osg::ApplicationUsage& usage) const +{ + usage.addKeyboardMouseBinding("p","Play/Pause movie"); + usage.addKeyboardMouseBinding("r","Restart movie"); + usage.addKeyboardMouseBinding("l","Toggle looping of movie"); +} + + + + int main(int argc, char **argv) { osg::ArgumentParser arguments(&argc,argv); @@ -104,6 +277,12 @@ int main(int argc, char **argv) // create a model from the images and pass it to the viewer. viewer.setSceneData(createModel()); + // pass the model to the MovieEventHandler so it can pick out ImageStream's to manipulate. + MovieEventHandler* meh = new MovieEventHandler(); + meh->set( viewer.getSceneData() ); + viewer.addEventHandler( meh ); + + std::string filename; if (arguments.read("-o",filename)) {