->set_goal_view_offset(offset * SGD_DEGREES_TO_RADIANS);
}
+/**
+ * Get the current view tilt in degrees.
+ */
+static double
+getViewTilt ()
+{
+ return (globals->get_current_view()
+ ->get_view_tilt() * SGD_RADIANS_TO_DEGREES);
+}
+
+
+static void
+setViewTilt (double tilt)
+{
+ globals->get_current_view()->set_view_tilt(tilt * SGD_DEGREES_TO_RADIANS);
+}
+
+static double
+getGoalViewTilt ()
+{
+ return (globals->get_current_view()
+ ->get_goal_view_tilt() * SGD_RADIANS_TO_DEGREES);
+}
+
+static void
+setGoalViewTilt (double tilt)
+{
+ while ( tilt < 0 ) {
+ tilt += 360.0;
+ }
+ while ( tilt > 360.0 ) {
+ tilt -= 360.0;
+ }
+ // Snap to center if we are close
+ if ( fabs(tilt) < 1.0 || fabs(tilt) > 359.0 ) {
+ tilt = 0.0;
+ }
+
+ globals->get_current_view()
+ ->set_goal_view_tilt(tilt * SGD_DEGREES_TO_RADIANS);
+}
+
/**
* Pilot position offset from CG.
fgTie("/sim/view/offset-deg", getViewOffset, setViewOffset, false);
fgSetArchivable("/sim/view/offset-deg");
fgTie("/sim/view/goal-offset-deg", getGoalViewOffset, setGoalViewOffset, false);
+ fgTie("/sim/view/tilt-deg", getViewTilt, setViewTilt, false);
+ fgSetArchivable("/sim/view/tilt-deg");
+ fgTie("/sim/view/goal-tilt-deg", getGoalViewTilt, setGoalViewTilt, false);
fgSetArchivable("/sim/view/goal-offset-deg");
fgTie("/sim/view/pilot/x-offset-m",
getPilotPositionXOffset, setPilotPositionXOffset);
FGViewer::FGViewer( void ):
fov(55.0),
view_offset(0.0),
- goal_view_offset(0.0)
+ goal_view_offset(0.0),
+ view_tilt(0.0),
+ goal_view_tilt(0.0)
{
sgSetVec3( pilot_offset, 0.0, 0.0, 0.0 );
sgdZeroVec3(geod_view_pos);
}
}
}
+
+ for ( int i = 0; i < dt; i++ ) {
+ if ( fabs(get_goal_view_tilt() - get_view_tilt()) < 0.05 ) {
+ set_view_tilt( get_goal_view_tilt() );
+ break;
+ } else {
+ // move current_view.view_tilt towards
+ // current_view.goal_view_tilt
+ if ( get_goal_view_tilt() > get_view_tilt() )
+ {
+ if ( get_goal_view_tilt() - get_view_tilt() < SGD_PI ){
+ inc_view_tilt( 0.01 );
+ } else {
+ inc_view_tilt( -0.01 );
+ }
+ } else {
+ if ( get_view_tilt() - get_goal_view_tilt() < SGD_PI ){
+ inc_view_tilt( -0.01 );
+ } else {
+ inc_view_tilt( 0.01 );
+ }
+ }
+ if ( get_view_tilt() > SGD_2PI ) {
+ inc_view_tilt( -SGD_2PI );
+ } else if ( get_view_tilt() < 0 ) {
+ inc_view_tilt( SGD_2PI );
+ }
+ }
+ }
}
// the goal view offset angle (used for smooth view changes)
double goal_view_offset;
+ // the view tilt angles
+ double view_tilt;
+ double goal_view_tilt;
+
// geodetic view position
sgdVec3 geod_view_pos;
inline void set_reverse_view_offset( bool val ) {
reverse_view_offset = val;
}
+ inline void set_view_tilt( double a ) {
+ set_dirty();
+ view_tilt = a;
+ }
+ inline void inc_view_tilt( double amt ) {
+ set_dirty();
+ view_tilt += amt;
+ }
+ inline void set_goal_view_tilt( double a) {
+ set_dirty();
+ goal_view_tilt = a;
+ while ( goal_view_tilt < 0 ) {
+ goal_view_tilt += 360.0;
+ }
+ while ( goal_view_tilt > 360.0 ) {
+ goal_view_tilt -= 360.0;
+ }
+ }
inline void set_geod_view_pos( double lon, double lat, double alt ) {
// data should be in radians and meters asl
set_dirty();
inline double get_view_offset() const { return view_offset; }
inline bool get_reverse_view_offset() const { return reverse_view_offset; }
inline double get_goal_view_offset() const { return goal_view_offset; }
+ inline double get_view_tilt() const { return view_tilt; }
+ inline double get_goal_view_tilt() const { return goal_view_tilt; }
inline double *get_geod_view_pos() { return geod_view_pos; }
inline float *get_pilot_offset() { return pilot_offset; }
inline double get_sea_level_radius() const { return sea_level_radius; }