]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIAircraft.cxx
Optimise NavCache airport query
[flightgear.git] / src / AIModel / AIAircraft.cxx
index bd8830e4bb71b3266c2ac9d915552d7301f16be1..5e803ef5e159b81e6c3934a73c060f13ab96a16a 100644 (file)
 #include <simgear/structure/exception.hxx>
 
 #include <string>
-#include <math.h>
-#include <time.h>
-
-#ifdef _MSC_VER
-#  include <float.h>
-#  define finite _finite
-#elif defined(__sun) || defined(sgi)
-#  include <ieeefp.h>
-#endif
+#include <cmath>
+#include <ctime>
 
+// 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 );