bool OrbitCameraManipulator::handleMouseRelease( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); if( !view ) return false; if( ea.getButtonMask() == 0 ) { double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; if( timeSinceLastRecordEvent > 0.02 ) { flushMouseEventStack(); } if( isMouseMoving() ) { if( performMovement( ea, aa ) && _allowThrow ) { aa.requestRedraw(); aa.requestContinuousUpdate( true ); _thrown = true; // TODO: fade out throw animation } return true; } } if( !m_pointer_push_drag ) { // select object bool intersection_geometry_found = intersectSceneSelect( ea, view ); if( !intersection_geometry_found ) { // click to background -> unselect all if( m_system != nullptr ) { m_system->clearSelection(); } } } m_pointer_push_drag = false; flushMouseEventStack(); addMouseEvent( ea ); if( performMovement( ea, aa ) ) { aa.requestRedraw(); } aa.requestContinuousUpdate( false ); _thrown = false; return true; }
/*! * * \param ea * Adapter udalosti. * * Metoda spomali pohyb na zaklade zdroja prijatej udalosti. * */ bool CameraManipulator::handleKeyUp( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter & us) { switch( ea.getKey() ) { case osgGA::GUIEventAdapter::KEY_Space: { flushMouseEventStack(); _thrown = false; _distance = 1.0f; home(ea,us); us.requestRedraw(); us.requestContinuousUpdate(false); stop(); break; } case osgGA::GUIEventAdapter::KEY_Up: case osgGA::GUIEventAdapter::KEY_Down: decelerateForwardRate = true; break; case osgGA::GUIEventAdapter::KEY_Right: case osgGA::GUIEventAdapter::KEY_Left: decelerateSideRate = true; break; case osgGA::GUIEventAdapter::KEY_Page_Up: case osgGA::GUIEventAdapter::KEY_Page_Down: decelerateVerticalRate = true; break; } return true; }
bool CameraManipulator::handlePush(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { if (ea.getButtonMask() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) { if (_distance != 0) { lastDistance = _distance; osg::Vec3d eye, cameraCenter, up; osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>( &us ); viewer->getCamera()->getViewMatrixAsLookAt(eye, cameraCenter, up); _center = eye; _distance = 0; } else _distance = lastDistance; return true; } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; } }
bool CameraManipulator::handleRelease(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { if (ea.getButtonMask()==0) { double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; if (timeSinceLastRecordEvent>0.02) flushMouseEventStack(); if (isMouseMoving()) { if (calcMovement()) { us.requestRedraw(); us.requestContinuousUpdate(true); _thrown = _allowThrow; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } } else { flushMouseEventStack(); addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; } return true; }
// mouse button has been pushed down bool OrbitCameraManipulator::handleMousePush( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa ) { osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa); if( !view ) { return false; } m_pointer_push_drag = false; flushMouseEventStack(); addMouseEvent( ea ); m_ga_pointer_push = &ea; intersectSceneRotateCenter( ea, view ); int buttonMask = ea.getButtonMask(); if( buttonMask == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON || buttonMask == (osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON | osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) ) { m_pan_point.set( m_pointer_intersection ); } if( buttonMask == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON ) { osg::Vec3d distance_intersect_eye( m_pointer_intersection - m_eye ); //double distance_eye_intersection = distance_intersect_eye.length(); // rotate the intersection cone into mouse ray direction if( m_intersect_hit_geometry ) { } } aa.requestRedraw(); aa.requestContinuousUpdate( false ); _thrown = false; return false; }
bool FPSManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us) { /* switch(ea.getEventType()) { case(GUIEventAdapter::FRAME): if (_thrown) { if (calcMovement()) us.requestRedraw(); } return false; default: break; }*/ if (ea.getHandled()) return false; switch(ea.getEventType()) { //if a key is pressed flush the previous states /* case(GUIEventAdapter::PUSH): { flushMouseEventStack(); addMouseEvent(ea); return true; } case(GUIEventAdapter::RELEASE): { if (ea.getButtonMask()==0) { double timeSinceLastRecordEvent = _ga_t0.valid() ? (ea.getTime() - _ga_t0->getTime()) : DBL_MAX; if (timeSinceLastRecordEvent>0.02) flushMouseEventStack(); calcMovement(); } else { flushMouseEventStack(); addMouseEvent(ea); } return true; }*/ /* case(GUIEventAdapter::DRAG): { addMouseEvent(ea); if (calcMovement()) us.requestRedraw(); us.requestContinuousUpdate(false); _thrown = false; return true; }*/ /* case(GUIEventAdapter::MOVE): { return false; }*/ case(osgGA::GUIEventAdapter::KEYDOWN): if (ea.getKey()== osgGA::GUIEventAdapter::KEY_Space) //home on space bar { flushMouseEventStack(); home(0.); return true; } return false; case(osgGA::GUIEventAdapter::FRAME): { addMouseEvent(ea); calcMovement(); } return false; default: return false; } }
void FPSManipulator::init(const osgGA::GUIEventAdapter& ,osgGA::GUIActionAdapter& ) { flushMouseEventStack(); }
bool FPSManipulator::calcMovement() { // return if less then two events have been added. if (_ga_t0.get()==NULL || _ga_t1.get()==NULL) return false; float dx = _ga_t0->getXnormalized()-_ga_t1->getXnormalized(); float dy = _ga_t0->getYnormalized()-_ga_t1->getYnormalized(); // float distance = sqrtf(dx*dx + dy*dy); // return if there is no movement. /* if (distance==0.0f) { return false; }*/ // unsigned int buttonMask = _ga_t1->getButtonMask(); // if (buttonMask==osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)//pk for test, to be removed after { // rotate camera. float px0 = _ga_t0->getXnormalized(); float py0 = _ga_t0->getYnormalized(); float px1 = _ga_t1->getXnormalized(); float py1 = _ga_t1->getYnormalized(); //test the border to reset the position if(px0>0.9 || px0<-0.9 || py0>0.9 || py0<-0.9) { _gw->requestWarpPointer((_ga_t0->getXmax() - _ga_t0->getXmin())/2,(_ga_t0->getYmax() - _ga_t0->getYmin())/2); flushMouseEventStack(); //rest to avoid big move } double speed = _mouseScale; //default 50.0 //horizontal rotation osg::Quat qh(osg::DegreesToRadians((px1-px0)*speed), osg::Z_AXIS); //vertical rotation //rotation axis //here axis is more complex osg::Vec3d geteye, getcenter, getup; getInverseMatrix().getLookAt(geteye, getcenter, getup); osg::Vec3d front = getcenter - geteye; front.normalize(); osg::Vec3d axis = front ^ osg::Z_AXIS; axis.normalize(); //test and stop the vertical rotation double scalar = front * osg::Z_AXIS; osg::Quat qv; qv = osg::Quat(osg::DegreesToRadians((py0-py1)*speed+computeAnimation()), axis); if((scalar > 0.9 && py0 > py1 ) || (scalar < -0.9 && py0 < py1 )) //going up or down near vertical axis { qv = osg::Quat(-osg::DegreesToRadians((py0-py1)*speed), axis); //inverse rotation } //then apply the rotations _rotation = _rotation*qv*qh; return true; } /* else if (buttonMask==GUIEventAdapter::MIDDLE_MOUSE_BUTTON || buttonMask==(GUIEventAdapter::LEFT_MOUSE_BUTTON|GUIEventAdapter::RIGHT_MOUSE_BUTTON)) { // pan model. float scale = -0.3f*_distance; osg::Matrix rotation_matrix; rotation_matrix.makeRotate(_rotation); osg::Vec3 dv(dx*scale,dy*scale,0.0f); _center += dv*rotation_matrix; return true; } else if (buttonMask==GUIEventAdapter::RIGHT_MOUSE_BUTTON) { // zoom model. float fd = _distance; float scale = 1.0f+dy; if (fd*scale>_modelScale*_minimumZoomScale) { _distance *= scale; } else { // notify(DEBUG_INFO) << "Pushing forward"<<std::endl; // push the camera forward. float scale = -fd; osg::Matrix rotation_matrix(_rotation); osg::Vec3 dv = (osg::Vec3(0.0f,0.0f,-1.0f)*rotation_matrix)*(dy*scale); _center += dv; } return true; }*/ return false; }