X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATC%2FAIMgr.cxx;h=629d5d97b09f1d4db7c36233c7c64d5a93d011ec;hb=68f248879cb15562c7b026445f83caf8f2842ae9;hp=8f23a5507aa89e6336f5811e3fc9066bf663cef9;hpb=0bea768f245a76d15ae983f52fed8209b72b5cd9;p=flightgear.git diff --git a/src/ATC/AIMgr.cxx b/src/ATC/AIMgr.cxx index 8f23a5507..629d5d97b 100644 --- a/src/ATC/AIMgr.cxx +++ b/src/ATC/AIMgr.cxx @@ -53,9 +53,12 @@ FGAIMgr::FGAIMgr() { // TODO - use the proper user callsign when it becomes user settable. removalList.clear(); activated.clear(); + _havePiperModel = true; } FGAIMgr::~FGAIMgr() { + _defaultModel->deRef(); + if(_havePiperModel) _piperModel->deRef(); } void FGAIMgr::init() { @@ -72,17 +75,40 @@ void FGAIMgr::init() { // Load up models at the start to avoid pausing later // Hack alert - Hardwired paths!! - string planepath = "Aircraft/c172/Models/c172-dpm.ac"; - _defaultModel = sgLoad3DModel( globals->get_fg_root(), - planepath.c_str(), - globals->get_props(), - globals->get_sim_time_sec() ); + string planepath = "Aircraft/c172r/Models/c172-dpm.ac"; + bool _loadedDefaultOK = true; + try { + _defaultModel = sgLoad3DModel( globals->get_fg_root(), + planepath.c_str(), + globals->get_props(), + globals->get_sim_time_sec() ); + } catch(sg_exception& e) { + _loadedDefaultOK = false; + } + + if(!_loadedDefaultOK ) { + // Just load the same 3D model as the default user plane - that's *bound* to exist! + // TODO - implement robust determination of availability of GA AI aircraft models + planepath = "Aircraft/c172p/Models/c172p.ac"; + _defaultModel = sgLoad3DModel( globals->get_fg_root(), + planepath.c_str(), + globals->get_props(), + globals->get_sim_time_sec() ); + } planepath = "Aircraft/pa28-161/Models/pa28-161.ac"; - _piperModel = sgLoad3DModel( globals->get_fg_root(), - planepath.c_str(), - globals->get_props(), - globals->get_sim_time_sec() ); + try { + _piperModel = sgLoad3DModel( globals->get_fg_root(), + planepath.c_str(), + globals->get_props(), + globals->get_sim_time_sec() ); + } catch(sg_exception& e) { + _havePiperModel = false; + } + + // We need to keep one ref of the models open to stop ssg deleting them behind our back! + _defaultModel->ref(); + if(_havePiperModel) _piperModel->ref(); // go through the $FG_ROOT/ATC directory and find all *.taxi files SGPath path(globals->get_fg_root()); @@ -107,7 +133,7 @@ void FGAIMgr::init() { f_ident = file.substr(0, pos); FGAirport a; if(dclFindAirportID(f_ident, &a)) { - SGBucket sgb(a.longitude, a.latitude); + SGBucket sgb(a.getLongitude(), a.getLatitude()); int idx = sgb.gen_index(); if(facilities.find(idx) != facilities.end()) { facilities[idx]->push_back(f_ident); @@ -327,13 +353,13 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) { bool cessna = true; // Get the time and only operate VFR in the (approximate) daytime. - //SGTime *t = globals->get_time_params(); - string time_str = fgGetString("sim/time/gmt-string"); - int loc_time = atoi((time_str.substr(0,3)).c_str()); - //cout << "gmt_time = " << loc_time << '\n'; - loc_time += (int)((aptpos.lon() / 360.0) * 24.0); - while(loc_time < 0) loc_time += 24; - while(loc_time > 24) loc_time -= 24; + struct tm *t = globals->get_time_params()->getGmt(); + int loc_time = t->tm_hour + int(aptpos.lon() / (360.0 / 24.0)); + while (loc_time < 0) + loc_time += 24; + while (loc_time >= 24) + loc_time -= 24; + //cout << "loc_time = " << loc_time << '\n'; if(loc_time < 7 || loc_time > 19) return; @@ -442,7 +468,7 @@ void FGAIMgr::GenerateSimpleAirportTraffic(string ident, double min_dist) { else cessna = true; string s = GenerateShortForm(GenerateUniqueCallsign(), (cessna ? "Cessna-" : "Piper-")); FGAIGAVFRTraffic* t = new FGAIGAVFRTraffic(); - t->SetModel(cessna ? _defaultModel : _piperModel); + t->SetModel(cessna ? _defaultModel : (_havePiperModel ? _piperModel : _defaultModel)); //cout << "Generating VFR traffic " << s << " inbound to " << ident << " " << ad << " meters out from " << dir << " degrees\n"; Point3D tpos = dclUpdatePosition(aptpos, dir, 6.0, ad); if(tpos.elev() > (aptpos.elev() + 3000.0)) tpos.setelev(aptpos.elev() + 3000.0); // FEET yuk :-(