bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv) { switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::FRAME): { double t = ea.getTime(); bool printed(false); ImageStreamPlayBackSpeedList::iterator fps_itr = _imageStreamPlayBackSpeedList.begin(); for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr, ++fps_itr) { if (((*itr)->getStatus()==osg::ImageStream::PLAYING) && ((*itr)->data() != (*fps_itr).lastData)) { ImageStreamPlaybackSpeedData& data(*fps_itr); double dt = (data.timeStamp > 0) ? t - data.timeStamp : 1/60.0; data.lastData = (*itr)->data(); data.fps = (*fps_itr).fps * 0.8 + 0.2 * (1/dt); data.timeStamp = t; if (t-data.lastOutput > 1) { std::cout << data.fps << " "; data.lastOutput = t; printed = true; } } } if (printed) std::cout << std::endl; } break; case(osgGA::GUIEventAdapter::MOVE): { if (_trackMouse) { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { double dt = (*itr)->getLength() * ((1.0+ea.getXnormalized()) / 2.0); (*itr)->seek(dt); std::cout << "seeking to " << dt << " length: " <<(*itr)->getLength() << std::endl; } } return false; } 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"<<std::endl; (*itr)->pause(); } else { // playing, so pause std::cout<<"Play"<<std::endl; (*itr)->play(); } } return true; } else if (ea.getKey()=='r') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { std::cout<<"Restart"<<std::endl; (*itr)->rewind(); } 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"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING ); } else { std::cout<<"Toggle Looping On"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::LOOPING ); } } return true; } else if (ea.getKey() == 'i') { setTrackMouse(!_trackMouse); } return false; } default: return false; } return false; }
bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv) { switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::MOVE): case(osgGA::GUIEventAdapter::PUSH): case(osgGA::GUIEventAdapter::RELEASE): { if (_trackMouse) { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); osgUtil::LineSegmentIntersector::Intersections intersections; bool foundIntersection = view==0 ? false : (nv==0 ? view->computeIntersections(ea, intersections) : view->computeIntersections(ea, nv->getNodePath(), 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; osg::Vec3Array* vertices = geometry ? dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()) : 0; if (vertices) { // get the vertex indices. const osgUtil::LineSegmentIntersector::Intersection::IndexList& indices = intersection.indexList; const osgUtil::LineSegmentIntersector::Intersection::RatioList& ratios = intersection.ratioList; if (indices.size()==3 && ratios.size()==3) { unsigned int i1 = indices[0]; unsigned int i2 = indices[1]; unsigned int i3 = indices[2]; float r1 = ratios[0]; float r2 = ratios[1]; float r3 = ratios[2]; osg::Array* texcoords = (geometry->getNumTexCoordArrays()>0) ? geometry->getTexCoordArray(0) : 0; osg::Vec2Array* texcoords_Vec2Array = dynamic_cast<osg::Vec2Array*>(texcoords); if (texcoords_Vec2Array) { // we have tex coord array so now we can compute the final tex coord at the point of intersection. osg::Vec2 tc1 = (*texcoords_Vec2Array)[i1]; osg::Vec2 tc2 = (*texcoords_Vec2Array)[i2]; osg::Vec2 tc3 = (*texcoords_Vec2Array)[i3]; osg::Vec2 tc = tc1*r1 + tc2*r2 + tc3*r3; osg::notify(osg::NOTICE)<<"We hit tex coords "<<tc<<std::endl; } } else { osg::notify(osg::NOTICE)<<"Intersection has insufficient indices to work with"; } } } else { osg::notify(osg::NOTICE)<<"No intersection"<<std::endl; } } break; } case(osgGA::GUIEventAdapter::KEYDOWN): { if (ea.getKey()=='p') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { osg::ImageStream::StreamStatus playToggle = (*itr)->getStatus(); if (playToggle != osg::ImageStream::PLAYING) { std::cout<< (*itr).get() << " Play"<<std::endl; (*itr)->play(); } else { // playing, so pause std::cout<< (*itr).get() << " Pause"<<std::endl; (*itr)->pause(); } } return true; } else if (ea.getKey()=='r') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { std::cout<< (*itr).get() << " Restart"<<std::endl; (*itr)->rewind(); (*itr)->play(); } return true; } else if (ea.getKey()=='>') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { std::cout<<"Seeking"<<std::endl; if(_seekIncr > 3) _seekIncr = 0; double length = (*itr)->getLength(); double t_pos = (length/4.0f)*_seekIncr; //(*itr)->rewind(); (*itr)->seek(t_pos); (*itr)->play(); _seekIncr++; } 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<< (*itr).get() << " Toggle Looping Off"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING ); } else { std::cout<< (*itr).get() << " Toggle Looping On"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::LOOPING ); } } return true; } else if (ea.getKey()=='+') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { double tm = (*itr)->getTimeMultiplier(); tm += 0.1; (*itr)->setTimeMultiplier(tm); std::cout << (*itr).get() << " Increase speed rate "<< (*itr)->getTimeMultiplier() << std::endl; } return true; } else if (ea.getKey()=='-') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { double tm = (*itr)->getTimeMultiplier(); tm -= 0.1; (*itr)->setTimeMultiplier(tm); std::cout << (*itr).get() << " Decrease speed rate "<< (*itr)->getTimeMultiplier() << std::endl; } return true; } else if (ea.getKey()=='o') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { std::cout<< (*itr).get() << " Frame rate "<< (*itr)->getFrameRate() <<std::endl; } return true; } return false; } default: return false; } return false; }
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"<<std::endl; (*itr)->pause(); } else { // playing, so pause std::cout<<"Play"<<std::endl; (*itr)->play(); } } return true; } else if (ea.getKey()=='r') { for(ImageStreamList::iterator itr=_imageStreamList.begin(); itr!=_imageStreamList.end(); ++itr) { std::cout<<"Restart"<<std::endl; (*itr)->rewind(); } 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"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING ); } else { std::cout<<"Toggle Looping On"<<std::endl; (*itr)->setLoopingMode( osg::ImageStream::LOOPING ); } } return true; } return false; } default: return false; } return false; }