diff --git a/src/osgPresentation/Timeout.cpp b/src/osgPresentation/Timeout.cpp index e14201dcb..b88130a0c 100644 --- a/src/osgPresentation/Timeout.cpp +++ b/src/osgPresentation/Timeout.cpp @@ -18,6 +18,75 @@ using namespace osgPresentation; +class OperationVisitor : public osg::NodeVisitor +{ +public: + + enum Operation + { + ENTER, + LEAVE, + RESET + }; + + OperationVisitor(Operation op) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), _operation(op), _sleepTime(0.0) {} + + void apply(osg::Node& node) + { + if (node.getStateSet()) process(node.getStateSet()); + traverse(node); + } + + void apply(osg::Geode& geode) + { + apply(static_cast(geode)); + + for(unsigned int i=0;igetStateSet()) process(drawable->getStateSet()); + } + } + + virtual void process(osg::StateSet* ss) + { + for(unsigned int i=0;igetTextureAttributeList().size();++i) + { + osg::Texture* texture = dynamic_cast(ss->getTextureAttribute(i,osg::StateAttribute::TEXTURE)); + osg::Image* image = texture ? texture->getImage(0) : 0; + osg::ImageStream* imageStream = dynamic_cast(image); + if (imageStream) process(imageStream); + } + } + + void process(osg::ImageStream* video) + { + if (_operation==ENTER) + { + video->rewind(); + video->play(); + + _sleepTime = 0.2; + } + else if (_operation==LEAVE) + { + video->pause(); + } + else if (_operation==RESET) + { + video->rewind(); + + _sleepTime = 0.2; + } + } + + double sleepTime() const { return _sleepTime; } + + Operation _operation; + double _sleepTime; +}; + + HUDSettings::HUDSettings(double slideDistance, float eyeOffset, unsigned int leftMask, unsigned int rightMask): _slideDistance(slideDistance), _eyeOffset(eyeOffset), @@ -247,6 +316,17 @@ void Timeout::traverse(osg::NodeVisitor& nv) OSG_NOTICE<<"Doing display broadcast key event"<<_displayBroadcastKeyPos._key<(1000000.0*leave.sleepTime())); + OSG_NOTICE<<"Finished Pause "<