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:
parent
359ab0c207
commit
ed1369bd8a
3 changed files with 24 additions and 21 deletions
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue