]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/environment.cxx
Fix line endings
[flightgear.git] / src / Environment / environment.cxx
index 09313213a16fd63293cd90711ea30276aba5e29c..bd0f8039b680589e14c99970022d924d466addbf 100644 (file)
@@ -36,6 +36,7 @@
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
 #include <simgear/math/interpolater.hxx>
+#include <simgear/environment/visual_enviro.hxx>
 
 #include <Main/fg_props.hxx>
 #include "environment.hxx"
@@ -121,12 +122,13 @@ FGEnvironment::FGEnvironment()
     dewpoint_degc(5),
     pressure_sea_level_inhg(29.92),
     pressure_inhg(29.92),
+    turbulence_magnitude_norm(0),
+    turbulence_rate_hz(1),
     wind_from_heading_deg(0),
     wind_speed_kt(0),
     wind_from_north_fps(0),
     wind_from_east_fps(0),
-    wind_from_down_fps(0),
-    turbulence_norm(0)
+    wind_from_down_fps(0)
 {
   _setup_tables();
   _recalc_density();
@@ -157,17 +159,19 @@ FGEnvironment::copy (const FGEnvironment &env)
     wind_from_north_fps = env.wind_from_north_fps;
     wind_from_east_fps = env.wind_from_east_fps;
     wind_from_down_fps = env.wind_from_down_fps;
-    turbulence_norm = env.turbulence_norm;
+    turbulence_magnitude_norm = env.turbulence_magnitude_norm;
+    turbulence_rate_hz = env.turbulence_rate_hz;
 }
 
 static inline bool
 maybe_copy_value (FGEnvironment * env, const SGPropertyNode * node,
                   const char * name, void (FGEnvironment::*setter)(double))
 {
-    const SGPropertyNode * child = node->getChild(name);
+    const SGPropertyNode * child = node->getNode(name);
                                 // fragile: depends on not being typed
                                 // as a number
-    if (child != 0 && child->getStringValue()[0] != '\0') {
+    if (child != 0 && child->hasValue() &&
+        child->getStringValue()[0] != '\0') {
         (env->*setter)(child->getDoubleValue());
         return true;
     } else {
@@ -181,14 +185,14 @@ FGEnvironment::read (const SGPropertyNode * node)
     maybe_copy_value(this, node, "visibility-m",
                      &FGEnvironment::set_visibility_m);
 
-    if (!maybe_copy_value(this, node, "temperature-degc",
+    if (!maybe_copy_value(this, node, "temperature-sea-level-degc",
                           &FGEnvironment::set_temperature_sea_level_degc))
-        maybe_copy_value(this, node, "temperature-sea-level-degc",
+        maybe_copy_value(this, node, "temperature-degc",
                          &FGEnvironment::set_temperature_degc);
 
-    if (!maybe_copy_value(this, node, "dewpoint-degc",
+    if (!maybe_copy_value(this, node, "dewpoint-sea-level-degc",
                           &FGEnvironment::set_dewpoint_sea_level_degc))
-        maybe_copy_value(this, node, "dewpoint-sea-level-degc",
+        maybe_copy_value(this, node, "dewpoint-degc",
                          &FGEnvironment::set_dewpoint_degc);
 
     if (!maybe_copy_value(this, node, "pressure-sea-level-inhg",
@@ -205,8 +209,11 @@ FGEnvironment::read (const SGPropertyNode * node)
     maybe_copy_value(this, node, "elevation-ft",
                      &FGEnvironment::set_elevation_ft);
 
-    maybe_copy_value(this, node, "turbulence-norm",
-                     &FGEnvironment::set_turbulence_norm);
+    maybe_copy_value(this, node, "turbulence/magnitude-norm",
+                     &FGEnvironment::set_turbulence_magnitude_norm);
+
+    maybe_copy_value(this, node, "turbulence/rate-hz",
+                     &FGEnvironment::set_turbulence_rate_hz);
 }
 
 
@@ -228,6 +235,12 @@ FGEnvironment::get_temperature_degc () const
   return temperature_degc;
 }
 
+double
+FGEnvironment::get_temperature_degf () const
+{
+  return (temperature_degc * 9.0 / 5.0) + 32.0;
+}
+
 double
 FGEnvironment::get_dewpoint_sea_level_degc () const
 {
@@ -289,9 +302,18 @@ FGEnvironment::get_wind_from_down_fps () const
 }
 
 double
-FGEnvironment::get_turbulence_norm () const
+FGEnvironment::get_turbulence_magnitude_norm () const
+{
+  if( sgEnviro.get_turbulence_enable_state() )
+    if (fgGetBool("/environment/params/real-world-weather-fetch") == true)
+      return sgEnviro.get_cloud_turbulence();
+  return turbulence_magnitude_norm;
+}
+
+double
+FGEnvironment::get_turbulence_rate_hz () const
 {
-  return turbulence_norm;
+  return turbulence_rate_hz;
 }
 
 double
@@ -394,9 +416,15 @@ FGEnvironment::set_wind_from_down_fps (double d)
 }
 
 void
-FGEnvironment::set_turbulence_norm (double t)
+FGEnvironment::set_turbulence_magnitude_norm (double t)
 {
-  turbulence_norm = t;
+  turbulence_magnitude_norm = t;
+}
+
+void
+FGEnvironment::set_turbulence_rate_hz (double r)
+{
+  turbulence_rate_hz = r;
 }
 
 void
@@ -415,7 +443,7 @@ FGEnvironment::_recalc_hdgspd ()
   double angle_rad;
 
   if (wind_from_east_fps == 0) {
-    angle_rad = (wind_from_north_fps >= 0 ? SGD_PI/2 : -SGD_PI/2);
+    angle_rad = (wind_from_north_fps >= 0 ? SGD_PI_2 : -SGD_PI_2);
   } else {
     angle_rad = atan(wind_from_north_fps/wind_from_east_fps);
   }
@@ -424,12 +452,22 @@ FGEnvironment::_recalc_hdgspd ()
     wind_from_heading_deg = 90 - wind_from_heading_deg;
   else
     wind_from_heading_deg = 270 - wind_from_heading_deg;
+
+#if 0
+  // FIXME: Windspeed can become negative with these formulas.
+  //        which can cause problems for animations that rely
+  //        on the windspeed property.
   if (angle_rad == 0)
     wind_speed_kt = fabs(wind_from_east_fps
                         * SG_METER_TO_NM * SG_FEET_TO_METER * 3600);
   else
     wind_speed_kt = (wind_from_north_fps / sin(angle_rad))
       * SG_METER_TO_NM * SG_FEET_TO_METER * 3600;
+#else
+  wind_speed_kt = sqrt(wind_from_north_fps * wind_from_north_fps +
+                       wind_from_east_fps * wind_from_east_fps) 
+                  * SG_METER_TO_NM * SG_FEET_TO_METER * 3600;
+#endif
 }
 
 void
@@ -558,14 +596,14 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2,
                    env2->get_visibility_m(),
                    fraction));
 
-    result->set_temperature_degc
-        (do_interp(env1->get_temperature_degc(),
-                   env2->get_temperature_degc(),
+    result->set_temperature_sea_level_degc
+        (do_interp(env1->get_temperature_sea_level_degc(),
+                   env2->get_temperature_sea_level_degc(),
                    fraction));
 
     result->set_dewpoint_degc
-        (do_interp(env1->get_dewpoint_degc(),
-                   env2->get_dewpoint_degc(),
+        (do_interp(env1->get_dewpoint_sea_level_degc(),
+                   env2->get_dewpoint_sea_level_degc(),
                    fraction));
 
     result->set_pressure_sea_level_inhg
@@ -588,9 +626,14 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2,
                    env2->get_elevation_ft(),
                    fraction));
 
-    result->set_turbulence_norm
-        (do_interp(env1->get_turbulence_norm(),
-                   env2->get_turbulence_norm(),
+    result->set_turbulence_magnitude_norm
+        (do_interp(env1->get_turbulence_magnitude_norm(),
+                   env2->get_turbulence_magnitude_norm(),
+                   fraction));
+
+    result->set_turbulence_rate_hz
+        (do_interp(env1->get_turbulence_rate_hz(),
+                   env2->get_turbulence_rate_hz(),
                    fraction));
 }