diff --git a/src/Airports/simple.cxx b/src/Airports/simple.cxx index 95ce25af4..bf6620f94 100644 --- a/src/Airports/simple.cxx +++ b/src/Airports/simple.cxx @@ -58,7 +58,8 @@ FGAirport::FGAirport(const string &id, const SGGeod& location, const SGGeod& tow _name(name), _has_metar(has_metar), _dynamics(0), - mLoadedXML(false) + mRunwaysLoaded(false), + mTaxiwaysLoaded(true) { } @@ -104,11 +105,14 @@ FGAirportDynamics * FGAirport::getDynamics() unsigned int FGAirport::numRunways() const { + loadRunways(); return mRunways.size(); } FGRunway* FGAirport::getRunwayByIndex(unsigned int aIndex) const { + loadRunways(); + assert(aIndex >= 0 && aIndex < mRunways.size()); return mRunways[aIndex]; } @@ -131,7 +135,9 @@ FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const FGAirport::Runway_iterator FGAirport::getIteratorForRunwayIdent(const string& aIdent) const -{ +{ + loadRunways(); + string ident(aIdent); if ((aIdent.size() == 1) || !isdigit(aIdent[1])) { ident = "0" + aIdent; @@ -149,6 +155,8 @@ FGAirport::getIteratorForRunwayIdent(const string& aIdent) const FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const { + loadRunways(); + Runway_iterator it = mRunways.begin(); FGRunway* result = NULL; double currentBestQuality = 0.0; @@ -178,6 +186,8 @@ FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const { + loadRunways(); + unsigned int numRunways(mRunways.size()); for (unsigned int r=0; r= 0 && aIndex < mTaxiways.size()); return mTaxiways[aIndex]; } unsigned int FGAirport::numPavements() const { + loadTaxiways(); return mPavements.size(); } FGPavement* FGAirport::getPavementByIndex(unsigned int aIndex) const { + loadTaxiways(); assert(aIndex >= 0 && aIndex < mPavements.size()); return mPavements[aIndex]; } @@ -312,14 +326,28 @@ const FGAirport *fgFindAirportID( const string& id) return FGAirport::findByIdent(id); } +void FGAirport::loadRunways() const +{ + if (mRunwaysLoaded) { + return; // already loaded, great + } + + mRunwaysLoaded = true; + loadSceneryDefintions(); +} + +void FGAirport::loadTaxiways() const +{ + if (mTaxiwaysLoaded) { + return; // already loaded, great + } +} void FGAirport::loadSceneryDefintions() const -{ - mLoadedXML = true; - +{ // allow users to disable the scenery data in the short-term // longer term, this option can probably disappear - if (fgGetBool("/sim/use-scenery-airport-data") == false) { + if (!fgGetBool("/sim/use-scenery-airport-data")) { return; } @@ -369,7 +397,7 @@ void FGAirport::processThreshold(SGPropertyNode* aThreshold) void FGAirport::readTowerData(SGPropertyNode* aRoot) { - SGPropertyNode* twrNode = aRoot->getChild("twr"); + SGPropertyNode* twrNode = aRoot->getChild("tower")->getChild("twr"); double lat = twrNode->getDoubleValue("lat"), lon = twrNode->getDoubleValue("lon"), elevM = twrNode->getDoubleValue("elev-m"); diff --git a/src/Airports/simple.hxx b/src/Airports/simple.hxx index 60b54d0ff..93c76fbe1 100644 --- a/src/Airports/simple.hxx +++ b/src/Airports/simple.hxx @@ -193,11 +193,11 @@ private: bool _has_metar; FGAirportDynamics *_dynamics; - /** - * This flag indicates if we have attempted to load data from the scenery - * storage to supplement the Apt.Dat information. - */ - mutable bool mLoadedXML; + void loadRunways() const; + void loadTaxiways() const; + + mutable bool mRunwaysLoaded; + mutable bool mTaxiwaysLoaded; std::vector mRunways; std::vector mTaxiways;