#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <Airports/dynamics.hxx>
+#include <Airports/simple.hxx>
#include <string>
#include <math.h>
holdPos = false;
needsTaxiClearance = false;
+ _needsGroundElevation = true;
_performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB
dt = 0;
void FGAIAircraft::AccelTo(double speed) {
tgt_speed = speed;
+ if (!isStationary())
+ _needsGroundElevation = true;
}
use_perf_vs = true;
}
}
- tgt_speed = prev->speed;
+ AccelTo(prev->speed);
hdg_lock = alt_lock = true;
no_roll = prev->on_ground;
}
void FGAIAircraft::getGroundElev(double dt) {
dt_elev_count += dt;
+ if (!needGroundElevation())
+ return;
// Update minimally every three secs, but add some randomness
// to prevent all AI objects doing this in synchrony
if (dt_elev_count < (3.0) + (rand() % 10))
}
double range = 500.0;
- if (!globals->get_tile_mgr()->scenery_available(pos, range)) {
- // Try to shedule tiles for that position.
- globals->get_tile_mgr()->update( pos, range );
+ if (globals->get_tile_mgr()->schedule_scenery(pos, range, 5.0))
+ {
+ double alt;
+ if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0))
+ {
+ tgt_altitude_ft = alt * SG_METER_TO_FEET;
+ if (isStationary())
+ {
+ // aircraft is stationary and we obtained altitude for this spot - we're done.
+ _needsGroundElevation = false;
+ }
+ }
}
-
- double alt;
- if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0))
- tgt_altitude_ft = alt * SG_METER_TO_FEET;
}
}
void FGAIAircraft::doGroundAltitude() {
- if (fabs(altitude_ft - (tgt_altitude_ft+groundOffset)) > 1000.0)
+ if ((fabs(altitude_ft - (tgt_altitude_ft+groundOffset)) > 1000.0)||
+ (isStationary()))
altitude_ft = (tgt_altitude_ft + groundOffset);
else
altitude_ft += 0.1 * ((tgt_altitude_ft+groundOffset) - altitude_ft);
Transform(); // make sure aip is initialized.
getGroundElev(60.1); // make sure it's executed first time around, so force a large dt value
doGroundAltitude();
+ _needsGroundElevation = true; // check ground elevation again (maybe scenery wasn't available yet)
}
// Make sure to announce the aircraft's position
announcePositionToController();
// << dist_to_go << ": Lead distance "
// << lead_dist << " " << curr->name
// << " Ground target speed " << groundTargetSpeed << endl;
- double bearing;
+ double bearing = 0;
if (speed > 50) { // don't do bearing calculations for ground traffic
bearing = getBearing(fp->getBearing(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr));
if (bearing < minBearing) {