X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGMouseInput.cxx;h=927106f47c490543a4fa6425af1ca8318b931c0a;hb=f6c3a41b92f1e40749dfcd3b1afac5013ecaf719;hp=8ab430653589579b8556edc0fbe7c034a4c0ad8a;hpb=8cab5f9e60be3f0dbdb1fe18e5c475f5eb94a9cf;p=flightgear.git diff --git a/src/Input/FGMouseInput.cxx b/src/Input/FGMouseInput.cxx index 8ab430653..927106f47 100644 --- a/src/Input/FGMouseInput.cxx +++ b/src/Input/FGMouseInput.cxx @@ -22,9 +22,15 @@ // // $Id$ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include "FGMouseInput.hxx" +#include "Main/globals.hxx" + +using std::ios_base; - void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea ) { // Get the list of hit callbacks. Take the first callback that @@ -33,7 +39,7 @@ void ActivePickCallbacks::init( int b, const osgGA::GUIEventAdapter* ea ) // The nearest one is the first one and the deepest // (the most specialized one in the scenegraph) is the first. std::vector pickList; - if (FGRenderer::pick(pickList, ea)) { + if (globals->get_renderer()->pick(pickList, ea)) { std::vector::const_iterator i; for (i = pickList.begin(); i != pickList.end(); ++i) { if (i->callback->buttonPressed(b, i->info)) { @@ -75,6 +81,7 @@ const FGMouseInput::MouseCursorMap FGMouseInput::mouse_cursor_map[] = { FGMouseInput * FGMouseInput::mouseInput = NULL; FGMouseInput::FGMouseInput() : + haveWarped(false), xSizeNode(fgGetNode("/sim/startup/xsize", false ) ), ySizeNode(fgGetNode("/sim/startup/ysize", false ) ), xAccelNode(fgGetNode("/devices/status/mice/mouse/accel-x", true ) ), @@ -180,6 +187,7 @@ void FGMouseInput::update ( double dt ) m.x = (xSizeNode ? xSizeNode->getIntValue() : 800) / 2; m.y = (ySizeNode ? ySizeNode->getIntValue() : 600) / 2; fgWarpMouse(m.x, m.y); + haveWarped = true; } else { SG_LOG(SG_INPUT, SG_DEBUG, "Mouse mode " << mode << " out of range"); fgSetMouseCursor(MOUSE_CURSOR_POINTER); @@ -321,37 +329,51 @@ void FGMouseInput::doMouseMotion (int x, int y) m.y = y; return; } - + + if (haveWarped) + { + // don't fire mouse-movement events at the first update after warping the mouse, + // just remember the new mouse position + haveWarped = false; + } + else + { // OK, PUI didn't want the event, // so we can play with it. - if (x != m.x) { - int delta = x - m.x; - xAccelNode->setIntValue( delta ); - for (unsigned int i = 0; i < mode.x_bindings[modifiers].size(); i++) - mode.x_bindings[modifiers][i]->fire(double(delta), double(xsize)); - } - if (y != m.y) { - int delta = y - m.y; - yAccelNode->setIntValue( -delta ); - for (unsigned int i = 0; i < mode.y_bindings[modifiers].size(); i++) - mode.y_bindings[modifiers][i]->fire(double(delta), double(ysize)); + if (x != m.x) { + int delta = x - m.x; + xAccelNode->setIntValue( delta ); + for (unsigned int i = 0; i < mode.x_bindings[modifiers].size(); i++) + mode.x_bindings[modifiers][i]->fire(double(delta), double(xsize)); + } + if (y != m.y) { + int delta = y - m.y; + yAccelNode->setIntValue( -delta ); + for (unsigned int i = 0; i < mode.y_bindings[modifiers].size(); i++) + mode.y_bindings[modifiers][i]->fire(double(delta), double(ysize)); + } } - // Constrain the mouse if requested if (mode.constrained) { + int new_x=x,new_y=y; + bool need_warp = false; if (x <= (xsize * .25) || x >= (xsize * .75)) { - x = int(xsize * .5); + new_x = int(xsize * .5); need_warp = true; } if (y <= (ysize * .25) || y >= (ysize * .75)) { - y = int(ysize * .5); + new_y = int(ysize * .5); need_warp = true; } if (need_warp) - fgWarpMouse(x, y); + { + fgWarpMouse(new_x, new_y); + haveWarped = true; + SG_LOG(SG_INPUT, SG_DEBUG, "Mouse warp: " << x << ", " << y << " => " << new_x << ", " << new_y); + } } if (m.x != x)