]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/flight.cxx
Merge branch 'vivian/train' into next
[flightgear.git] / src / FDM / flight.cxx
index 50ebaed51f4d3622636b095eeae4ed5075207da5..bc5b3059a2fbeb8ee3ddab07dbe59ed3f7b94104 100644 (file)
@@ -44,23 +44,15 @@ static inline void assign(double* ptr, const SGVec3d& vec)
   ptr[2] = vec[2];
 }
 
-// base_fdm_state is the internal state that is updated in integer
-// multiples of "dt".  This leads to "jitter" with respect to the real
-// world time, so we introduce cur_fdm_state which is extrapolated by
-// the difference between sim time and real world time
-
 FGInterface *cur_fdm_state = 0;
-FGInterface base_fdm_state;
 
 // Constructor
 FGInterface::FGInterface()
-  : remainder(0)
 {
     _setup();
 }
 
 FGInterface::FGInterface( double dt )
-  : remainder(0)
 {
     _setup();
 }
@@ -70,33 +62,18 @@ FGInterface::~FGInterface() {
     // unbind();                   // FIXME: should be called explicitly
 }
 
-
 int
 FGInterface::_calc_multiloop (double dt)
 {
+  // Since some time the simulation time increments we get here are
+  // already a multiple of the basic update freqency.
+  // So, there is no need to do our own multiloop rounding with all bad
+  // roundoff problems when we already have nearly accurate values.
+  // Only the speedup thing must be still handled here
   int hz = fgGetInt("/sim/model-hz");
+  int multiloop = SGMiscd::roundToInt(dt*hz);
   int speedup = fgGetInt("/sim/speed-up");
-
-  dt += remainder;
-  remainder = 0;
-  double ml = dt * hz;
-  // Avoid roundoff problems by adding the roundoff itself.
-  // ... ok, two times the roundoff to have enough room.
-  int multiloop = int(floor(ml * (1.0 + 2.0*DBL_EPSILON)));
-  remainder = (ml - multiloop) / hz;
-
-  // If we artificially inflate ml above by a tiny amount to get the
-  // closest integer, then subtract the integer from the original
-  // slightly smaller value, we can get a negative remainder.
-  // Logically this should never happen, and we definitely don't want
-  // to carry a negative remainder over to the next iteration, so
-  // never let the remainder go below zero.
-  // 
-  // Note: this fixes a problem where we run 1, 3, 1, 3, 1, 3... loops
-  // of the FDM when in fact we want to run 2, 2, 2, 2, 2...
-  if ( remainder < 0 ) { remainder = 0; }
-
-  return (multiloop * speedup);
+  return multiloop * speedup;
 }
 
 
@@ -163,8 +140,7 @@ FGInterface::common_init ()
 
     set_inited( true );
 
-//     stamp();
-//     set_remainder( 0 );
+    ground_cache.set_cache_time_offset(globals->get_sim_time_sec());
 
     // Set initial position
     SG_LOG( SG_FLIGHT, SG_INFO, "...initializing position..." );
@@ -259,16 +235,6 @@ FGInterface::bind ()
 {
   bound = true;
 
-                                // Time management (read-only)
-//   fgTie("/fdm/time/delta_t", this,
-//         &FGInterface::get_delta_t); // read-only
-//   fgTie("/fdm/time/elapsed", this,
-//         &FGInterface::get_elapsed); // read-only
-//   fgTie("/fdm/time/remainder", this,
-//         &FGInterface::get_remainder); // read-only
-//   fgTie("/fdm/time/multi_loop", this,
-//         &FGInterface::get_multi_loop); // read-only
-
                        // Aircraft position
   fgTie("/position/latitude-deg", this,
         &FGInterface::get_Latitude_deg,
@@ -427,10 +393,6 @@ FGInterface::unbind ()
 {
   bound = false;
 
-  // fgUntie("/fdm/time/delta_t");
-  // fgUntie("/fdm/time/elapsed");
-  // fgUntie("/fdm/time/remainder");
-  // fgUntie("/fdm/time/multi_loop");
   fgUntie("/position/latitude-deg");
   fgUntie("/position/longitude-deg");
   fgUntie("/position/altitude-ft");
@@ -825,10 +787,10 @@ FGInterface::get_groundlevel_m(const SGGeod& geod)
 
   // FIXME: how to handle t - ref_time differences ???
   SGVec3d cpos;
-  double ref_time, radius;
+  double ref_time = 0, radius;
   // Prepare the ground cache for that position.
   if (!is_valid_m(&ref_time, cpos.data(), &radius)) {
-    double startTime = globals->get_sim_time_sec();
+    double startTime = ref_time;
     double endTime = startTime + 1;
     bool ok = prepare_ground_cache_m(startTime, endTime, pos.data(), 10);
     /// This is most likely the case when the given altitude is
@@ -841,7 +803,7 @@ FGInterface::get_groundlevel_m(const SGGeod& geod)
         return 0;
     }
   } else if (radius*radius <= distSqr(pos, cpos)) {
-    double startTime = globals->get_sim_time_sec();
+    double startTime = ref_time;
     double endTime = startTime + 1;
 
     /// We reuse the old radius value, but only if it is at least 10 Meters ..