From 9ae5ad236e63bc8d6ddf5fd47e78469fb9bf2bff Mon Sep 17 00:00:00 2001 From: david Date: Wed, 6 Mar 2002 13:53:18 +0000 Subject: [PATCH] Patch from Andy Ross to allow virtual panel to tilt with mouse view: OK, attached is a replacement for mouse.cxx that works the view using the view-offset/tilt interface, rather than the (kinda odd) GuiQuat stuff. It's kind of a hack job, as I left the hooks to GuiQuat in in other places for fear of breaking something. Still, it removed more code from mouse.cxx than it added, which has to count for some elegance points. --- src/GUI/mouse.cxx | 85 ++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 57 deletions(-) diff --git a/src/GUI/mouse.cxx b/src/GUI/mouse.cxx index 9a08c457b..1bd1e5be8 100644 --- a/src/GUI/mouse.cxx +++ b/src/GUI/mouse.cxx @@ -107,11 +107,6 @@ static int glut_active_alt = 0; static int MOUSE_XSIZE = 0; static int MOUSE_YSIZE = 0; -// uncomment this for view to exactly follow mouse in MOUSE_VIEW mode -// else smooth out the view panning to .01 radian per frame -// see view_offset smoothing mechanism in main.cxx -#define NO_SMOOTH_MOUSE_VIEW - // uncomment following to #define RESET_VIEW_ON_LEAVING_MOUSE_VIEW @@ -191,6 +186,20 @@ static inline float get_goal_view_offset() { return globals->get_current_view()->get_goal_view_offset(); } +static inline void set_goal_view_tilt( float tilt ) +{ + globals->get_current_view()->set_goal_view_tilt(tilt); +} + +static inline void set_view_tilt( float tilt ) +{ + globals->get_current_view()->set_view_tilt(tilt); +} + +static inline float get_view_tilt() { + return globals->get_current_view()->get_view_tilt(); +} + static inline void move_brake(float offset) { globals->get_controls()->move_brake(FGControls::ALL_WHEELS, offset); } @@ -416,19 +425,10 @@ void guiMotionFunc ( int x, int y ) case MOUSE_VIEW: if( y <= 0 ) { -#define CONTRAINED_MOUSE_VIEW_Y -#ifdef CONTRAINED_MOUSE_VIEW_Y y = 1; -#else - y = wh-2; -#endif // CONTRAINED_MOUSE_VIEW_Y need_warp = 1; } else if( y >= wh-1) { -#ifdef CONTRAINED_MOUSE_VIEW_Y y = wh-2; -#else - y = 1; -#endif // CONTRAINED_MOUSE_VIEW_Y need_warp = 1; } // wrap MOUSE_VIEW mode cursor x position @@ -439,49 +439,20 @@ void guiMotionFunc ( int x, int y ) need_warp = 1; x = 1; } - // try to get SGD_PI movement in each half of screen - // do spherical pan - W = ww; - H = wh; - if( middle_button() ) { - trackball(lastGuiQuat, - (2.0f * _mX - W) / W, - 0, //(H - 2.0f * y) / H, // 3 - (2.0f * x - W) / W, - 0 //(H - 2.0f * _mY) / H // 1 - ); - x = _mX; - y = _mY; - need_warp = 1; - } else { - trackball(lastGuiQuat, - 0, //(2.0f * _mX - W) / W, // 0 - (H - 2.0f * y) / H, // 3 - 0, //(2.0f * x - W) / W, // 2 - (H - 2.0f * _mY) / H // 1 - ); - } - add_quats(lastGuiQuat, curGuiQuat, curGuiQuat); - build_rotmatrix(GuiQuat_mat, curGuiQuat); - - // do horizontal pan - // this could be done in above quat - // but requires redoing view pipeline - offset = get_goal_view_offset(); - offset += ((_mX - x) * SGD_2PI / W ); - while (offset < 0.0) { - offset += SGD_2PI; - } - while (offset > SGD_2PI) { - offset -= SGD_2PI; - } - set_goal_view_offset(offset); -#ifdef NO_SMOOTH_MOUSE_VIEW - set_view_offset(offset); -#endif - break; - - default: + + { + float scale = SGD_PI / MOUSE_XSIZE; + float dx = (_mX - x) * scale; + float dy = (_mY - y) * scale; + + float newOffset = get_view_offset() + dx; + set_goal_view_offset(newOffset); + set_view_offset(newOffset); + + float newTilt = get_view_tilt() + dy; + set_goal_view_tilt(newTilt); + set_view_tilt(newTilt); + } break; } }