X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FEnvironment%2Ffgclouds.cxx;h=10f4887e53450b3e108e1d11ee597ce3147b078c;hb=cef9eb3d73e16efca914a353c0c1e83e049ccb17;hp=1a3897981592e0b9e506f187872b3f8aee9475b9;hpb=030742fa4ae7d99facb517381da71fa404c4ee2b;p=flightgear.git diff --git a/src/Environment/fgclouds.cxx b/src/Environment/fgclouds.cxx index 1a3897981..10f4887e5 100644 --- a/src/Environment/fgclouds.cxx +++ b/src/Environment/fgclouds.cxx @@ -48,21 +48,24 @@ extern SGSky *thesky; FGClouds::FGClouds(FGEnvironmentCtrl * controller) : - station_elevation_ft(0.0), - _controller( controller ), - snd_lightning(NULL), + snd_lightning(0), + _controller(controller), + station_elevation_ft(0.0), + clouds_3d_enabled(false), last_scenario( "unset" ), - last_env_config( new SGPropertyNode() ), - last_env_clouds( new SGPropertyNode() ) + last_env_config( new SGPropertyNode ), + last_env_clouds( new SGPropertyNode ) { update_event = 0; } + FGClouds::~FGClouds() { } int FGClouds::get_update_event(void) const { return update_event; } + void FGClouds::set_update_event(int count) { update_event = count; buildCloudLayers(); @@ -249,8 +252,8 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov void FGClouds::buildCloudLayers(void) { SGPropertyNode *metar_root = fgGetNode("/environment", true); - - double wind_speed_kt = metar_root->getDoubleValue("wind-speed-kt"); + + //double wind_speed_kt = metar_root->getDoubleValue("wind-speed-kt"); double temperature_degc = metar_root->getDoubleValue("temperature-sea-level-degc"); double dewpoint_degc = metar_root->getDoubleValue("dewpoint-sea-level-degc"); double pressure_mb = metar_root->getDoubleValue("pressure-sea-level-inhg") * SG_INHG_TO_PA / 100.0; @@ -263,8 +266,6 @@ void FGClouds::buildCloudLayers(void) { double cumulus_base = 122.0 * (temperature_degc - dewpoint_degc); double stratus_base = 100.0 * (100.0 - rel_humidity) * SG_FEET_TO_METER; - bool cu_seen = false; - for(int iLayer = 0 ; iLayer < thesky->get_cloud_layer_count(); iLayer++) { SGPropertyNode *cloud_root = fgGetNode("/environment/clouds/layer", iLayer, true); @@ -322,9 +323,6 @@ void FGClouds::update_metar_properties( const FGMetar *m ) { int i; - int j; - double d; - char s[128]; fgSetString("/environment/metar/station-id", m->getId()); fgSetDouble("/environment/metar/min-visibility-m", @@ -332,17 +330,15 @@ FGClouds::update_metar_properties( const FGMetar *m ) fgSetDouble("/environment/metar/max-visibility-m", m->getMaxVisibility().getVisibility_m() ); + SGPropertyNode *metar = fgGetNode("/environment/metar", true); const SGMetarVisibility *dirvis = m->getDirVisibility(); - for (i = 0; i < 8; i++, dirvis++) { - const char *min = "/environment/metar/visibility[%d]/min-m"; - const char *max = "/environment/metar/visibility[%d]/max-m"; - d = dirvis->getVisibility_m(); + for (i = 0; i < 8; i++, dirvis++) { + SGPropertyNode *vis = metar->getChild("visibility", i, true); + double v = dirvis->getVisibility_m(); - snprintf(s, 128, min, i); - fgSetDouble(s, d); - snprintf(s, 128, max, i); - fgSetDouble(s, d); + vis->setDoubleValue("min-m", v); + vis->setDoubleValue("max-m", v); } fgSetInt("/environment/metar/base-wind-range-from", @@ -363,57 +359,41 @@ FGClouds::update_metar_properties( const FGMetar *m ) m->getPressure_inHg() ); vector cv = m->getClouds(); - vector::const_iterator cloud; + vector::const_iterator cloud, cloud_end = cv.end(); // Load into both the METAR and environment properties to stop interpolation - const char *cl[] = {"/environment/metar/clouds/layer[%i]", - "/environment/clouds/layer[%i]"}; - - for (j = 0; j < 2; j++) - { - for (i = 0, cloud = cv.begin(); cloud != cv.end(); cloud++, i++) { - const char *coverage_string[5] = - { "clear", "few", "scattered", "broken", "overcast" }; - const double thickness[5] = { 0, 65, 600,750, 1000}; - int q; - - snprintf(s, 128, cl[j], i); - strncat(s, "/coverage", 128); - q = cloud->getCoverage(); - fgSetString(s, coverage_string[q] ); - - snprintf(s, 128, cl[j], i); - strncat(s, "/elevation-ft", 128); - fgSetDouble(s, cloud->getAltitude_ft() + station_elevation_ft); - - snprintf(s, 128, cl[j], i); - strncat(s, "/thickness-ft", 128); - fgSetDouble(s, thickness[q]); - - snprintf(s, 128, cl[j], i); - strncat(s, "/span-m", 128); - fgSetDouble(s, 40000.0); - } - - for (; i < FGEnvironmentMgr::MAX_CLOUD_LAYERS; i++) { - - - snprintf(s, 128, cl[j], i); - strncat(s, "/coverage", 128); - fgSetString(s, "clear"); - - snprintf(s, 128, cl[j], i); - strncat(s, "/elevation-ft", 128); - fgSetDouble(s, -9999); - - snprintf(s, 128, cl[j], i); - strncat(s, "/thickness-ft", 128); - fgSetDouble(s, 0); - - snprintf(s, 128, cl[j], i); - strncat(s, "/span-m", 128); - fgSetDouble(s, 40000.0); + SGPropertyNode *metar_clouds = fgGetNode("/environment/metar/clouds", true); + SGPropertyNode *clouds = fgGetNode("/environment/clouds", true); + + for (i = 0, cloud = cv.begin(); i < FGEnvironmentMgr::MAX_CLOUD_LAYERS; i++) { + const char *coverage_string[5] = { "clear", "few", "scattered", "broken", "overcast" }; + const double thickness_value[5] = { 0, 65, 600, 750, 1000 }; + + const char *coverage = "clear"; + double elevation = -9999.0; + double thickness = 0.0; + const double span = 40000.0; + + if (cloud != cloud_end) { + int c = cloud->getCoverage(); + coverage = coverage_string[c]; + elevation = cloud->getAltitude_ft() + station_elevation_ft; + thickness = thickness_value[c]; + ++cloud; } + + SGPropertyNode *layer; + layer = metar_clouds->getChild("layer", i, true); + layer->setStringValue("coverage", coverage); + layer->setDoubleValue("elevation-ft", elevation); + layer->setDoubleValue("thickness-ft", thickness); + layer->setDoubleValue("span-m", span); + + layer = clouds->getChild("layer", i, true); + layer->setStringValue("coverage", coverage); + layer->setDoubleValue("elevation-ft", elevation); + layer->setDoubleValue("thickness-ft", thickness); + layer->setDoubleValue("span-m", span); } fgSetDouble("/environment/metar/rain-norm", m->getRain()); @@ -462,7 +442,7 @@ void FGClouds::buildScenario( const string& scenario ) { // fetch station elevation if exists if( station == "XXXX" ) - station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0); + station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0) * SG_METER_TO_FEET; else { const FGAirport* a = FGAirport::findByIdent(station); station_elevation_ft = (a ? a->getElevation() : 0.0); @@ -513,6 +493,8 @@ void FGClouds::set_scenario(const char * sc) { } if( scenario == "METAR" ) { + // needed here to compute station_elevation_ft + buildScenario( scenario ); string realMetar = fgGetString("/environment/metar/real-metar", ""); if( realMetar != "" ) {