#include <Airports/simple.hxx>
#include <Main/util.hxx>
+#include "environment_ctrl.hxx"
#include "environment_mgr.hxx"
#include "fgmetar.hxx"
#include "fgclouds.hxx"
extern SGSky *thesky;
-FGClouds::FGClouds() :
+FGClouds::FGClouds(FGEnvironmentCtrl * controller) :
station_elevation_ft(0.0),
- snd_lightning(NULL)
+ _controller( controller ),
+ snd_lightning(NULL),
+ last_scenario( "none" ),
+ last_env_config( new SGPropertyNode() ),
+ last_env_clouds( new SGPropertyNode() )
{
update_event = 0;
- fgSetString("/environment/weather-scenario", "METAR");
+ fgSetString("/environment/weather-scenario", last_scenario.c_str());
}
FGClouds::~FGClouds() {
}
}
}
-SGNewCloud *FGClouds::buildCloud(SGPropertyNode *cloud_def_root, string name) {
+SGNewCloud *FGClouds::buildCloud(SGPropertyNode *cloud_def_root, const string& name) {
SGPropertyNode *cld_def=NULL;
cld_def = cloud_def_root->getChild(name.c_str());
return cld;
}
-void FGClouds::buildLayer(SGCloudField *layer, string name, double alt, double coverage) {
+void FGClouds::buildLayer(SGCloudField *layer, const string& name, double alt, double coverage) {
struct {
string name;
double count;
int CloudVarietyCount = 0;
double totalCount = 0.0;
- SGPropertyNode *cloud_def_root = fgGetNode("/environment/config/cloudlayers/clouds", false);
- SGPropertyNode *layer_def_root = fgGetNode("/environment/config/cloudlayers/layers", false);
+ SGPropertyNode *cloud_def_root = fgGetNode("/environment/cloudlayers/clouds", false);
+ SGPropertyNode *layer_def_root = fgGetNode("/environment/cloudlayers/layers", false);
layer->clear();
// when we don't generate clouds the layer is rendered in 2D
fgSetDouble("/environment/metar/max-visibility-m",
m->getMaxVisibility().getVisibility_m() );
- SGMetarVisibility *dirvis = m->getDirVisibility();
+ 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";
m->getPressure_inHg() );
vector<SGMetarCloud> cv = m->getClouds();
- vector<SGMetarCloud>::iterator cloud;
+ vector<SGMetarCloud>::const_iterator cloud;
const char *cl = "/environment/clouds/layer[%i]";
for (i = 0, cloud = cv.begin(); cloud != cv.end(); cloud++, i++) {
}
-void FGClouds::setLayer( int iLayer, float alt_ft, string coverage, string layer_type ) {
+void FGClouds::setLayer( int iLayer, float alt_ft, const string& coverage, const string& layer_type ) {
double coverage_norm = 0.0;
if( coverage == "few" )
coverage_norm = 2.0/8.0; // <1-2
buildLayer(layer3D, layer_type, station_elevation_ft + alt_ft * SG_FEET_TO_METER, coverage_norm);
}
-void FGClouds::buildScenario( string scenario ) {
+void FGClouds::buildScenario( const string& scenario ) {
string fakeMetar="";
string station = fgGetString("/environment/metar/station-id", "XXXX");
// fetch station elevation if exists
- FGAirport a = globals->get_airports()->search( station );
- station_elevation_ft = a.getElevation();
+ if( station == "XXXX" )
+ station_elevation_ft = fgGetDouble("/position/ground-elev-m", 0.0);
+ else {
+ const FGAirport* a = globals->get_airports()->search( station );
+ station_elevation_ft = (a ? a->getElevation() : 0.0);
+ }
for(int iLayer = 0 ; iLayer < thesky->get_cloud_layer_count(); iLayer++) {
thesky->get_cloud_layer(iLayer)->get_layer3D()->clear();
FGMetar *m = new FGMetar( station + fakeMetar );
update_metar_properties( m );
update_env_config();
+ // propagate aloft tables
+ _controller->reinit();
+
fgSetString("/environment/metar/last-metar", m->getData());
// TODO:desactivate real metar updates
if( scenario == "Fair weather" ) {
void FGClouds::build(void) {
string scenario = fgGetString("/environment/weather-scenario", "METAR");
+ if( scenario == last_scenario)
+ return;
+ if( last_scenario == "none" ) {
+ // save clouds and weather conditions
+ SGPropertyNode *param = fgGetNode("/environment/config", true);
+ copyProperties( param, last_env_config );
+ param = fgGetNode("/environment/clouds", true);
+ copyProperties( param, last_env_clouds );
+ }
if( scenario == "METAR" ) {
- string realMetar = fgGetString("/environment/metar/last-metar", "");
+ string realMetar = fgGetString("/environment/metar/real-metar", "");
if( realMetar != "" ) {
+ fgSetString("/environment/metar/last-metar", realMetar.c_str());
FGMetar *m = new FGMetar( realMetar );
update_metar_properties( m );
update_env_config();
+ // propagate aloft tables
+ _controller->reinit();
}
buildMETAR();
}
+ else if( scenario == "none" ) {
+ // restore clouds and weather conditions
+ SGPropertyNode *param = fgGetNode("/environment/config", true);
+ copyProperties( last_env_config, param );
+ param = fgGetNode("/environment/clouds", true);
+ copyProperties( last_env_clouds, param );
+ fgSetDouble("/environment/metar/rain-norm", 0.0);
+ fgSetDouble("/environment/metar/snow-norm", 0.0);
+// update_env_config();
+ // propagate aloft tables
+ _controller->reinit();
+ buildMETAR();
+ }
else
buildScenario( scenario );
+ last_scenario = scenario;
// ...
if( snd_lightning == NULL )