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
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);
}
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
need_warp = 1;
x = 1;
}
-
- {
- 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);
- }
+ // 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:
break;
}
}