X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIAircraft.cxx;h=5e803ef5e159b81e6c3934a73c060f13ab96a16a;hb=d035fdf3a949e62f0c8e772e100d14087b6d4ba9;hp=bd8830e4bb71b3266c2ac9d915552d7301f16be1;hpb=a65f24c1378fb7535801557712d249060ec8ac50;p=flightgear.git diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index bd8830e4b..5e803ef5e 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -33,16 +33,11 @@ #include #include -#include -#include - -#ifdef _MSC_VER -# include -# define finite _finite -#elif defined(__sun) || defined(sgi) -# include -#endif +#include +#include +// defined in AIShip.cxx +extern double fgIsFinite(double x); #include "AIAircraft.hxx" #include "performancedata.hxx" @@ -89,6 +84,7 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : headingError = 0; minBearing = 360; speedFraction =1.0; + prev_dist_to_go = 0.0; holdPos = false; needsTaxiClearance = false; @@ -176,18 +172,12 @@ void FGAIAircraft::setPerformance(const std::string& acType, const std::string& // AI manager. In this particular case, the AIAircraft is used to shadow the user's aircraft's behavior in the AI world. // Since we perhaps don't want a radar entry of our own aircraft, the following conditional should probably be adequate // enough - if (manager) + if (manager){ UpdateRadar(manager); - checkVisibility(); + invisible = !manager->isVisible(pos); + } } -void FGAIAircraft::checkVisibility() -{ - double visibility_meters = fgGetDouble("/environment/visibility-m"); - invisible = (SGGeodesy::distanceM(globals->get_view_position(), pos) > visibility_meters); -} - - void FGAIAircraft::AccelTo(double speed) { tgt_speed = speed; @@ -234,16 +224,26 @@ double FGAIAircraft::sign(double x) { } -void FGAIAircraft::setFlightPlan(const std::string& flightplan, bool repeat) { - if (!flightplan.empty()) { - FGAIFlightPlan* fp = new FGAIFlightPlan(flightplan); +void FGAIAircraft::setFlightPlan(const std::string& flightplan, bool repeat) +{ + if (flightplan.empty()) { + // this is the case for Nasal-scripted aircraft + return; + } + + FGAIFlightPlan* fp = new FGAIFlightPlan(flightplan); + if (fp->isValidPlan()) { fp->setRepeat(repeat); SetFlightPlan(fp); + } else { + SG_LOG(SG_AI, SG_WARN, "setFlightPlan: invalid flightplan specified:" << flightplan); + delete fp; } } -void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) { +void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) +{ delete fp; fp = f; } @@ -934,7 +934,7 @@ void FGAIAircraft::controlHeading(FGAIWaypoint* curr) { SG_NORMALIZE_RANGE(calc_bearing, 0.0, 360.0); } - if (finite(calc_bearing)) { + if (fgIsFinite(calc_bearing)) { double hdg_error = calc_bearing - tgt_heading; if (fabs(hdg_error) > 0.01) { TurnTo( calc_bearing );