diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index a91f8d0a9..e69602253 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -57,6 +57,8 @@ FGAIBase::FGAIBase() { _otype = otNull; index = 0; fp = (FGAIFlightPlan*)0; + delete_me = false; + manager = NULL; } FGAIBase::~FGAIBase() { @@ -89,8 +91,10 @@ void FGAIBase::Transform() { bool FGAIBase::init() { SGPropertyNode *root = globals->get_props()->getNode("ai/models", true); + index = manager->getNum(_otype) - 1; props = root->getNode(_type_str.c_str(), index, true); + if (model_path != "") { model = sgLoad3DModel( globals->get_fg_root(), model_path.c_str(), diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index a46e94526..51ad35db5 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -27,11 +27,44 @@ #include #include
-#include "AIFlightPlan.hxx" SG_USING_STD(string); class FGAIManager; +class FGAIFlightPlan; + + +typedef struct { + string callsign; + + // can be aircraft, ship, storm, thermal or ballistic + const char* m_type; + const char* m_class; + const char* path; + const char* flightplan; + + FGAIFlightPlan *fp; + + double repeat; // in seconds + double latitude; // used if no flightplan defined + double longitude; // used if no flightplan defined + double altitude; // used if no flightplan defined + double speed; // used if no flightplan defined + double heading; // used if no flightplan defined + double roll; // used if no flightplan defined + double azimuth; // used by ballistic objects + double elevation; // used by ballistic objects + double rudder; // used by ship objects + double strength; // used by thermal objects + double diameter; // used by thermal objects + double eda; // used by ballistic objects + double life; // life span in seconds + double buoyancy; // acceleration in ft per sec2 + double wind_from_east; // in feet per second + double wind_from_north; // in feet per second + bool wind; +} FGAIModelEntity; + class FGAIBase { diff --git a/src/AIModel/AIFlightPlan.cxx b/src/AIModel/AIFlightPlan.cxx index 2c838f824..04bfbe357 100644 --- a/src/AIModel/AIFlightPlan.cxx +++ b/src/AIModel/AIFlightPlan.cxx @@ -89,11 +89,7 @@ FGAIFlightPlan::FGAIFlightPlan(string filename) // Position computed by the traffic manager, as well // as setting speeds and altitude computed by the // traffic manager. -FGAIFlightPlan::FGAIFlightPlan(string filename, - double lat, - double lon, - double alt, - double speed, +FGAIFlightPlan::FGAIFlightPlan(FGAIModelEntity *entity, double course, FGAirport *dep, FGAirport *arr) @@ -101,7 +97,8 @@ FGAIFlightPlan::FGAIFlightPlan(string filename, bool useInitialWayPoint = true; bool useCurrentWayPoint = false; SGPath path( globals->get_fg_root() ); - path.append( ("/Data/AI/FlightPlans/" + filename).c_str() ); + path.append( "/Data/AI/FlightPlans" ); + path.append( entity->path ); SGPropertyNode root; try { @@ -135,17 +132,17 @@ FGAIFlightPlan::FGAIFlightPlan(string filename, // cout << path.str() << endl; // cout << "Trying to create this plan dynamically" << endl; // cout << "Route from " << dep->id << " to " << arr->id << endl; - create(dep,arr, alt, speed); + create(dep,arr, entity->altitude, entity->speed); // Now that we have dynamically created a flight plan, // we need to add some code that pops any waypoints already past. //return; } waypoint* init_waypoint = new waypoint; init_waypoint->name = string("initial position"); - init_waypoint->latitude = lat; - init_waypoint->longitude = lon; - init_waypoint->altitude = alt; - init_waypoint->speed = speed; + init_waypoint->latitude = entity->latitude; + init_waypoint->longitude = entity->longitude; + init_waypoint->altitude = entity->altitude; + init_waypoint->speed = entity->speed; init_waypoint->crossat = - 10000; init_waypoint->gear_down = false; init_waypoint->flaps_down = false; diff --git a/src/AIModel/AIFlightPlan.hxx b/src/AIModel/AIFlightPlan.hxx index 4aebc90b0..8cc6bb888 100644 --- a/src/AIModel/AIFlightPlan.hxx +++ b/src/AIModel/AIFlightPlan.hxx @@ -25,6 +25,8 @@ #include +#include "AIBase.hxx" + SG_USING_STD(vector); SG_USING_STD(string); @@ -47,11 +49,7 @@ public: } waypoint; FGAIFlightPlan(string filename); - FGAIFlightPlan(string filename, - double lat, - double lon, - double alt, - double speed, + FGAIFlightPlan(FGAIModelEntity *entity, double course, FGAirport *dep, FGAirport *arr); diff --git a/src/AIModel/AIManager.cxx b/src/AIModel/AIManager.cxx index b81167a66..3cc50714a 100644 --- a/src/AIModel/AIManager.cxx +++ b/src/AIModel/AIManager.cxx @@ -1,5 +1,5 @@ // AIManager.cxx Based on David Luff's AIMgr: -// - a global management class for AI objects +// - a global management type for AI objects // // Written by David Culp, started October 2003. // - davidculp2@comcast.net @@ -40,6 +40,8 @@ FGAIManager::FGAIManager() { _dt = 0.0; dt_count = 9; scenario_filename = ""; + ai_list.clear(); + ids.clear(); } FGAIManager::~FGAIManager() { @@ -60,7 +62,7 @@ void FGAIManager::init() { if (!enabled) return; - wind_from_down = fgGetNode("/environment/wind-from-down-fps", true); + wind_from_down_node = fgGetNode("/environment/wind-from-down-fps", true); scenario_filename = root->getNode("scenario", true)->getStringValue(); @@ -114,7 +116,7 @@ void FGAIManager::update(double dt) { } ++ai_list_itr; } - wind_from_down->setDoubleValue( strength ); + wind_from_down_node->setDoubleValue( strength ); } @@ -153,160 +155,117 @@ void FGAIManager::freeID( int ID ) { } } -int FGAIManager::createAircraft( string model_class, string path, - double latitude, double longitude, double altitude, - double heading, double speed, double roll ) { +int FGAIManager::createAircraft( FGAIModelEntity *entity ) { FGAIAircraft* ai_plane = new FGAIAircraft(this); ai_list.push_back(ai_plane); ai_plane->setID( assignID() ); ++numObjects; - if (model_class == "light") { + if (entity->m_class == "light") { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::LIGHT]); - } else if (model_class == "ww2_fighter") { + } else if (entity->m_class == "ww2_fighter") { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::WW2_FIGHTER]); - } else if (model_class == "jet_transport") { + } else if (entity->m_class == "jet_transport") { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); - } else if (model_class == "jet_fighter") { + } else if (entity->m_class == "jet_fighter") { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_FIGHTER]); - } else if (model_class == "tanker") { + } else if (entity->m_class == "tanker") { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); ai_plane->SetTanker(true); } else { ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); } - ai_plane->setHeading(heading); - ai_plane->setSpeed(speed); - ai_plane->setPath(path.c_str()); - ai_plane->setAltitude(altitude); - ai_plane->setLongitude(longitude); - ai_plane->setLatitude(latitude); - ai_plane->setBank(roll); - ai_plane->init(); - ai_plane->bind(); - return ai_plane->getID(); -} + ai_plane->setHeading(entity->heading); + ai_plane->setSpeed(entity->speed); + ai_plane->setPath(entity->path); + ai_plane->setAltitude(entity->altitude); + ai_plane->setLongitude(entity->longitude); + ai_plane->setLatitude(entity->latitude); + ai_plane->setBank(entity->roll); - -int FGAIManager::createAircraft( string model_class, string path, - FGAIFlightPlan* flightplan ) { - - FGAIAircraft* ai_plane = new FGAIAircraft(this); - ai_list.push_back(ai_plane); - ai_plane->setID( assignID() ); - ++numObjects; - if (model_class == "light") { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::LIGHT]); - } else if (model_class == "ww2_fighter") { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::WW2_FIGHTER]); - } else if (model_class == "jet_transport") { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); - } else if (model_class == "jet_fighter") { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_FIGHTER]); - } else if (model_class == "tanker") { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); - ai_plane->SetTanker(true); - } else { - ai_plane->SetPerformance(&FGAIAircraft::settings[FGAIAircraft::JET_TRANSPORT]); + if ( entity->fp ) { + ai_plane->SetFlightPlan(entity->fp); } - ai_plane->setPath(path.c_str()); - ai_plane->SetFlightPlan(flightplan); + ai_plane->init(); ai_plane->bind(); return ai_plane->getID(); } - -int FGAIManager::createShip( string path, double latitude, double longitude, - double altitude, double heading, double speed, - double rudder ) { +int FGAIManager::createShip( FGAIModelEntity *entity ) { FGAIShip* ai_ship = new FGAIShip(this); ai_list.push_back(ai_ship); ai_ship->setID( assignID() ); ++numObjects; - ai_ship->setHeading(heading); - ai_ship->setSpeed(speed); - ai_ship->setPath(path.c_str()); - ai_ship->setAltitude(altitude); - ai_ship->setLongitude(longitude); - ai_ship->setLatitude(latitude); - ai_ship->setBank(rudder); + ai_ship->setHeading(entity->heading); + ai_ship->setSpeed(entity->speed); + ai_ship->setPath(entity->path); + ai_ship->setAltitude(entity->altitude); + ai_ship->setLongitude(entity->longitude); + ai_ship->setLatitude(entity->latitude); + ai_ship->setBank(entity->rudder); + + if ( entity->fp ) { + ai_ship->setFlightPlan(entity->fp); + } + ai_ship->init(); ai_ship->bind(); return ai_ship->getID(); } -int FGAIManager::createShip( string path, FGAIFlightPlan* flightplan ) { - - FGAIShip* ai_ship = new FGAIShip(this); - ai_list.push_back(ai_ship); - ai_ship->setID( assignID() ); - ++numObjects; - ai_ship->setPath(path.c_str()); - ai_ship->setFlightPlan(flightplan); - ai_ship->init(); - ai_ship->bind(); - return ai_ship->getID(); -} - - -int FGAIManager::createBallistic( string path, double latitude, double longitude, - double altitude, double azimuth, double elevation, - double speed, double eda, double life, double buoyancy, - double wind_from_east, double wind_from_north, bool wind ) { +int FGAIManager::createBallistic( FGAIModelEntity *entity ) { FGAIBallistic* ai_ballistic = new FGAIBallistic(this); ai_list.push_back(ai_ballistic); ai_ballistic->setID( assignID() ); ++numObjects; - ai_ballistic->setAzimuth(azimuth); - ai_ballistic->setElevation(elevation); - ai_ballistic->setSpeed(speed); - ai_ballistic->setPath(path.c_str()); - ai_ballistic->setAltitude(altitude); - ai_ballistic->setLongitude(longitude); - ai_ballistic->setLatitude(latitude); - ai_ballistic->setDragArea(eda); - ai_ballistic->setLife(life); - ai_ballistic->setBuoyancy(buoyancy); - ai_ballistic->setWind_from_east(wind_from_east); - ai_ballistic->setWind_from_north(wind_from_north); - ai_ballistic->setWind(wind); + ai_ballistic->setAzimuth(entity->azimuth); + ai_ballistic->setElevation(entity->elevation); + ai_ballistic->setSpeed(entity->speed); + ai_ballistic->setPath(entity->path); + ai_ballistic->setAltitude(entity->altitude); + ai_ballistic->setLongitude(entity->longitude); + ai_ballistic->setLatitude(entity->latitude); + ai_ballistic->setDragArea(entity->eda); + ai_ballistic->setLife(entity->life); + ai_ballistic->setBuoyancy(entity->buoyancy); + ai_ballistic->setWind_from_east(entity->wind_from_east); + ai_ballistic->setWind_from_north(entity->wind_from_north); + ai_ballistic->setWind(entity->wind); ai_ballistic->init(); ai_ballistic->bind(); return ai_ballistic->getID(); } -int FGAIManager::createStorm( string path, double latitude, double longitude, - double altitude, double heading, double speed ) { +int FGAIManager::createStorm( FGAIModelEntity *entity ) { FGAIStorm* ai_storm = new FGAIStorm(this); ai_list.push_back(ai_storm); ai_storm->setID( assignID() ); ++numObjects; - ai_storm->setHeading(heading); - ai_storm->setSpeed(speed); - ai_storm->setPath(path.c_str()); - ai_storm->setAltitude(altitude); - ai_storm->setLongitude(longitude); - ai_storm->setLatitude(latitude); + ai_storm->setHeading(entity->heading); + ai_storm->setSpeed(entity->speed); + ai_storm->setPath(entity->path); + ai_storm->setAltitude(entity->altitude); + ai_storm->setLongitude(entity->longitude); + ai_storm->setLatitude(entity->latitude); ai_storm->init(); ai_storm->bind(); return ai_storm->getID(); } -int FGAIManager::createThermal( double latitude, double longitude, - double strength, double diameter ) { +int FGAIManager::createThermal( FGAIModelEntity *entity ) { FGAIThermal* ai_thermal = new FGAIThermal(this); ai_list.push_back(ai_thermal); ai_thermal->setID( assignID() ); ++numObjects; - ai_thermal->setLongitude(longitude); - ai_thermal->setLatitude(latitude); - ai_thermal->setMaxStrength(strength); - ai_thermal->setDiameter(diameter / 6076.11549); + ai_thermal->setLongitude(entity->longitude); + ai_thermal->setLatitude(entity->latitude); + ai_thermal->setMaxStrength(entity->strength); + ai_thermal->setDiameter(entity->diameter / 6076.11549); ai_thermal->init(); ai_thermal->bind(); return ai_thermal->getID(); @@ -355,43 +314,30 @@ void FGAIManager::processThermal( FGAIThermal* thermal ) { void FGAIManager::processScenario( string filename ) { FGAIScenario* s = new FGAIScenario( filename ); - FGAIFlightPlan* f; for (int i=0;inEntries();i++) { - FGAIScenario::entry* en = s->getNextEntry(); - f = 0; - if (en) { - if (en->flightplan != ""){ - f = new FGAIFlightPlan( en->flightplan ); - } - if (en->aitype == "aircraft"){ - if (f){ - createAircraft( en->aircraft_class, en->model_path, f ); - } else { - createAircraft( en->aircraft_class, en->model_path, en->latitude, - en->longitude, en->altitude, en->heading, - en->speed, en->roll ); - } - } else if (en->aitype == "ship"){ - if (f){ - createShip( en->model_path, f ); - } else { - createShip( en->model_path, en->latitude, - en->longitude, en->altitude, en->heading, - en->speed, en->rudder ); - } + FGAIModelEntity* en = s->getNextEntry(); - } else if (en->aitype == "storm"){ - createStorm( en->model_path, en->latitude, en->longitude, - en->altitude, en->heading, en->speed ); - } else if (en->aitype == "thermal"){ - createThermal( en->latitude, en->longitude, en->strength, - en->diameter ); - } else if (en->aitype == "ballistic"){ - createBallistic( en->model_path, en->latitude, en->longitude, - en->altitude, en->azimuth, en->elevation, en->speed, - en->eda, en->life, en->buoyancy, en->wind_from_east, - en-> wind_from_north, en->wind); + if (en) { + en->fp = NULL; + if (en->flightplan != ""){ + en->fp = new FGAIFlightPlan( en->flightplan ); + } + + if (en->m_class == "aircraft") { + createAircraft( en ); + + } else if (en->m_class == "ship") { + createShip( en ); + + } else if (en->m_class == "storm") { + createStorm( en ); + + } else if (en->m_class == "thermal") { + createThermal( en ); + + } else if (en->m_class == "ballistic") { + createBallistic( en ); } } } diff --git a/src/AIModel/AIManager.hxx b/src/AIModel/AIManager.hxx index 809efba1e..8433b7ab0 100644 --- a/src/AIModel/AIManager.hxx +++ b/src/AIModel/AIManager.hxx @@ -23,12 +23,15 @@ #ifndef _FG_AIMANAGER_HXX #define _FG_AIMANAGER_HXX -#include -#include
#include -#include "AIBase.hxx" -#include "AIScenario.hxx" -#include "AIFlightPlan.hxx" + +#include + +#include
+ +#include +#include +#include SG_USING_STD(list); class FGAIThermal; @@ -67,70 +70,12 @@ public: int assignID(); void freeID(int ID); - int createAircraft( string model_class, // see FGAIAircraft.hxx for possible classes - string path, // path to exterior model - double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double altitude, // in feet - double heading, // true heading in degrees - double speed, // in knots true airspeed (KTAS) - double roll = 0 ); // in degrees + int createBallistic( FGAIModelEntity *entity ); + int createAircraft( FGAIModelEntity *entity ); + int createThermal( FGAIModelEntity *entity ); + int createStorm( FGAIModelEntity *entity ); + int createShip( FGAIModelEntity *entity ); - int createAircraft( string model_class, // see FGAIAircraft.hxx for possible classes - string path, // path to exterior model - FGAIFlightPlan *flightplan ); - - int createShip( string path, // path to exterior model - double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double altitude, // in feet (ex. for a lake!) - double heading, // true heading in degrees - double speed, // in knots true - double rudder ); // in degrees (right is positive)(0 to 5 works best) - - int createShip( string path, // path to exterior model - FGAIFlightPlan *flightplan ); - - int createBallistic( string path, // path to exterior model - double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double altitude, // in feet - double azimuth, // in degrees (same as heading) - double elevation, // in degrees (same as pitch) - double speed, // in feet per second - double eda, // equivalent drag area, ft2 - double life, // life span in seconds - double buoyancy, // acceleration due to buoyancy feet per second2 - double wind_from_east, // in feet per second - double wind_from_north, // in feet per second - bool wind // val - ); - - int createStorm( string path, // path to exterior model - double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double altitude, // in feet - double heading, // true heading in degrees - double speed ); // in knots true airspeed (KTAS) - - int createThermal( double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double strength, // in feet per second - double diameter ); // in feet - - int createSmoke ( string path, // path to exterior model - double latitude, // in degrees -90 to 90 - double longitude, // in degrees -180 to 180 - double altitude, // in feet - double azimuth, // in degrees (same as heading) - double elevation, // in degrees (same as pitch) - double speed, // in feet per second - double eda, // equivalent drag area, ft2 - double life, // life span in seconds - double buoyancy // acceleration due to buoyancy feet per second2 - ); - - void destroyObject( int ID ); inline double get_user_latitude() { return user_latitude; } @@ -150,7 +95,7 @@ private: bool enabled; int numObjects; SGPropertyNode* root; - SGPropertyNode* wind_from_down; + SGPropertyNode* wind_from_down_node; string scenario_filename; double user_latitude; diff --git a/src/AIModel/AIScenario.cxx b/src/AIModel/AIScenario.cxx index af9c525df..4ad91d66b 100644 --- a/src/AIModel/AIScenario.cxx +++ b/src/AIModel/AIScenario.cxx @@ -17,7 +17,6 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#include "AIScenario.hxx" #include #include #include @@ -26,9 +25,13 @@ # define exception c_exception #endif #include + #include
#include
+#include "AIScenario.hxx" + + FGAIScenario::FGAIScenario(string filename) { @@ -49,13 +52,13 @@ FGAIScenario::FGAIScenario(string filename) SGPropertyNode * node = root.getNode("scenario"); for (i = 0; i < node->nChildren(); i++) { //cout << "Reading entry " << i << endl; - entry* en = new entry; + FGAIModelEntity* en = new FGAIModelEntity; entries.push_back( en ); SGPropertyNode * entry_node = node->getChild(i); en->callsign = entry_node->getStringValue("callsign", "none"); - en->aitype = entry_node->getStringValue("type", "aircraft"); - en->aircraft_class = entry_node->getStringValue("class", "jet_transport"); - en->model_path = entry_node->getStringValue("model", "Models/Geometry/glider.ac"); + en->m_type = entry_node->getStringValue("type", "aircraft"); + en->m_class = entry_node->getStringValue("class", "jet_transport"); + en->path = entry_node->getStringValue("model", "Models/Geometry/glider.ac"); en->flightplan = entry_node->getStringValue("flightplan", ""); en->repeat = entry_node->getDoubleValue("repeat", 0.0); en->latitude = entry_node->getDoubleValue("latitude", 0.0); @@ -88,7 +91,7 @@ FGAIScenario::~FGAIScenario() } -FGAIScenario::entry* +FGAIModelEntity* FGAIScenario::getNextEntry( void ) { if (entries.size() == 0) return 0; diff --git a/src/AIModel/AIScenario.hxx b/src/AIModel/AIScenario.hxx index 5118ddf6e..424b44970 100644 --- a/src/AIModel/AIScenario.hxx +++ b/src/AIModel/AIScenario.hxx @@ -20,8 +20,12 @@ #define _FG_AISCENARIO_HXX #include + #include #include + +#include "AIBase.hxx" + SG_USING_STD(vector); SG_USING_STD(string); @@ -30,41 +34,15 @@ class FGAIScenario { public: - typedef struct { - string callsign; - string aitype; // can be aircraft, ship, storm, thermal, ballistic, smoke - string aircraft_class; - string model_path; - string flightplan; - double repeat; // in seconds - double latitude; // used if no flightplan defined - double longitude; // used if no flightplan defined - double altitude; // used if no flightplan defined - double speed; // used if no flightplan defined - double heading; // used if no flightplan defined - double roll; // used if no flightplan defined - double azimuth; // used by ballistic objects - double elevation; // used by ballistic objects - double rudder; // used by ship objects - double strength; // used by thermal objects - double diameter; // used by thermal objects - double eda; // used by ballistic objects - double life; // life span in seconds - double buoyancy; // acceleration in ft per sec2 - double wind_from_east; // in feet per second - double wind_from_north; // in feet per second - bool wind; - } entry; - FGAIScenario(string filename); ~FGAIScenario(); - entry* getNextEntry( void ); + FGAIModelEntity* getNextEntry( void ); int nEntries( void ); private: - typedef vector entry_vector_type; + typedef vector entry_vector_type; typedef entry_vector_type::iterator entry_vector_iterator; entry_vector_type entries; diff --git a/src/Systems/submodel.cxx b/src/Systems/submodel.cxx index 47c2a2cd7..58f38190f 100644 --- a/src/Systems/submodel.cxx +++ b/src/Systems/submodel.cxx @@ -92,11 +92,23 @@ SubmodelSystem::release (submodel* sm, double dt) transform(sm); //cout << "Creating a submodel." << endl; - int rval = ai->createBallistic( sm->model, IC.lat, IC.lon, IC.alt, IC.azimuth, - IC.elevation, IC.speed, - sm->drag_area, sm->life, - sm->buoyancy, - IC.wind_from_east, IC.wind_from_north, sm->wind); + FGAIModelEntity entity; + + entity.path = sm->model.c_str(); + entity.latitude = IC.lat; + entity.longitude = IC.lon; + entity.altitude = IC.alt; + entity.azimuth = IC.azimuth; + entity.elevation = IC.elevation; + entity.speed = IC.speed; + entity.eda = sm->drag_area; + entity.life = sm->life; + entity.buoyancy = sm->buoyancy; + entity.wind_from_east = IC.wind_from_east; + entity.wind_from_north = IC.wind_from_north; + entity.wind = sm->wind; + int rval = ai->createBallistic( &entity ); + //cout << "Submodel created." << endl; if (sm->count > 0) (sm->count)--; diff --git a/src/Systems/submodel.hxx b/src/Systems/submodel.hxx index 7e8c38188..56e3ac854 100644 --- a/src/Systems/submodel.hxx +++ b/src/Systems/submodel.hxx @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include SG_USING_STD(vector); diff --git a/src/Traffic/Schedule.cxx b/src/Traffic/Schedule.cxx index 89613021b..dbe0e2845 100644 --- a/src/Traffic/Schedule.cxx +++ b/src/Traffic/Schedule.cxx @@ -258,20 +258,20 @@ void FGAISchedule::update(time_t now) string flightPlanName = dep->id + string("-") + arr->id + string(".xml"); - FGAIFlightPlan* f; - f = new FGAIFlightPlan(flightPlanName, - lat, - lon, - i->getCruiseAlt() * 100, // convert from FL to feet - //speed, - 450, - courseToDest, - dep, - arr); + FGAIModelEntity entity; + + entity.m_class = "jet_transport"; + entity.path = modelPath.c_str(); + entity.flightplan = flightPlanName.c_str(); + entity.latitude = lat; + entity.longitude = lon; + entity.altitude = i->getCruiseAlt() * 100; // convert from FL to feet + entity.speed = 450; + entity.fp = new FGAIFlightPlan(&entity, courseToDest, dep, arr); + // Fixme: A non-existent model path results in an // abort, due to an unhandled exeption, in fg main loop. - AIManagerRef = aimgr->createAircraft("jet_transport", - modelPath, f); + AIManagerRef = aimgr->createAircraft( &entity ); //cerr << "Created: " << AIManagerRef << endl; } return; diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index 07f804b2b..dda17c06b 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -53,7 +53,7 @@ #include #include -#include +#include #include #include
// That's pretty ugly, but I need fgFindAirportID