예제 #1
0
bool CameraViewSwitchManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter&)
{
    if (ea.getHandled()) return false;

    switch(ea.getEventType())
    {

        case(GUIEventAdapter::KEYDOWN):
            if (ea.getKey()=='[')
            {
                if (_currentView == 0)
                    _currentView = _cameraViews.size()-1;
                else
                    _currentView--;
                return true;
            }
            else if (ea.getKey()==']')
            {
                _currentView++;
                if (_currentView >= _cameraViews.size())
                    _currentView = 0;
                return true;
            }
            return false;

        default:
            return false;
    }
}
bool KeySwitchMatrixManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& aa)
{
    if (!_current) return false;

    bool handled = false;

    if (!ea.getHandled() && ea.getEventType()==GUIEventAdapter::KEYDOWN)
    {

        KeyManipMap::iterator it=_manips.find(ea.getKey());
        if(it != _manips.end())
        {
            CameraManipulator* selectedManipulator = it->second.second.get();
            if (selectedManipulator!=_current)
            {            
                OSG_INFO<<"Switching to manipulator: "<<it->second.first<<std::endl;
                if ( !selectedManipulator->getNode() )
                {
                    selectedManipulator->setNode(_current->getNode());
                }
                selectedManipulator->setByMatrix(_current->getMatrix());
                selectedManipulator->init(ea,aa);
                
                _current = selectedManipulator;
            }
            handled = true;
        }
    }

    return _current->handle(ea,aa) || handled;
}
예제 #3
0
bool ChaseCam::handle(const GUIEventAdapter& ea, GUIActionAdapter& us) 
{
    if (ea.getHandled()) return false;
    
    osgGA::GUIEventAdapter::EventType et = ea.getEventType();
    if (et == GUIEventAdapter::KEYDOWN || et == GUIEventAdapter::KEYUP)
    {
        bool onoff = (et == GUIEventAdapter::KEYDOWN);
        if (ea.getKey() == GUIEventAdapter::KEY_Space) {
            ship->sendInput(SpaceShipServer::ACCELERATE, onoff);
            return true;
        }
        else if (ea.getKey() == GUIEventAdapter::KEY_Left) {
            ship->sendInput(SpaceShipServer::LEFT, onoff);
            return true;
        }
        else if (ea.getKey() == GUIEventAdapter::KEY_Right) {
            ship->sendInput(SpaceShipServer::RIGHT, onoff);
            return true;
        }
        else if (ea.getKey() == GUIEventAdapter::KEY_Up) {
            ship->sendInput(SpaceShipServer::UP, onoff);
            return true;
        }
        else if (ea.getKey() == GUIEventAdapter::KEY_Down) {
            ship->sendInput(SpaceShipServer::DOWN, onoff);
            return true;
        }
        else if (ea.getKey() == GUIEventAdapter::KEY_S) {
            ship->sendInput(SpaceShipServer::BACK, onoff);
            return true;
        }
    }
    return false;
}
예제 #4
0
bool StateSetManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& aa)
{
    if(!_stateset.valid()) return false;

    if (!_initialized)
    {
        _initialized = true;
        _backface = (_stateset->getMode(GL_CULL_FACE)&osg::StateAttribute::ON);
        _lighting =(_stateset->getMode(GL_LIGHTING)&osg::StateAttribute::ON);

        unsigned int mode = osg::StateAttribute::INHERIT|osg::StateAttribute::ON;

        _texture = (_stateset->getTextureMode(0,GL_TEXTURE_2D)&mode)!=0 ||
                   (_stateset->getTextureMode(0,GL_TEXTURE_3D)&mode)!=0 ||
                   (_stateset->getTextureMode(0,GL_TEXTURE_RECTANGLE)&mode)!=0 ||
                   (_stateset->getTextureMode(0,GL_TEXTURE_CUBE_MAP)&mode)!=0;

        #if !defined(OSG_GLES1_AVAILABLE) && !defined(OSG_GLES2_AVAILABLE)
            _texture |= ((_stateset->getTextureMode(0,GL_TEXTURE_1D)&mode)!=0);
        #endif
    }

    if (ea.getHandled()) return false;

    if (ea.getEventType()==osgGA::GUIEventAdapter::KEYDOWN)
    {

        if ( ea.getKey() == _keyEventToggleBackfaceCulling )
        {
            setBackfaceEnabled(!getBackfaceEnabled());
            aa.requestRedraw();
            return true;
        }
        if ( ea.getKey() == _keyEventToggleLighting )
        {
                setLightingEnabled(!getLightingEnabled());
                aa.requestRedraw();
                return true;
        }
        if ( ea.getKey() == _keyEventToggleTexturing )
        {
                setTextureEnabled(!getTextureEnabled());
                aa.requestRedraw();
                return true;
        }
        if ( ea.getKey() == _keyEventCyclePolygonMode )
        {
                cyclePolygonMode();
                aa.requestRedraw();
                return true;
        }
    }

    return false;
}
예제 #5
0
bool Vwr::CameraManipulator::handle(const GUIEventAdapter& ea, GUIActionAdapter& us)
{
    switch(ea.getEventType())
    {
        case(GUIEventAdapter::FRAME):
        {
			return handleFrame(ea, us);
        }
        default:
            break;
    }

    if (ea.getHandled()) return false;

    switch(ea.getEventType())
    {
        case(GUIEventAdapter::PUSH):
        {
			return handlePush(ea, us);
        }
        case(GUIEventAdapter::RELEASE):
        {
            return handleRelease(ea, us);
        }
        case(GUIEventAdapter::DRAG):
        case(GUIEventAdapter::SCROLL):
        {
			return handleScroll(ea, us);
        }
        case(GUIEventAdapter::MOVE):
        {
            return false;
        }
		case(GUIEventAdapter::KEYDOWN):
		{
			return handleKeyDown(ea, us);
		}
		case(GUIEventAdapter::KEYUP):
		{
			return handleKeyUp( ea, us );
		}
        case(GUIEventAdapter::FRAME):
		{
            if (_thrown)
            {
                if (calcMovement()) us.requestRedraw();
            }

            return false;
		}
        default:
            return false;
    }
}
예제 #6
0
/** Handles events. Returns true if handled, false otherwise.*/
bool StandardManipulator::handle( const GUIEventAdapter& ea, GUIActionAdapter& us )
{
    switch( ea.getEventType() )
    {

        case GUIEventAdapter::FRAME:
            return handleFrame( ea, us );

        case GUIEventAdapter::RESIZE:
            return handleResize( ea, us );

        default:
            break;
   }

    if( ea.getHandled() )
        return false;

    switch( ea.getEventType() )
    {
        case GUIEventAdapter::MOVE:
            return handleMouseMove( ea, us );

        case GUIEventAdapter::DRAG:
            return handleMouseDrag( ea, us );

        case GUIEventAdapter::PUSH:
            return handleMousePush( ea, us );

        case GUIEventAdapter::RELEASE:
            return handleMouseRelease( ea, us );

        case GUIEventAdapter::KEYDOWN:
            return handleKeyDown( ea, us );

        case GUIEventAdapter::KEYUP:
            return handleKeyUp( ea, us );

        case GUIEventAdapter::SCROLL:
            if( _flags & PROCESS_MOUSE_WHEEL )
            return handleMouseWheel( ea, us );
            else
            return false;

        default:
            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;
}
예제 #8
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;
    }
}
예제 #9
0
bool DriveManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
{
    switch(ea.getEventType())
    {
        case(GUIEventAdapter::FRAME):
            addMouseEvent(ea);
            if (calcMovement()) us.requestRedraw();
            return false;

        case(GUIEventAdapter::RESIZE):
            init(ea,us);
            us.requestRedraw();
            return true;
        default:
            break;
    }

    if (ea.getHandled()) return false;

    switch(ea.getEventType())
    {
        case(GUIEventAdapter::PUSH):
        {

            addMouseEvent(ea);
            us.requestContinuousUpdate(true);
            if (calcMovement()) us.requestRedraw();
            return true;
        }

        case(GUIEventAdapter::RELEASE):
        {

            addMouseEvent(ea);
            us.requestContinuousUpdate(true);
            if (calcMovement()) us.requestRedraw();
            return true;
        }

        case(GUIEventAdapter::DRAG):
        {

            addMouseEvent(ea);
            us.requestContinuousUpdate(true);
            if (calcMovement()) us.requestRedraw();
            return true;
        }

        case(GUIEventAdapter::MOVE):
        {

            addMouseEvent(ea);
            us.requestContinuousUpdate(true);
            if (calcMovement()) us.requestRedraw();
            return true;
        }

        case(GUIEventAdapter::KEYDOWN):
        {
            if (ea.getKey()==GUIEventAdapter::KEY_Space)
            {
                flushMouseEventStack();
                home(ea,us);
                return true;
            }
            else if (ea.getKey()=='q')
            {
                _speedMode = USE_MOUSE_Y_FOR_SPEED;
                return true;
            }
            else if (ea.getKey()=='a')
            {
                _speedMode = USE_MOUSE_BUTTONS_FOR_SPEED;
                return true;
            }
#ifdef KEYBOARD_PITCH
            else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up ||
                     ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Up ||
                     ea.getKey()=='9')
            {
                _pitchUpKeyPressed = true;
                return true;
            }
            else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down ||
                     ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Down ||
                     ea.getKey()=='6')
            {
                _pitchDownKeyPressed = true;
                return true;
            }
#endif
            return false;
        }

        case(GUIEventAdapter::KEYUP):
        {
#ifdef KEYBOARD_PITCH
            if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up ||
                     ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Up ||
                     ea.getKey()=='9')
            {
                _pitchUpKeyPressed = false;
                return true;
            }
            else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down ||
                     ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Down ||
                     ea.getKey()=='6')
            {
                _pitchDownKeyPressed = false;
                return true;
            }
#endif
            return false;
        }

        default:
            return false;
    }
}
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;
    }
}