1
0
Fork 0

Stuart BUCHANAN: fix METAR cloud interpolation

"I've managed to fix this by differentiating rebuilding the 3D layers
(e.g. due to METAR updates) from rebuilding the entire environment (due to a
change in scenario)."
This commit is contained in:
mfranz 2008-12-21 15:52:29 +00:00
parent 359ab0c207
commit ed1369bd8a
3 changed files with 24 additions and 21 deletions

View file

@ -198,6 +198,9 @@ FGEnvironmentMgr::bind ()
fgTie("/environment/rebuild-layers", fgClouds, fgTie("/environment/rebuild-layers", fgClouds,
&FGClouds::get_update_event, &FGClouds::get_update_event,
&FGClouds::set_update_event); &FGClouds::set_update_event);
fgTie("/environment/weather-scenario", fgClouds,
&FGClouds::get_scenario,
&FGClouds::set_scenario);
fgTie("/sim/rendering/lightning-enable", &sgEnviro, fgTie("/sim/rendering/lightning-enable", &sgEnviro,
&SGEnviro::get_lightning_enable_state, &SGEnviro::get_lightning_enable_state,
&SGEnviro::set_lightning_enable_state); &SGEnviro::set_lightning_enable_state);
@ -244,6 +247,7 @@ FGEnvironmentMgr::unbind ()
fgUntie("/sim/rendering/clouds3d-density"); fgUntie("/sim/rendering/clouds3d-density");
fgUntie("/sim/rendering/precipitation-enable"); fgUntie("/sim/rendering/precipitation-enable");
fgUntie("/environment/rebuild-layers"); fgUntie("/environment/rebuild-layers");
fgUntie("/environment/weather-scenario");
fgUntie("/sim/rendering/lightning-enable"); fgUntie("/sim/rendering/lightning-enable");
fgUntie("/environment/turbulence/use-cloud-turbulence"); fgUntie("/environment/turbulence/use-cloud-turbulence");
} }

View file

