]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/ridge_lift.cxx
Adapt to simgear SGMath change.
[flightgear.git] / src / Environment / ridge_lift.cxx
index 4a371a3ae9d79e3688488d2131327cfeb9ee7918..cac1388aa90dfb6644c5f2aa4df6d959e4f5707f 100644 (file)
 #include <Scenery/scenery.hxx>
 #include <string>
 #include <math.h>
-
+#include <simgear/sg_inlines.h>
 
 using std::string;
 
 #include "ridge_lift.hxx"
 
-static string CreateIndexedPropertyName(string Property, int index)
-{
-       std::stringstream str;
-       str << index;
-       string tmp;
-       str >> tmp;
-       return Property + "[" + tmp + "]";
-}
-
-static inline double sign(double x) {
-       return x == 0 ? 0 : x > 0 ? 1.0 : -1.0;
-}
-
 static const double BOUNDARY1_m = 40.0;
 
 const double FGRidgeLift::dist_probe_m[] = { // in meters
@@ -103,42 +90,20 @@ void FGRidgeLift::init(void)
 void FGRidgeLift::bind() {
        string prop;
 
+       _tiedProperties.setRoot( fgGetNode("/environment/ridge-lift",true));
        for( int i = 0; i < 5; i++ ) {
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-elev-m", i );
-               fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_elev_m); // read-only
-
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lat-deg", i );
-               fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_lat_deg); // read-only
-
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lon-deg", i );
-               fgTie( prop.c_str(), this, i, &FGRidgeLift::get_probe_lon_deg); // read-only
+               _tiedProperties.Tie( "probe-elev-m", i, this, i, &FGRidgeLift::get_probe_elev_m );
+               _tiedProperties.Tie( "probe-lat-deg", i, this, i, &FGRidgeLift::get_probe_lat_deg );
+               _tiedProperties.Tie( "probe-lon-deg", i, this, i, &FGRidgeLift::get_probe_lon_deg );
        }
 
        for( int i = 0; i < 4; i++ ) {
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/slope", i );
-               fgTie( prop.c_str(), this, i, &FGRidgeLift::get_slope); // read-only
+               _tiedProperties.Tie( "slope", i, this, i, &FGRidgeLift::get_slope );
        }
 }
 
 void FGRidgeLift::unbind() {
-       string prop;
-
-       for( int i = 0; i < 5; i++ ) {
-
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-elev-m", i );
-               fgUntie( prop.c_str() );
-
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lat-deg", i );
-               fgUntie( prop.c_str() );
-
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/probe-lon-deg", i );
-               fgUntie( prop.c_str() );
-       }
-
-       for( int i = 0; i < 4; i++ ) {
-               prop = CreateIndexedPropertyName("/environment/ridge-lift/slope", i );
-               fgUntie( prop.c_str() );
-       }
+       _tiedProperties.Untie();
 }
 
 void FGRidgeLift::update(double dt) {
@@ -171,10 +136,10 @@ void FGRidgeLift::update(double dt) {
                // position is geodetic, need geocentric for advanceRadM
                SGGeod myGeodPos = SGGeod::fromDegM( probe_lon_deg[0], probe_lat_deg[0], 20000.0 );
                SGGeoc myGeocPos = SGGeoc::fromGeod( myGeodPos );
-               double ground_wind_from_rad = _surface_wind_from_deg_node->getDoubleValue() * SG_DEGREES_TO_RADIANS + SG_PI;
+               double ground_wind_from_rad = _surface_wind_from_deg_node->getDoubleValue() * SG_DEGREES_TO_RADIANS;
 
                // compute the remaining probes
-               for (int i = 1; i < sizeof(probe_elev_m)/sizeof(probe_elev_m[0]); i++) {
+               for (unsigned i = 1; i < sizeof(probe_elev_m)/sizeof(probe_elev_m[0]); i++) {
                        SGGeoc probe = myGeocPos.advanceRadM( ground_wind_from_rad, dist_probe_m[i] );
                        // convert to geodetic position for ground level computation
                        SGGeod probeGeod = SGGeod::fromGeoc( probe );
@@ -193,8 +158,8 @@ void FGRidgeLift::update(double dt) {
                slope[2] = (probe_elev_m[2] - probe_elev_m[3]) / dist_probe_m[3];
                slope[3] = (probe_elev_m[4] - probe_elev_m[0]) / -dist_probe_m[4];
        
-               for (int i = 0; i < sizeof(slope)/sizeof(slope[0]); i++)
-                       adj_slope[i] = sin(atan(5.0 * pow ( (fabs(slope[i])),1.7) ) ) *sign(slope[i]);
+               for (unsigned i = 0; i < sizeof(slope)/sizeof(slope[0]); i++)
+                       adj_slope[i] = sin(atan(5.0 * pow ( (fabs(slope[i])),1.7) ) ) *SG_SIGN<double>(slope[i]);
        
                //adjustment
                adj_slope[0] *= 0.2;
@@ -222,8 +187,8 @@ void FGRidgeLift::update(double dt) {
        //boundaries
        double boundary2_m = 130.0; // in the lift
        if (lift_factor < 0.0) { // in the sink
-               double highest_probe_temp= max ( probe_elev_m[1], probe_elev_m[2] );
-               double highest_probe_downwind_m= max ( highest_probe_temp, probe_elev_m[3] );
+               double highest_probe_temp= std::max ( probe_elev_m[1], probe_elev_m[2] );
+               double highest_probe_downwind_m= std::max ( highest_probe_temp, probe_elev_m[3] );
                boundary2_m = highest_probe_downwind_m - probe_elev_m[0];
        }
 
@@ -234,7 +199,7 @@ void FGRidgeLift::update(double dt) {
                agl_factor = 1.0;
        } else {
                agl_factor = exp(-(2 + probe_elev_m[0] / 2000) * 
-                               (user_altitude_agl_m - boundary2_m) / max(probe_elev_m[0],200.0));
+                     (user_altitude_agl_m - boundary2_m) / std::max(probe_elev_m[0],200.0));
        }
        
        double ground_wind_speed_mps = _surface_wind_speed_node->getDoubleValue() * SG_NM_TO_METER / 3600;