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
static inline void set_goal_view_offset( float offset )
{
- globals->get_current_view()->set_goal_view_offset(offset);
+ globals->get_current_view()->setGoalHeadingOffset_deg(offset * SGD_RADIANS_TO_DEGREES);
}
static inline void set_view_offset( float offset )
{
- globals->get_current_view()->set_view_offset(offset);
-}
-
-static inline float get_view_offset() {
- return globals->get_current_view()->get_view_offset();
-}
-
-static inline float get_goal_view_offset() {
- return globals->get_current_view()->get_goal_view_offset();
+ globals->get_current_view()->setHeadingOffset_deg(offset * SGD_RADIANS_TO_DEGREES);
}
static inline void set_goal_view_tilt( float tilt )
{
- globals->get_current_view()->set_goal_view_tilt(tilt);
+ globals->get_current_view()->setGoalPitchOffset_deg(tilt);
}
static inline void set_view_tilt( float tilt )
{
- globals->get_current_view()->set_view_tilt(tilt);
+ globals->get_current_view()->setPitchOffset_deg(tilt);
}
-static inline float get_view_tilt() {
- return globals->get_current_view()->get_view_tilt();
+static inline float get_view_offset() {
+ return globals->get_current_view()->getHeadingOffset_deg() * SGD_DEGREES_TO_RADIANS;
+}
+
+static inline float get_goal_view_offset() {
+ return globals->get_current_view()->getGoalHeadingOffset_deg() * SGD_DEGREES_TO_RADIANS;
}
static inline void move_brake(float offset) {
}
static inline bool AP_HeadingEnabled() {
- return current_autopilot->get_HeadingEnabled();
+ return globals->get_autopilot()->get_HeadingEnabled();
}
static inline bool AP_AltitudeEnabled() {
- return current_autopilot->get_AltitudeEnabled();
+ return globals->get_autopilot()->get_AltitudeEnabled();
}
void TurnCursorOn( void )
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);
+ set_goal_view_tilt(asin( GuiQuat_mat[1][2]) * SGD_RADIANS_TO_DEGREES );
+#ifdef NO_SMOOTH_MOUSE_VIEW
+ set_view_offset(offset);
+ set_view_tilt(asin( GuiQuat_mat[1][2]) * SGD_RADIANS_TO_DEGREES );
+#endif
+ break;
+
+ default:
break;
}
}
static float _quat[4];
static double _view_offset;
- // general purpose variables
- double offset;
-
glutModifiers = glutGetModifiers();
glut_active_shift = glutModifiers & GLUT_ACTIVE_SHIFT;
glut_active_ctrl = glutModifiers & GLUT_ACTIVE_CTRL;
y = _Vy;
sgCopyVec4(curGuiQuat, _quat);
set_goal_view_offset(_view_offset);
+ set_goal_view_tilt(0.0);
#ifdef NO_SMOOTH_MOUSE_VIEW
set_view_offset(_view_offset);
#endif
Quat0();
_view_offset = get_goal_view_offset();
set_goal_view_offset(0.0);
+ set_goal_view_tilt(0.0);
#ifdef NO_SMOOTH_MOUSE_VIEW
set_view_offset(0.0);
+ set_view_tilt(0.0);
#endif
}
glutWarpPointer( x , y);
Quat0();
build_rotmatrix(GuiQuat_mat, curGuiQuat);
set_goal_view_offset(0.0);
+ set_goal_view_tilt(0.0);
#ifdef NO_SMOOTH_MOUSE_VIEW
set_view_offset(0.0);
+ set_view_tilt(0.0);
#endif // NO_SMOOTH_MOUSE_VIEW
#endif // RESET_VIEW_ON_LEAVING_MOUSE_VIEW
glutSetCursor(GLUT_CURSOR_INHERIT);
glutPostRedisplay ();
}
+
+
+