예제 #1
0
/// Handles GUIEventAdapter::RELEASE event.
bool StandardManipulator::handleMouseRelease( const GUIEventAdapter& ea, 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( performMovement() && _allowThrow )
            {
                us.requestRedraw();
                us.requestContinuousUpdate( true );
                _thrown = true;
            }

            return true;
        }
    }

    flushMouseEventStack();
    addMouseEvent( ea );
    if( performMovement() )
        us.requestRedraw();
    us.requestContinuousUpdate( false );
    _thrown = false;

    return true;
}
예제 #2
0
// UNUSED. Future Uses
bool ViroManipulator::handleRelease(const GUIEventAdapter& ea){
	// Mid Button
	if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){
		return true;
		}

	// Left Button
	else if (ea.getButtonMask() == GUIEventAdapter::LEFT_MOUSE_BUTTON){
		return true;
		}

	// Right Button
	else if (ea.getButtonMask() == GUIEventAdapter::RIGHT_MOUSE_BUTTON){
		Enable(PERIPHERAL_LOCK);
		return true;
		}
	return false;
}
예제 #3
0
파일: EventQueue.cpp 프로젝트: carlsonp/osg
void EventQueue::mouseMotion(float x, float y, double time)
{
    _accumulateEventState->setX(x);
    _accumulateEventState->setY(y);

    GUIEventAdapter* event = new GUIEventAdapter(*_accumulateEventState);
    event->setEventType(event->getButtonMask() ? GUIEventAdapter::DRAG : GUIEventAdapter::MOVE);
    event->setTime(time);
    
    addEvent(event);
}
예제 #4
0
//Event Listener
bool ViroManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us){
	_lastFrameTime = ea.getTime();
	switch( ea.getEventType() ){
		case(GUIEventAdapter::FRAME):{
			addMouseEvent(ea);

			// Main auto-management engine
			if (RollWithYaw >0.0 || isEnabled(COLLISIONS)) AutoControl( ea.time() );
			
			// Check if Trace is needed
			if ( _bNeedUpdateTrace ) Trace();
			
			// Handle Fly-To if any
			if (_bFlying) handleFlyToTransition( ea.time() );

			if ( MouseListener() ) us.requestRedraw();
			us.requestContinuousUpdate(true);
			return false;
			}
		case(GUIEventAdapter::RESIZE):{
			init(ea,us);
			us.requestRedraw();
			return true;
			}
		case(GUIEventAdapter::MOVE):{
			addMouseEvent(ea);

			if ( MouseListener() ) us.requestRedraw();
			us.requestContinuousUpdate(true);
			return true;
			}
		case(GUIEventAdapter::SCROLL):{
			//addMouseEvent(ea);
			//osg::notify(ALWAYS) << "Scroll\n";
			switch (ea.getScrollingMotion()){
				case(GUIEventAdapter::SCROLL_UP):{
					addMouseEvent(ea);
					osg::notify(ALWAYS) << "Scroll-up\n";

					if ( MouseListener() ) us.requestRedraw();
					us.requestContinuousUpdate(true);
					return true;
					}
				case(GUIEventAdapter::SCROLL_DOWN):{
					addMouseEvent(ea);
					osg::notify(ALWAYS) << "Scroll-down\n";

					if ( MouseListener() ) us.requestRedraw();
					us.requestContinuousUpdate(true);
					return true;
					}
				}

			//if ( MouseListener() ) us.requestRedraw();
			//us.requestContinuousUpdate(true);
			//return true;
			}

/* OLD IMPLEMENTATION for OSG 1.0
		case(GUIEventAdapter::SCROLL_UP):{
			addMouseEvent(ea);
			osg::notify(ALWAYS) << "Scroll-up\n";

			if ( MouseListener() ) us.requestRedraw();
			us.requestContinuousUpdate(true);
			return true;
			}
		case(GUIEventAdapter::SCROLL_DOWN):{
			addMouseEvent(ea);
			osg::notify(ALWAYS) << "Scroll-down\n";

			if ( MouseListener() ) us.requestRedraw();
			us.requestContinuousUpdate(true);
			return true;
			}
*/
		// double click
/*
		case(GUIEventAdapter::DOUBLECLICK):{
			osg::notify(DEBUG_INFO)<<"Double Left click.\n";
			_bSatMode = false;
			if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time());
			}
*/
		// Mouse Button Push
		case(GUIEventAdapter::PUSH):{
			//addMouseEvent(ea);
			
			// Mid Button
			if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){	
				//osg::notify(DEBUG_INFO)<<"Mid-Mouse pressed.\n";
				//_bSatMode = false;
				_bMidButton = true;

				// During a Fly-To, stop flying...
				if (_bFlying){
					_speed     = 0.0;
					_bFlying   = false;
					Disable(PERIPHERAL_LOCK);
					}

				else {
					float a = 0.4;
					if (_bHoldCTRL) a = 0.0;

					if (!_Viewer && handlePick(_ev0->getX() ,_ev0->getY(),a) &&!_bFlying) FlyTo(ea.time());
					else if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized(),a) &&!_bFlying) FlyTo(ea.time());
					}
				}
			
			// Left Button
			else if (ea.getButtonMask() == GUIEventAdapter::LEFT_MOUSE_BUTTON){
				
				// Double-Click
				/*
				if ((ea.time() -_tLastLMB) < 0.4){
					osg::notify(DEBUG_INFO)<<"Double Left click.\n";
					_bSatMode = false;
					//if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time());
					//if (handlePick(_ev0->getX(),_ev0->getY())&&!_bFlying) FlyTo(ea.time());
					if (!_Viewer && handlePick(_ev0->getX() ,_ev0->getY())&&!_bFlying) FlyTo(ea.time());
					else if (handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())&&!_bFlying) FlyTo(ea.time());
					}
				*/
				// Single Click
				/* else */ {
					osg::notify(DEBUG_INFO)<<"Left Button pressed.\n";
					// During a Fly-To, stop flying...
					if (_bFlying){
						_bFlying   = false;
						//Disable(PERIPHERAL_LOCK);
						}

					_speed = 0.0;
					_UserControlPercentage = 1.0;
					}
				_tLastLMB = ea.time();	// Update time last LMB.
				}

			// Right Button
			else if (ea.getButtonMask() == GUIEventAdapter::RIGHT_MOUSE_BUTTON){
				Disable(PERIPHERAL_LOCK);
				/*
				if (_bHoldCTRL){
					if (!_bFlying && handlePick(_ev0->getXnormalized(),_ev0->getYnormalized())) _vLastPickedPoint = _vStoredEye[TO]; 
					}
				*/
				}

			if ( MouseListener() ) us.requestRedraw();
			//us.requestContinuousUpdate(true);
			return true;
			}

		case(GUIEventAdapter::RELEASE):{
			Enable(PERIPHERAL_LOCK);

			
			if (ea.getButtonMask() == GUIEventAdapter::MIDDLE_MOUSE_BUTTON){
				_bMidButton = false;
				}

			//handleRelease( ea );
			us.requestContinuousUpdate(false);
			return true;
			}

		// Keyboard
		case(GUIEventAdapter::KEYDOWN):{
			//osg::notify(DEBUG_INFO) << "A key has been pressed...\n";

			if (ea.getKey()==GUIEventAdapter::KEY_Control_L){
				_bHoldCTRL = true;

				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()==' '){
				flushMouseEventStack();
				//home(ea,us);
				
				requestFlyToHome();
				FlyTo( ea.getTime() );

				us.requestRedraw();
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== 'v'){
				flushMouseEventStack();

				//_vStoredEye[ViroManipulator::TO]      = _vEye;	OLD
				//_qStoredRotation[ViroManipulator::TO] = _qRotation;		OLD
				storeView();

				osg::notify(ALWAYS) << "Position stored. Press 'c' when you want to recall it.\n";
				us.requestContinuousUpdate(false);
				return true;
				}
			/*
			if (ea.getKey()== 'c'){
				flushMouseEventStack();
				osg::notify(ALWAYS) << "Recalled stored position.\n";
				
				//FlyTo( ea.time() ); OLD
				reloadView();

				us.requestRedraw();
				us.requestContinuousUpdate(false);
				return true;
				}
			*/
			if (ea.getKey()== 'S'){
				flushMouseEventStack();
				Invert(SPIDERMAN_PICKING);
				if (isEnabled(SPIDERMAN_PICKING)) osg::notify(ALWAYS) << "SpiderMan Mode ON.\n";
				else osg::notify(ALWAYS) << "SpiderMan Mode OFF.\n";
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== GUIEventAdapter::KEY_Up){
				_padEvent = NAVPAD_FORWARD;
				us.requestContinuousUpdate(false);
				}
			if (ea.getKey()== GUIEventAdapter::KEY_Down){
				_padEvent = NAVPAD_BACKWARD;
				us.requestContinuousUpdate(false);
				}
			if (ea.getKey()== GUIEventAdapter::KEY_Page_Up){
				_padEvent = NAVPAD_UP;
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== GUIEventAdapter::KEY_Left){
				_padEvent = NAVPAD_STRAFELEFT;
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== GUIEventAdapter::KEY_Right){
				_padEvent = NAVPAD_STRAFERIGHT;
				us.requestContinuousUpdate(false);
				return true;
			}
			if (ea.getKey()== GUIEventAdapter::KEY_Page_Down){
				_padEvent = NAVPAD_DOWN;
				us.requestContinuousUpdate(false);
				return true;
			}
			if (ea.getKey()== 'f'){
				
				// TODO : Switch Fullscreen ON/OFF
				
				return true;
				}
			if (ea.getKey()== 'l' || ea.getKey()== 'L'){
				/*
				_HeadLight->getLight()->setLightNum(3);
				_HeadLight->getLight()->setDiffuse( Vec4(1,1,1, 0) );
				_HeadLight->getLight()->setDirection( _vLook );
				_HeadLight->getLight()->setPosition( Vec4(_vEye.x(),_vEye.y(),_vEye.z(), 0) );
				*/
				//_bLockZ = !_bLockZ;
				Invert(Z_LOCK);

				if ( isEnabled(Z_LOCK) ){
					_zLock = _vEye.z();
					/*
					SyncData();
					osg::Vec3d D = _vLook;
					D.normalize();
					_vLockDir = D;
					*/
					}

				us.requestContinuousUpdate(false);
				return true;
				}
				
			if (ea.getKey()== 'c' || ea.getKey()== 'C'){
				flushMouseEventStack();
				Invert(COLLISIONS);
				//if (isEnabled(COLLISIONS)) osg::notify(ALWAYS) << "Model Collision ON.\n";
				//else osg::notify(ALWAYS) << "Model Collision OFF.\n";
				us.requestContinuousUpdate(false);
				return true;
				}
			/*
			if (ea.getKey()== 'i'){
				flushMouseEventStack();
				_Viewer->getCamera()->setProjectionMatrixAsPerspective(30.0,3, 0.01,50);
				us.requestContinuousUpdate(false);
				return true;
				}
			*/
			if (ea.getKey()== 'g' || ea.getKey()== 'w'){
				flushMouseEventStack();
				Invert(GRAVITY);
				//if (isEnabled(GRAVITY)) osg::notify(ALWAYS) << "Gravity ON.\n";
				//else osg::notify(ALWAYS) << "Gravity OFF.\n";
				us.requestContinuousUpdate(false);
				return true;
				}
				
			// Keyboard navigation
			if (ea.getKey()== 'a'){
				/*
				//flushMouseEventStack();
				Enable(PERIPHERAL_LOCK);
				double d = 50.;
				turn( d*getDtime(), 0.0);
				SyncData();
				*/
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== 'd'){
				/*
				//flushMouseEventStack();
				Enable(PERIPHERAL_LOCK);
				double d = 50.;
				turn(-d* getDtime(), 0.0);
				SyncData();
				*/
				us.requestContinuousUpdate(false);
				return true;
			}
			if (0&& ea.getKey()== 'w'){
				/*
				//flushMouseEventStack();
				Enable(PERIPHERAL_LOCK);
				_speed += Acceleration * getDtime();
				boost();
				SyncData();
				*/
				us.requestContinuousUpdate(false);
				return true;
			}
			if (ea.getKey()== 's'){
				/*
				//flushMouseEventStack();
				Enable(PERIPHERAL_LOCK);
				_speed = 0.0;
				*/
				us.requestContinuousUpdate(false);
				return true;
			}
			if (ea.getKey()== 'x'){
				/*
				//flushMouseEventStack();
				Enable(PERIPHERAL_LOCK);
				_speed -= Acceleration * getDtime();
				boost();
				SyncData();
				*/
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== '+'){
				double l,r,b,t,z,Z;
				_Viewer->getCamera()->getProjectionMatrixAsFrustum(l,r,b,t,z,Z);
				l *= 0.9;
				r *= 0.9;
				b *= 0.9;
				t *= 0.9;
				_Viewer->getCamera()->setProjectionMatrixAsFrustum(l,r,b,t,z,Z);
				us.requestContinuousUpdate(false);
				return true;
				}
			if (ea.getKey()== '-'){
				double l,r,b,t,z,Z;
				_Viewer->getCamera()->getProjectionMatrixAsFrustum(l,r,b,t,z,Z);
				l *= 1.1;
				r *= 1.1;
				b *= 1.1;
				t *= 1.1;
				_Viewer->getCamera()->setProjectionMatrixAsFrustum(l,r,b,t,z,Z);
				us.requestContinuousUpdate(false);
				return true;
				}

			return true;
			}
		case(GUIEventAdapter::KEYUP):{
			_padEvent = NAVPAD_NONE;

			if (ea.getKey()==GUIEventAdapter::KEY_Control_L){
				_bHoldCTRL = false;

				us.requestContinuousUpdate(false);
				return true;
				}

			return true;
			}
		
		default: return false;
		}
