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; }
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; }