// Mouse movements void mouseMoveCB( int x, int y ) { if (window.valid()) { window->getEventQueue()->mouseMotion( x, y ); } }
// Mouse buttons void mouseButtonCB( int button, int state, int x, int y ) { if (window.valid()) { if (state==0) window->getEventQueue()->mouseButtonPress( x, y, button+1 ); else window->getEventQueue()->mouseButtonRelease( x, y, button+1 ); } }
// Reshaping the window void reshapeCB( int w, int h ) { // Update the window dimensions, in case the window has been resized. if (window.valid()) { window->resized(window->getTraits()->x, window->getTraits()->y, w, h); window->getEventQueue()->windowResize(window->getTraits()->x, window->getTraits()->y, w, h ); } }
void keyboard( unsigned char key, int /*x*/, int /*y*/ ) { switch( key ) { case 27: // clean up the viewer if (viewer.valid()) viewer = 0; glutDestroyWindow(glutGetWindow()); break; default: if (window.valid()) { window->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) key ); window->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) key ); } break; } }
bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* /*nv*/) { switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::MOVE): { if(_currentImageStream.valid() && (ea.getModKeyMask() & osgGA::GUIEventAdapter::MODKEY_SHIFT)) { float scalar = (ea.getXnormalized()+1) / 2.0; _currentImageStream->seek(scalar * _currentImageStream->getLength()); } } break; case(osgGA::GUIEventAdapter::RELEASE): { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); osgUtil::LineSegmentIntersector::Intersections intersections; bool foundIntersection = view==0 ? false : view->computeIntersections(ea, intersections); if (foundIntersection) { // use the nearest intersection const osgUtil::LineSegmentIntersector::Intersection& intersection = *(intersections.begin()); osg::Drawable* drawable = intersection.drawable.get(); osg::Geometry* geometry = drawable ? drawable->asGeometry() : 0; if (geometry) { osg::Texture* tex = geometry->getStateSet() ? dynamic_cast<osg::Texture*>(geometry->getStateSet()->getTextureAttribute(0, osg::StateAttribute::TEXTURE)) : NULL; if (tex) { osg::ImageStream* is = dynamic_cast<osg::ImageStream*>(tex->getImage(0)); if (is) { setColor(_currentGeometry.get(), osg::Vec4(0.7, 0.7, 0.7, 1.0)); _currentGeometry = geometry; setColor(_currentGeometry.get(), osg::Vec4(1,1,1,1)); _currentImageStream = is; if (is->getStatus() == osg::ImageStream::PLAYING) { is->pause(); } else { is->play(); } } } } } break; } case(osgGA::GUIEventAdapter::KEYDOWN): { if (!_currentImageStream.valid()) return false; if (ea.getKey()=='p') { osg::ImageStream::StreamStatus playToggle = _currentImageStream->getStatus(); if (playToggle != osg::ImageStream::PLAYING) { std::cout<< _currentImageStream.get() << " Play"<<std::endl; _currentImageStream->play(); } else { // playing, so pause std::cout<< _currentImageStream.get() << " Pause"<<std::endl; _currentImageStream->pause(); } return true; } else if (ea.getKey()=='r') { std::cout<< _currentImageStream.get() << " Restart"<<std::endl; _currentImageStream->rewind(); _currentImageStream->play(); return true; } else if (ea.getKey()=='>') { std::cout << _currentImageStream.get() << " Seeking"<<std::endl; _currentImageStream->seek(_currentImageStream->getCurrentTime() + 1.0); return true; } else if (ea.getKey()=='L') { if ( _currentImageStream->getLoopingMode() == osg::ImageStream::LOOPING) { std::cout<< _currentImageStream.get() << " Toggle Looping Off"<<std::endl; _currentImageStream->setLoopingMode( osg::ImageStream::NO_LOOPING ); } else { std::cout<< _currentImageStream.get() << " Toggle Looping On"<<std::endl; _currentImageStream->setLoopingMode( osg::ImageStream::LOOPING ); } return true; } else if (ea.getKey()=='+') { double tm = _currentImageStream->getTimeMultiplier(); tm += 0.1; _currentImageStream->setTimeMultiplier(tm); std::cout << _currentImageStream.get() << " Increase speed rate "<< _currentImageStream->getTimeMultiplier() << std::endl; return true; } else if (ea.getKey()=='-') { double tm = _currentImageStream->getTimeMultiplier(); tm -= 0.1; _currentImageStream->setTimeMultiplier(tm); std::cout << _currentImageStream.get() << " Decrease speed rate "<< _currentImageStream->getTimeMultiplier() << std::endl; return true; } else if (ea.getKey()=='o') { std::cout<< _currentImageStream.get() << " Frame rate "<< _currentImageStream->getFrameRate() <<std::endl; return true; } return false; } default: return false; } return false; }