//	return false;
}
// --------------------------------------------------------------------------------------------------
bool SphericalManipulator::handle(const GUIEventAdapter &ea, GUIActionAdapter &us)
{
    switch (ea.getEventType())
    {
    case (GUIEventAdapter::FRAME):
    {
        double current_frame_time = ea.getTime();

        _delta_frame_time = current_frame_time - _last_frame_time;
        _last_frame_time  = current_frame_time;

        if (_thrown)
        {
            if (calcMovement())
                us.requestRedraw();
        }

        return false;
    }

    default:
        break;
    }

    if (ea.getHandled())
        return false;

    switch (ea.getEventType())
    {
    case (GUIEventAdapter::PUSH):
    {
        flushMouseEventStack();
        addMouseEvent(ea);
        us.requestContinuousUpdate(false);
        _thrown = false;
        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();

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

    case (GUIEventAdapter::DRAG):
    case (GUIEventAdapter::SCROLL):
    {
        addMouseEvent(ea);
        if (calcMovement())
            us.requestRedraw();

        us.requestContinuousUpdate(false);
        _thrown = false;
        return true;
    }

    case (GUIEventAdapter::MOVE):
    {
        return false;
    }

    case (GUIEventAdapter::KEYDOWN):
        if (ea.getKey() == GUIEventAdapter::KEY_Space)
        {
            flushMouseEventStack();
            _thrown = false;
            home(ea, us);
            return true;
        }

        return false;

    case (GUIEventAdapter::FRAME):
        if (_thrown)
        {
            if (calcMovement())
                us.requestRedraw();
        }

        return false;

    default:
        return false;
    }

    return false;
}
예제 #6
0
bool TerrainManipulator::handle(const GUIEventAdapter& ea,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())
    {
        case(GUIEventAdapter::PUSH):
        {
            flushMouseEventStack();
            addMouseEvent(ea);
            if (calcMovement()) us.requestRedraw();
            us.requestContinuousUpdate(false);
            _thrown = false;
            return true;
        }

        case(GUIEventAdapter::RELEASE):
        {
            if (ea.getButtonMask()==0)
            {

                if (isMouseMoving())
                {
                    if (calcMovement())
                    {
                        us.requestRedraw();
                        us.requestContinuousUpdate(true);
                        _thrown = true;
                    }
                }
                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;
        }

        case(GUIEventAdapter::DRAG):
        {
            addMouseEvent(ea);
            if (calcMovement()) us.requestRedraw();
            us.requestContinuousUpdate(false);
            _thrown = false;
            return true;
        }

        case(GUIEventAdapter::MOVE):
        {
            return false;
        }

        case(GUIEventAdapter::KEYDOWN):
            if (ea.getKey()== GUIEventAdapter::KEY_Space)
            {
                flushMouseEventStack();
                _thrown = false;
                home(ea,us);
                us.requestRedraw();
                us.requestContinuousUpdate(false);
                return true;
            }
            return false;
        default:
            return false;
    }
}
예제 #7
0
bool PanoManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
{

if(StartMoment == 0.0) // only do this once at actual startup of drawing
	{
	ClearStartMoment();
	} // if

unsigned int buttonMask = ea.getButtonMask();

switch(ea.getEventType())
    {
    case(GUIEventAdapter::PUSH):
        {
		GlobalTipSupport->HideBalloonTip();
		if(GetGlobalViewer())
			{
			SetCapture(GetGlobalViewerHWND());
			} // if
		if((buttonMask & GUIEventAdapter::LEFT_MOUSE_BUTTON) && (Navigation::GetCurrentNavMode() == Navigation::NAV_NM_QUERY))
			{
			PossibleQueryInitiating = true;
			} // if
		else
			{
			if(buttonMask & GUIEventAdapter::MIDDLE_MOUSE_BUTTON)
				{ // determine and record orbit point
				osg::Vec3 NewOrbitCenter;
				if(GetFirstTangibleHitLocation(ea.getX(), ea.getY(), NewOrbitCenter))
					{
					SetOrbitCenter(NewOrbitCenter);
					} // if
				else
					{
					ClearOrbitCenter();
					} // else
				} // if
			PossibleQueryInitiating = false;
			addMouseEvent(ea);
			us.requestContinuousUpdate(true);
			if(GetDelayedGoto())
				{
				Goto(ea.getX(), ea.getY());
				} // if
			else
				{
				if (calcMovement(ea, us)) us.requestRedraw();
				} // else
			} // if
        return true;
        } // PUSH
    case(GUIEventAdapter::RELEASE):
        {
        if(buttonMask & GUIEventAdapter::MIDDLE_MOUSE_BUTTON)
			{
			ClearOrbitCenter();
			} // if
		if(GetGlobalViewer())
			{
			if(GetCapture() == GetGlobalViewerHWND())
				{
				ReleaseCapture();
				} // if
			} // if
        addMouseEvent(ea);
        us.requestContinuousUpdate(true);
        if(Navigation::GetCurrentNavMode() == Navigation::NAV_NM_QUERY)
			{
#ifdef NVW_SUPPORT_QUERYACTION
			// Query/Action fires on mouseUP, to no weird state is interfering with newly-opened windows
			if(PossibleQueryInitiating) PerformQueryAction(ea.getX(), ea.getY(), false);
#endif // NVW_SUPPORT_QUERYACTION
			} // if
		else
			{
			PossibleQueryInitiating = false;
	        if (calcMovement(ea, us)) us.requestRedraw();
	        } // else
        return true;
        } // RELEASE
    case(GUIEventAdapter::DRAG):
        {
        addMouseEvent(ea);
        us.requestContinuousUpdate(true);
        if (calcMovement(ea, us)) us.requestRedraw();
        return true;
        } // DRAG
    case(GUIEventAdapter::MOVE):
        {
        MarkLastMouseMoveMoment();
        addMouseEvent(ea);
        us.requestContinuousUpdate(true);
        if (calcMovement(ea, us)) us.requestRedraw();

        return true;
        } // MOVE
    case(GUIEventAdapter::KEYDOWN):
		{
        if (ea.getKey()==' ')
            {
			GlobalTipSupport->HideBalloonTip();
            EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_NAVIGATION, EventDispatcher::NVW_ESC_NAVIGATION_THROTTLE, EventDispatcher::NVW_PC_ZERO);
			flushMouseEventStack();
            home(ea,us);
            us.requestRedraw();
            us.requestContinuousUpdate(false);
            return true;
            } // if
        if (ea.getKey()=='.')
            {
			GlobalTipSupport->HideBalloonTip();
			EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_NAVIGATION, EventDispatcher::NVW_ESC_NAVIGATION_THROTTLE, EventDispatcher::NVW_PC_ZERO);
            flushMouseEventStack();
            halt(ea,us);
            us.requestRedraw();
            us.requestContinuousUpdate(false);
            return true;
            } // if
        return false;
		} // KEYDOWN
    case(GUIEventAdapter::FRAME):
		{
		if(!GetMouseInactiveOneShot() && GetMouseInactiveTime() > NVW_PANOMANIPULATOR_MOUSE_INACTIVE_TIME_SECONDS && (GetSystemTimeFP() - GetLastMovementMoment()) > NVW_PANOMANIPULATOR_MOUSE_INACTIVE_TIME_SECONDS)
			{
			SetMouseInactiveOneShot(true); // make it only fire once
			EventDispatcher::DispatchEvent(EventDispatcher::NVW_EC_ACTION, EventDispatcher::NVW_ESC_ACTION_QUERYHERE, EventDispatcher::NVW_PC_LESS);
			} // if
		GlobalTipSupport->HandleBalloonTipTimeout();
        addMouseEvent(ea);
		if(GetTourInProgress())
			{
			GlobalTipSupport->HideBalloonTip();
			InternalTour();
			// we don't redraw, as the animation part of the tour is handled by Transition code, below
			} // if
		if(GetTransitionInProgress())
			{
			GlobalTipSupport->HideBalloonTip();
			InternalTrans();
			us.requestRedraw();
			} // if
		else if(GetAnimationInProgress())
			{
			GlobalTipSupport->HideBalloonTip();
			InternalAnim();
			us.requestRedraw();
			} // if
		else
			{
			// handle HotNav disk
			if(MasterScene.GetHotNavFwdBackAmount() != 0.0 || MasterScene.GetHotNavSideAmount() != 0.0 )
				{
				GlobalTipSupport->HideBalloonTip();
				ExecuteMovement(MasterScene.GetHotNavSideAmount(), MasterScene.GetHotNavFwdBackAmount(), 0.0);
				us.requestRedraw();
				} // if
			// handle HotTurn disk
			if(MasterScene.GetHotTurnHAmount() != 0.0 || MasterScene.GetHotTurnVAmount() != 0.0 )
				{
				// hot turn is too hot without the constant scaling factor
				GlobalTipSupport->HideBalloonTip();
				ExecuteRotate(MasterScene.GetHotTurnHAmount() * .01, 0.0, MasterScene.GetHotTurnVAmount() * .01); 
				us.requestRedraw();
				} // if
	        if (calcMovement(ea, us)) us.requestRedraw();
			} // else
        return true;
		} // FRAME
    case(GUIEventAdapter::RESIZE):
		{
		GlobalTipSupport->HideBalloonTip();
        init(ea,us);
        us.requestRedraw();
        return true;
		} // RESIZE
    default:
        return false;
    } // switch
} // PanoManipulator::handle
bool SceneGraphManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
{
    if (ea.getHandled()) return false;

    BaseViewer *v = dynamic_cast<BaseViewer*>(&us);
    if (!v)
        return false;
    else if (!_init) {_sceneGraph = dynamic_cast<SceneGraph*>(getUserData()); _init=true;}

    Viewer2D3D *v2d3d = dynamic_cast<Viewer2D3D*>(v->getGraphicsViewer());
    if (!v2d3d)
        return false;

    if(_sceneGraph.valid() && _sceneGraph->getScene())
        setInteractionMode(v2d3d->getProjectionType(), (_sceneGraph->getScene()->getBound()).center(), v2d3d->getZoom());

    switch(ea.getEventType())
    {
    case(GUIEventAdapter::PUSH):
        flushMouseEventStack();
        addMouseEvent(ea);
        if (calcMovement()) us.requestRedraw();
        us.requestContinuousUpdate(false);
        _thrown = false;
        return true;

    case(GUIEventAdapter::RELEASE):
        if (ea.getButtonMask()==0)
            if (isMouseMoving())
            {
                if (calcMovement())
                {
                    us.requestRedraw();
                    us.requestContinuousUpdate(false);
                    _thrown = false;
                }
            }
            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;

    case(GUIEventAdapter::DRAG):
        addMouseEvent(ea);
        if (calcMovement()) us.requestRedraw();
        us.requestContinuousUpdate(false);
        _thrown = false;
        return true;

    case(GUIEventAdapter::MOVE):
        return false;

    case(GUIEventAdapter::KEYDOWN):
        if (ea.getKey()== _resetCameraKey) // reset camera
        {
            flushMouseEventStack();
            _thrown = false;
            home(ea,us);
            us.requestRedraw();
            us.requestContinuousUpdate(false);
            return true;
        }
        else if(ea.getKey() >= 0xFFE1 && ea.getKey() <= 0xFFEE)
        { // modifier keys
            _currentModifier = ea.getKey();
            return true;
        }
        return false;
    case(GUIEventAdapter::KEYUP):
    {
        if(ea.getKey() == _currentModifier)
        {
            _currentModifier = 0;
            return true;
        }
        return false;
    }
    case(GUIEventAdapter::FRAME):
        if (_thrown && calcMovement()) us.requestRedraw();
        return false;
    default:
        return false;
    }
}