]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIManager.cxx
Merge branch 'next' into durk-atc
[flightgear.git] / src / AIModel / AIManager.cxx
index 7ed3d9d7a3ebb2ff8e827e7205415f19d82f071e..4190981124242bea13257c082babf70a59c18b60 100644 (file)
@@ -2,7 +2,7 @@
 // - a global management type for AI objects
 //
 // Written by David Culp, started October 2003.
-// - davidculp2@comcast.net
+// - davidculp2@comcast.net 
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+#include <cstring>
+
+#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/props/props_io.hxx>
+#include <simgear/structure/exception.hxx>
+
 #include <Main/globals.hxx>
 
 #include <Airports/simple.hxx>
@@ -34,9 +40,8 @@
 #include "AIMultiplayer.hxx"
 #include "AITanker.hxx"
 #include "AIWingman.hxx"
-
-#include <simgear/math/sg_geodesy.hxx>
-
+#include "AIGroundVehicle.hxx"
+#include "AIEscort.hxx"
 
 FGAIManager::FGAIManager() {
     _dt = 0.0;
@@ -64,13 +69,14 @@ FGAIManager::init() {
     if (!enabled)
         return;
 
-    wind_from_down_node = fgGetNode("/environment/wind-from-down-fps", true);
+    thermal_lift_node = fgGetNode("/environment/thermal-lift-fps", true);
     wind_from_east_node  = fgGetNode("/environment/wind-from-east-fps",true);
     wind_from_north_node = fgGetNode("/environment/wind-from-north-fps",true);
 
     user_latitude_node  = fgGetNode("/position/latitude-deg", true);
     user_longitude_node = fgGetNode("/position/longitude-deg", true);
     user_altitude_node  = fgGetNode("/position/altitude-ft", true);
+    user_altitude_agl_node  = fgGetNode("/position/altitude-agl-ft", true);
     user_heading_node   = fgGetNode("/orientation/heading-deg", true);
     user_pitch_node     = fgGetNode("/orientation/pitch-deg", true);
     user_yaw_node       = fgGetNode("/orientation/side-slip-deg", true);
@@ -92,11 +98,11 @@ FGAIManager::postinit() {
             continue;
 
         if (scenarios.find(name) != scenarios.end()) {
-            SG_LOG(SG_GENERAL, SG_WARN, "won't load scenario '" << name << "' twice");
+            SG_LOG(SG_GENERAL, SG_DEBUG, "won't load scenario '" << name << "' twice");
             continue;
         }
 
-        SG_LOG(SG_GENERAL, SG_INFO, "loading scenario '" << name << '\'');
+        SG_LOG(SG_GENERAL, SG_ALERT, "loading scenario '" << name << '\'');
         processScenario(name);
         scenarios[name] = true;
     }
@@ -105,6 +111,7 @@ FGAIManager::postinit() {
 void
 FGAIManager::reinit() {
     update(0.0);
+
     ai_list_iterator ai_list_itr = ai_list.begin();
 
     while(ai_list_itr != ai_list.end()) {
@@ -145,7 +152,7 @@ FGAIManager::update(double dt) {
             tmgr->release((*ai_list_itr)->getID());
             --mNumAiModels;
             --(mNumAiTypeModels[(*ai_list_itr)->getType()]);
-            FGAIBase *base = *ai_list_itr;
+            FGAIBase *base = (*ai_list_itr).get();
             SGPropertyNode *props = base->_getProps();
 
             props->setBoolValue("valid", false);
@@ -162,7 +169,7 @@ FGAIManager::update(double dt) {
         } else {
             fetchUserState();
             if ((*ai_list_itr)->isa(FGAIBase::otThermal)) {
-                FGAIBase *base = *ai_list_itr;
+                FGAIBase *base = (*ai_list_itr).get();
                 processThermal((FGAIThermal*)base);
             } else {
                 (*ai_list_itr)->update(_dt);
@@ -171,11 +178,11 @@ FGAIManager::update(double dt) {
         }
     }
 
-    wind_from_down_node->setDoubleValue( strength ); // for thermals
+    thermal_lift_node->setDoubleValue( strength );  // for thermals
 }
 
 void
-FGAIManager::attach(SGSharedPtr<FGAIBase> model)
+FGAIManager::attach(FGAIBase *model)
 {
     //unsigned idx = mNumAiTypeModels[model->getType()];
     const char* typeString = model->getTypeString();
@@ -233,6 +240,7 @@ FGAIManager::getNumAiObjects(void) const
 
 void
 FGAIManager::fetchUserState( void ) {
+
     user_latitude  = user_latitude_node->getDoubleValue();
     user_longitude = user_longitude_node->getDoubleValue();
     user_altitude  = user_altitude_node->getDoubleValue();
@@ -242,7 +250,9 @@ FGAIManager::fetchUserState( void ) {
     user_speed     = user_speed_node->getDoubleValue() * 0.592484;
     user_roll      = user_roll_node->getDoubleValue();
     wind_from_east = wind_from_east_node->getDoubleValue();
-    wind_from_north = wind_from_north_node->getDoubleValue();
+    wind_from_north   = wind_from_north_node->getDoubleValue();
+    user_altitude_agl = user_altitude_agl_node->getDoubleValue();
+
 }
 
 // only keep the results from the nearest thermal
@@ -257,6 +267,8 @@ FGAIManager::processThermal( FGAIThermal* thermal ) {
 
 }
 
+
+
 void
 FGAIManager::processScenario( const string &filename ) {
 
@@ -277,8 +289,8 @@ FGAIManager::processScenario( const string &filename ) {
             continue;
         std::string type = scEntry->getStringValue("type", "aircraft");
 
-         if (type == "tanker") { // refueling scenarios
-           FGAITanker* tanker = new FGAITanker;
+        if (type == "tanker") { // refueling scenarios
+            FGAITanker* tanker = new FGAITanker;
             tanker->readFromScenario(scEntry);
             attach(tanker);
 
@@ -287,7 +299,7 @@ FGAIManager::processScenario( const string &filename ) {
             wingman->readFromScenario(scEntry);
             attach(wingman);
 
-    } else if (type == "aircraft") {
+        } else if (type == "aircraft") {
             FGAIAircraft* aircraft = new FGAIAircraft;
             aircraft->readFromScenario(scEntry);
             attach(aircraft);
@@ -302,6 +314,16 @@ FGAIManager::processScenario( const string &filename ) {
             carrier->readFromScenario(scEntry);
             attach(carrier);
 
+        } else if (type == "groundvehicle") {
+            FGAIGroundVehicle* groundvehicle = new FGAIGroundVehicle;
+            groundvehicle->readFromScenario(scEntry);
+            attach(groundvehicle);
+
+        } else if (type == "escort") {
+            FGAIEscort* escort = new FGAIEscort;
+            escort->readFromScenario(scEntry);
+            attach(escort);
+
         } else if (type == "thunderstorm") {
             FGAIStorm* storm = new FGAIStorm;
             storm->readFromScenario(scEntry);
@@ -321,9 +343,10 @@ FGAIManager::processScenario( const string &filename ) {
             FGAIStatic* aistatic = new FGAIStatic;
             aistatic->readFromScenario(scEntry);
             attach(aistatic);
-
         }
+
     }
+
 }
 
 SGPropertyNode_ptr
@@ -335,7 +358,7 @@ FGAIManager::loadScenarioFile(const std::string& filename)
         SGPropertyNode_ptr root = new SGPropertyNode;
         readProperties(path.str(), root);
         return root;
-    } catch (const sg_exception &e) {
+    } catch (const sg_exception &) {
         SG_LOG(SG_GENERAL, SG_DEBUG, "Incorrect path specified for AI "
             "scenario: \"" << path.str() << "\"");
         return 0;
@@ -385,9 +408,8 @@ const FGAIBase *
 FGAIManager::calcCollision(double alt, double lat, double lon, double fuse_range)
 {
     // we specify tgt extent (ft) according to the AIObject type
-    double tgt_ht[]     = {0, 50 ,100, 250, 0, 100, 0, 0, 50, 50};
-    double tgt_length[] = {0, 100, 200, 750, 0, 50, 0, 0, 200, 100};
-
+    double tgt_ht[]     = {0,  50, 100, 250, 0, 100, 0, 0,  50,  50, 20, 100,  50};
+    double tgt_length[] = {0, 100, 200, 750, 0,  50, 0, 0, 200, 100, 40, 200, 100};
     ai_list_iterator ai_list_itr = ai_list.begin();
     ai_list_iterator end = ai_list.end();
 
@@ -397,14 +419,14 @@ FGAIManager::calcCollision(double alt, double lat, double lon, double fuse_range
         tgt_ht[type] += fuse_range;
 
         if (fabs(tgt_alt - alt) > tgt_ht[type] || type == FGAIBase::otBallistic
-                || type == FGAIBase::otStorm || type == FGAIBase::otThermal) {
-            SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager: skipping "
-                << fabs(tgt_alt - alt)
-                << " "
-                << type
-                );
-            ++ai_list_itr;
-            continue;
+            || type == FGAIBase::otStorm || type == FGAIBase::otThermal ) {
+                //SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager: skipping "
+                //    << fabs(tgt_alt - alt)
+                //    << " "
+                //    << type
+                //    );
+                ++ai_list_itr;
+                continue;
         }
 
         double tgt_lat = (*ai_list_itr)->_getLatitude();
@@ -413,14 +435,14 @@ FGAIManager::calcCollision(double alt, double lat, double lon, double fuse_range
 
         double range = calcRange(lat, lon, tgt_lat, tgt_lon);
 
-        SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager:  AI list size "
-            << ai_list.size()
-            << " type " << type
-            << " ID " << id
-            << " range " << range
-            //<< " bearing " << bearing
-            << " alt " << tgt_alt
-            );
+        //SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager:  AI list size "
+        //    << ai_list.size()
+        //    << " type " << type
+        //    << " ID " << id
+        //    << " range " << range
+        //    //<< " bearing " << bearing
+        //    << " alt " << tgt_alt
+        //    );
 
         tgt_length[type] += fuse_range;
 
@@ -431,7 +453,7 @@ FGAIManager::calcCollision(double alt, double lat, double lon, double fuse_range
                 << " range " << range
                 << " alt " << tgt_alt
                 );
-            return *ai_list_itr;
+            return (*ai_list_itr).get();
         }
         ++ai_list_itr;
     }