Show
Ignore:
Timestamp:
08/14/08 18:28:45 (6 years ago)
Author:
robert
Message:

Added event handler to toggling looping and play/pause

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgimagesequence/osgimagesequence.cpp

    r8660 r8753  
    3535#include <iostream> 
    3636 
     37 
     38 
     39 
    3740// 
    3841// A simple demo demonstrating how to set on an animated texture using an osg::ImageSequence 
     
    9598 
    9699 
     100osg::ImageStream* s_imageStream = 0; 
     101class MovieEventHandler : public osgGA::GUIEventHandler 
     102{ 
     103public: 
     104 
     105    MovieEventHandler():_trackMouse(false),_playToggle(true) {} 
     106     
     107    void setMouseTracking(bool track) { _trackMouse = track; } 
     108    bool getMouseTracking() const { return _trackMouse; } 
     109     
     110    void set(osg::Node* node); 
     111 
     112    virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv); 
     113     
     114    virtual void getUsage(osg::ApplicationUsage& usage) const; 
     115 
     116    typedef std::vector< osg::observer_ptr<osg::ImageStream> > ImageStreamList; 
     117 
     118protected: 
     119 
     120    virtual ~MovieEventHandler() {} 
     121 
     122    class FindImageStreamsVisitor : public osg::NodeVisitor 
     123    { 
     124    public: 
     125        FindImageStreamsVisitor(ImageStreamList& imageStreamList): 
     126            _imageStreamList(imageStreamList) {} 
     127             
     128        virtual void apply(osg::Geode& geode) 
     129        { 
     130            apply(geode.getStateSet()); 
     131 
     132            for(unsigned int i=0;i<geode.getNumDrawables();++i) 
     133            { 
     134                apply(geode.getDrawable(i)->getStateSet()); 
     135            } 
     136         
     137            traverse(geode); 
     138        } 
     139 
     140        virtual void apply(osg::Node& node) 
     141        { 
     142            apply(node.getStateSet()); 
     143            traverse(node); 
     144        } 
     145         
     146        inline void apply(osg::StateSet* stateset) 
     147        { 
     148            if (!stateset) return; 
     149             
     150            osg::StateAttribute* attr = stateset->getTextureAttribute(0,osg::StateAttribute::TEXTURE); 
     151            if (attr) 
     152            { 
     153                osg::Texture2D* texture2D = dynamic_cast<osg::Texture2D*>(attr); 
     154                if (texture2D) apply(dynamic_cast<osg::ImageStream*>(texture2D->getImage())); 
     155 
     156                osg::TextureRectangle* textureRec = dynamic_cast<osg::TextureRectangle*>(attr); 
     157                if (textureRec) apply(dynamic_cast<osg::ImageStream*>(textureRec->getImage())); 
     158            } 
     159        } 
     160         
     161        inline void apply(osg::ImageStream* imagestream) 
     162        { 
     163            if (imagestream) 
     164            { 
     165                _imageStreamList.push_back(imagestream);  
     166                s_imageStream = imagestream; 
     167            } 
     168        } 
     169         
     170        ImageStreamList& _imageStreamList; 
     171    }; 
     172 
     173 
     174    bool            _playToggle; 
     175    bool            _trackMouse; 
     176    ImageStreamList _imageStreamList; 
     177     
     178}; 
     179 
     180 
     181 
     182void MovieEventHandler::set(osg::Node* node) 
     183{ 
     184    _imageStreamList.clear(); 
     185    if (node) 
     186    { 
     187        FindImageStreamsVisitor fisv(_imageStreamList); 
     188        node->accept(fisv); 
     189    } 
     190} 
     191 
     192 
     193bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv) 
     194{ 
     195    switch(ea.getEventType()) 
     196    { 
     197        case(osgGA::GUIEventAdapter::KEYDOWN): 
     198        { 
     199            if (ea.getKey()=='p') 
     200            { 
     201                for(ImageStreamList::iterator itr=_imageStreamList.begin(); 
     202                    itr!=_imageStreamList.end(); 
     203                    ++itr) 
     204                { 
     205                    if ((*itr)->getStatus()==osg::ImageStream::PLAYING) 
     206                    { 
     207                        // playing, so pause 
     208                        std::cout<<"Pause"<<std::endl; 
     209                        (*itr)->pause(); 
     210                    } 
     211                    else 
     212                    { 
     213                        // playing, so pause 
     214                        std::cout<<"Play"<<std::endl; 
     215                        (*itr)->play(); 
     216                    } 
     217                } 
     218                return true; 
     219            } 
     220            else if (ea.getKey()=='r') 
     221            { 
     222                for(ImageStreamList::iterator itr=_imageStreamList.begin(); 
     223                    itr!=_imageStreamList.end(); 
     224                    ++itr) 
     225                { 
     226                    std::cout<<"Restart"<<std::endl; 
     227                    (*itr)->rewind(); 
     228                    (*itr)->play(); 
     229                } 
     230                return true; 
     231            } 
     232            else if (ea.getKey()=='L') 
     233            { 
     234                for(ImageStreamList::iterator itr=_imageStreamList.begin(); 
     235                    itr!=_imageStreamList.end(); 
     236                    ++itr) 
     237                { 
     238                    if ( (*itr)->getLoopingMode() == osg::ImageStream::LOOPING) 
     239                    { 
     240                        std::cout<<"Toggle Looping Off"<<std::endl; 
     241                        (*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING ); 
     242                    } 
     243                    else 
     244                    { 
     245                        std::cout<<"Toggle Looping On"<<std::endl; 
     246                        (*itr)->setLoopingMode( osg::ImageStream::LOOPING ); 
     247                    } 
     248                } 
     249                return true; 
     250            } 
     251            return false; 
     252        } 
     253 
     254        default: 
     255            return false; 
     256    } 
     257    return false; 
     258} 
     259 
     260void MovieEventHandler::getUsage(osg::ApplicationUsage& usage) const 
     261{ 
     262    usage.addKeyboardMouseBinding("p","Play/Pause movie"); 
     263    usage.addKeyboardMouseBinding("r","Restart movie"); 
     264    usage.addKeyboardMouseBinding("l","Toggle looping of movie"); 
     265} 
     266 
     267 
     268 
     269 
    97270int main(int argc, char **argv) 
    98271{ 
     
    105278    viewer.setSceneData(createModel()); 
    106279 
     280    // pass the model to the MovieEventHandler so it can pick out ImageStream's to manipulate. 
     281    MovieEventHandler* meh = new MovieEventHandler(); 
     282    meh->set( viewer.getSceneData() ); 
     283    viewer.addEventHandler( meh ); 
     284 
     285 
    107286    std::string filename; 
    108287    if (arguments.read("-o",filename))