1
0
Fork 0

Synchronize elevation-ft property in environment

This fixes some issues with Basic Weather producing invalid pressure
altitudes under some circumstances.
This commit is contained in:
Tobias Dammers 2021-10-20 12:33:21 +02:00 committed by James Turner
parent b6e4cbbf14
commit c8a3f60245
2 changed files with 27 additions and 4 deletions

View file

@ -270,6 +270,10 @@ void FGEnvironment::Tie( SGPropertyNode_ptr base, bool archivable )
&FGEnvironment::get_visibility_m, &FGEnvironment::get_visibility_m,
&FGEnvironment::set_visibility_m); &FGEnvironment::set_visibility_m);
_tiedProperties.Tie("elevation-ft", this,
&FGEnvironment::get_elevation_ft,
&FGEnvironment::set_elevation_ft);
_tiedProperties.Tie("temperature-sea-level-degc", this, _tiedProperties.Tie("temperature-sea-level-degc", this,
&FGEnvironment::get_temperature_sea_level_degc, &FGEnvironment::get_temperature_sea_level_degc,
&FGEnvironment::set_temperature_sea_level_degc); &FGEnvironment::set_temperature_sea_level_degc);

View file

@ -197,10 +197,12 @@ void LayerTable::Bind()
{ {
// tie all environments to ~/entry[n]/xxx // tie all environments to ~/entry[n]/xxx
// register this as a changelistener of ~/entry[n]/pressure-sea-level-inhg // register this as a changelistener of ~/entry[n]/pressure-sea-level-inhg
// and ~/entry[n]/elevation-ft
for( unsigned i = 0; i < size(); i++ ) { for( unsigned i = 0; i < size(); i++ ) {
SGPropertyNode_ptr baseNode = _rootNode->getChild("entry", i, true ); SGPropertyNode_ptr baseNode = _rootNode->getChild("entry", i, true );
at(i)->environment.Tie( baseNode ); at(i)->environment.Tie( baseNode );
baseNode->getNode( "pressure-sea-level-inhg", true )->addChangeListener( this ); baseNode->getNode( "pressure-sea-level-inhg", true )->addChangeListener( this );
baseNode->getNode("elevation-ft", true)->addChangeListener(this);
} }
} }
@ -208,20 +210,37 @@ void LayerTable::Unbind()
{ {
// untie all environments to ~/entry[n]/xxx // untie all environments to ~/entry[n]/xxx
// deregister this as a changelistener of ~/entry[n]/pressure-sea-level-inhg // deregister this as a changelistener of ~/entry[n]/pressure-sea-level-inhg
// and ~/entry[n]/elevation-ft
for( unsigned i = 0; i < size(); i++ ) { for( unsigned i = 0; i < size(); i++ ) {
SGPropertyNode_ptr baseNode = _rootNode->getChild("entry", i, true ); SGPropertyNode_ptr baseNode = _rootNode->getChild("entry", i, true );
at(i)->environment.Untie(); at(i)->environment.Untie();
baseNode->getNode( "pressure-sea-level-inhg", true )->removeChangeListener( this ); baseNode->getNode( "pressure-sea-level-inhg", true )->removeChangeListener( this );
baseNode->getNode("elevation-ft", true)->removeChangeListener(this);
} }
} }
void LayerTable::valueChanged( SGPropertyNode * node ) void LayerTable::valueChanged( SGPropertyNode * node )
{ {
// Make sure all environments in our column use the same sea level pressure // - Make sure all environments in our column use the same sea level pressure
// - Synchronize layer elevations
if (node->getNameString() == "pressure-sea-level-inhg") {
double value = node->getDoubleValue(); double value = node->getDoubleValue();
for( iterator it = begin(); it != end(); it++ ) for (iterator it = begin(); it != end(); it++) {
(*it)->environment.set_pressure_sea_level_inhg(value); (*it)->environment.set_pressure_sea_level_inhg(value);
} }
} else {
bool sort_required = false;
double last_altitude_ft = 0.0;
for (iterator it = begin(); it != end(); it++) {
(*it)->altitude_ft = (*it)->environment.get_elevation_ft();
if ((*it)->altitude_ft < last_altitude_ft)
sort_required = true;
last_altitude_ft = (*it)->altitude_ft;
}
if (sort_required)
sort(begin(), end(), LayerTableBucket::lessThan);
}
}
void LayerTable::interpolate( double altitude_ft, FGEnvironment * result ) void LayerTable::interpolate( double altitude_ft, FGEnvironment * result )