]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/environment.cxx
Don't restore initial screen geometry because there is nothing in fg_os* to resize...
[flightgear.git] / src / Environment / environment.cxx
index 3441795804053f4b46b9316d9f661567e1e65ee2..a1285b80d58ea94610c62d53e204144f10433a5c 100644 (file)
@@ -16,7 +16,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
@@ -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();
@@ -148,24 +150,28 @@ FGEnvironment::copy (const FGEnvironment &env)
     elevation_ft = env.elevation_ft;
     visibility_m = env.visibility_m;
     temperature_sea_level_degc = env.temperature_sea_level_degc;
+    temperature_degc = env.temperature_degc;
     dewpoint_sea_level_degc = env.dewpoint_sea_level_degc;
+    dewpoint_degc = env.dewpoint_degc;
     pressure_sea_level_inhg = env.pressure_sea_level_inhg;
     wind_from_heading_deg = env.wind_from_heading_deg;
     wind_speed_kt = env.wind_speed_kt;
     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 {
@@ -203,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);
 }
 
 
@@ -226,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
 {
@@ -287,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
@@ -392,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
@@ -413,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);
   }
@@ -422,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
@@ -561,7 +601,7 @@ interpolate (const FGEnvironment * env1, const FGEnvironment * env2,
                    env2->get_temperature_sea_level_degc(),
                    fraction));
 
-    result->set_dewpoint_sea_level_degc
+    result->set_dewpoint_degc
         (do_interp(env1->get_dewpoint_sea_level_degc(),
                    env2->get_dewpoint_sea_level_degc(),
                    fraction));
@@ -586,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));
 }