Hi All,
When using the mouse in view-direction mode, the mouse warps back to the centre
of the screen (0,0) when it reaches half-way towards any edge. This is good as
it stops the window losing focus on X windows.
However, because it warped back to (0,0), the warp had the effect or reseting
the other coordinate.
For example, if you were rotating a view above an aircraft, when the mouse
reached the X-limit, the mouse is warped back to the center, reseting the Y
value to 0 and causing the view to return to the Y=0 plane.
The patch below fixes this behaviour on OSG by warping the mouse properly.
Note that this changes the arguments for fgWarpMouse from the pixel coordinate
system to a normalized one where (0.0, 0.0) is the centre of the screen. I
have fixed all the references to fgWarpMouse, but some of these are in #ifdefs
that don't apply to my platform (Windows), so I would appreciate if someone who
compiles with X_CURSOR_TWEAKS could test the behaviour on their system.
Could someone please review it, and assuming it meets with approval, commit it.
Thanks,
-Stuart
Index: src/GUI/mouse.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/GUI/mouse.cxx,v
retrieving revision 1.16
diff -u -r1.16 mouse.cxx
--- src/GUI/mouse.cxx 9 May 2007 20:41:08 -0000 1.16
+++ src/GUI/mouse.cxx 17 Aug 2007 20:34:05 -0000
@@ -123,7 +123,7 @@
}
#endif
#if defined(X_CURSOR_TWEAKS)
- fgWarpMouse( MOUSE_XSIZE/2, MOUSE_YSIZE/2 );
+ fgWarpMouse(0.0f,0.0f);
#endif
}
@@ -133,7 +133,7 @@
#if defined(WIN32_CURSOR_TWEAKS)
fgSetMouseCursor(MOUSE_CURSOR_NONE);
#elif defined(X_CURSOR_TWEAKS)
- fgWarpMouse( MOUSE_XSIZE, MOUSE_YSIZE );
+ fgWarpMouse(1.0f,1.0f);
#endif
}
Index: src/Input/input.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Input/input.cxx,v
retrieving revision 1.95
diff -u -r1.95 input.cxx
--- src/Input/input.cxx 13 Jul 2007 10:15:48 -0000 1.95
+++ src/Input/input.cxx 17 Aug 2007 21:04:19 -0000
@@ -373,7 +373,12 @@
}
if (need_warp)
- fgWarpMouse(x, y);
+ {
+ // Convert to normalized values from -1.0 to 1.0. Y-values are reversed.
+ float normx = (2.0f * ((float) x) /((float) xsize)) - 1.0f;
+ float normy = 1.0f - (2.0f * ((float) y) /((float) ysize));
+ fgWarpMouse(normx, normy);
+ }
}
if (m.x != x)
@@ -849,9 +854,7 @@
m.timeout = fgGetDouble( "/sim/mouse/cursor-timeout-sec", 10.0 );
if (mode >= 0 && mode < m.nModes) {
fgSetMouseCursor(m.modes[mode].cursor);
- m.x = fgGetInt("/sim/startup/xsize", 800) / 2;
- m.y = fgGetInt("/sim/startup/ysize", 600) / 2;
- fgWarpMouse(m.x, m.y);
+ fgWarpMouse(0.0f, 0.0f);
} else {
SG_LOG(SG_INPUT, SG_DEBUG, "Mouse mode " << mode << " out of range");
fgSetMouseCursor(MOUSE_CURSOR_POINTER);
Index: src/Main/fg_os.hxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Main/fg_os.hxx,v
retrieving revision 1.8
diff -u -r1.8 fg_os.hxx
--- src/Main/fg_os.hxx 26 May 2007 13:53:46 -0000 1.8
+++ src/Main/fg_os.hxx 17 Aug 2007 20:34:08 -0000
@@ -50,7 +50,7 @@
void fgSetMouseCursor(int cursor);
int fgGetMouseCursor();
-void fgWarpMouse(int x, int y);
+void fgWarpMouse(float x, float y);
int fgGetKeyModifiers();
Index: src/Main/fg_os_osgviewer.cxx
===================================================================
RCS file: /var/cvs/FlightGear-0.9/source/src/Main/fg_os_osgviewer.cxx,v
retrieving revision 1.7
diff -u -r1.7 fg_os_osgviewer.cxx
--- src/Main/fg_os_osgviewer.cxx 1 Jul 2007 16:39:52 -0000 1.7
+++ src/Main/fg_os_osgviewer.cxx 17 Aug 2007 20:29:46 -0000
@@ -248,10 +248,9 @@
return globals->get_renderer()->getManipulator()->getCurrentModifiers();
}
-void fgWarpMouse(int x, int y)
+void fgWarpMouse(float x, float y)
{
- // Hack, currently the pointer is just recentered. So, we know the relative
coordinates ...
- viewer->requestWarpPointer(0, 0);
+ viewer->requestWarpPointer(x, y);
}
// Noop
___________________________________________________________
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Flightgear-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/flightgear-devel