@ -65,7 +65,7 @@ int FGClouds::get_update_event(void) const {
} }
void FGClouds::set_update_event(int count) { void FGClouds::set_update_event(int count) {
update_event = count; update_event = count;
build(); buildCloudLayers();
} }
void FGClouds::init(void) { void FGClouds::init(void) {
@ -160,16 +160,16 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
SGCloudField *layer = thesky->get_cloud_layer(iLayer)->get_layer3D(); SGCloudField *layer = thesky->get_cloud_layer(iLayer)->get_layer3D();
layer->clear(); layer->clear();
// when we don't generate clouds the layer is rendered in 2D // If we don't have the required properties, then render the cloud in 2D
if ((! clouds_3d_enabled) || coverage == 0.0 || if ((! clouds_3d_enabled) || coverage == 0.0 ||
layer_def_root == NULL || cloud_def_root == NULL || box_def_root == NULL) layer_def_root == NULL || cloud_def_root == NULL || box_def_root == NULL)
{ {
thesky->get_cloud_layer(iLayer)->set_enable3dClouds(false); thesky->get_cloud_layer(iLayer)->set_enable3dClouds(false);
return; return;
} }
// If we can't find a definition for this cloud type, then render the cloud in 2D
SGPropertyNode *layer_def=NULL; SGPropertyNode *layer_def=NULL;
layer_def = layer_def_root->getChild(name.c_str()); layer_def = layer_def_root->getChild(name.c_str());
if( !layer_def ) { if( !layer_def ) {
if( name[2] == '-' ) { if( name[2] == '-' ) {
@ -183,6 +183,9 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
} }
} }
// At this point, we know we've got some 3D clouds to generate.
thesky->get_cloud_layer(iLayer)->set_enable3dClouds(true);
double grid_x_size = layer_def->getDoubleValue("grid-x-size", 1000.0); double grid_x_size = layer_def->getDoubleValue("grid-x-size", 1000.0);
double grid_y_size = layer_def->getDoubleValue("grid-y-size", 1000.0); double grid_y_size = layer_def->getDoubleValue("grid-y-size", 1000.0);
double grid_x_rand = layer_def->getDoubleValue("grid-x-rand", grid_x_size); double grid_x_rand = layer_def->getDoubleValue("grid-x-rand", grid_x_size);
@ -244,7 +247,6 @@ void FGClouds::buildLayer(int iLayer, const string& name, double alt, double cov
thesky->get_cloud_layer(iLayer)->set_enable3dClouds(clouds_3d_enabled); thesky->get_cloud_layer(iLayer)->set_enable3dClouds(clouds_3d_enabled);
} }
// TODO:call this after real metar updates
void FGClouds::buildCloudLayers(void) { void FGClouds::buildCloudLayers(void) {
SGPropertyNode *metar_root = fgGetNode("/environment", true); SGPropertyNode *metar_root = fgGetNode("/environment", true);
@ -440,7 +442,6 @@ FGClouds::update_env_config ()
fgGetDouble("/environment/metar/pressure-inhg") ); fgGetDouble("/environment/metar/pressure-inhg") );
} }
void FGClouds::setLayer( int iLayer, float alt_ft, const string& coverage, const string& layer_type ) { void FGClouds::setLayer( int iLayer, float alt_ft, const string& coverage, const string& layer_type ) {
double coverage_norm = 0.0; double coverage_norm = 0.0;
if( coverage == "few" ) if( coverage == "few" )
@ -475,7 +476,7 @@ void FGClouds::buildScenario( const string& scenario ) {
station += " 011000Z "; station += " 011000Z ";
if( scenario == "Fair weather" ) { if( scenario == "Fair weather" ) {
fakeMetar = "15003KT 12SM SCT033 FEW200 20/08 Q1015 NOSIG"; fakeMetar = "15003KT 12SM SCT041 FEW200 20/08 Q1015 NOSIG";
//setLayer(0, 3300.0, "scattered", "cu"); //setLayer(0, 3300.0, "scattered", "cu");
} else if( scenario == "Thunderstorm" ) { } else if( scenario == "Thunderstorm" ) {
fakeMetar = "15012KT 08SM TSRA SCT040 BKN070 20/12 Q0995"; fakeMetar = "15012KT 08SM TSRA SCT040 BKN070 20/12 Q0995";
@ -496,9 +497,9 @@ void FGClouds::buildScenario( const string& scenario ) {
} }
} }
void FGClouds::set_scenario(const char * sc) {
void FGClouds::build() { scenario = string(sc);
string scenario = fgGetString("/environment/weather-scenario", "METAR");
// if(!rebuild_required && (scenario == last_scenario)) // if(!rebuild_required && (scenario == last_scenario))
// return; // return;
@ -549,22 +550,16 @@ void FGClouds::build() {
init(); init();
} }
const char * FGClouds::get_scenario(void) const
{
return scenario.c_str();
}
void FGClouds::set_3dClouds(bool enable) void FGClouds::set_3dClouds(bool enable)
{ {
if (enable != clouds_3d_enabled) { if (enable != clouds_3d_enabled) {
clouds_3d_enabled = enable; clouds_3d_enabled = enable;
buildCloudLayers();
for(int iLayer = 0 ; iLayer < thesky->get_cloud_layer_count(); iLayer++) {
thesky->get_cloud_layer(iLayer)->set_enable3dClouds(enable);
if (!enable) {
thesky->get_cloud_layer(iLayer)->get_layer3D()->clear();
}
}
if (enable) {
build();
}
} }
} }

View file

@ -63,6 +63,7 @@ void buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_def_root, co
float station_elevation_ft; float station_elevation_ft;
bool clouds_3d_enabled; bool clouds_3d_enabled;
string last_scenario; string last_scenario;
string scenario;
SGPropertyNode *last_env_config, *last_env_clouds; SGPropertyNode *last_env_config, *last_env_clouds;
public: public:
@ -71,6 +72,9 @@ public:
void init(void); void init(void);
void set_scenario(const char * sc);
const char * get_scenario(void) const;
int get_update_event(void) const; int get_update_event(void) const;
void set_update_event(int count); void set_update_event(int count);
bool get_3dClouds() const; bool get_3dClouds() const;