X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIEscort.cxx;h=9a816675597d88283aad6a25b43bb5b28472840c;hb=9d995907db00728da7eac9297ecbab93ed8a7400;hp=80ef3232579af69fa89973d241c883a3f21aab7a;hpb=3922c121631a159d911a96353aad06a3d8896769;p=flightgear.git diff --git a/src/AIModel/AIEscort.cxx b/src/AIModel/AIEscort.cxx index 80ef32325..9a8166755 100644 --- a/src/AIModel/AIEscort.cxx +++ b/src/AIModel/AIEscort.cxx @@ -27,35 +27,34 @@ #include #include -#include #include +#include #include #include
-#include
+#include #include -#include #include "AIEscort.hxx" +using std::string; + FGAIEscort::FGAIEscort() : FGAIShip(otEscort), -_selected_ac(0), _relbrg (0), -_stn_truebrg(0), _parent_speed(0), -_stn_limit(0), -_stn_angle_limit(0), -_stn_speed(0), +_interval(0), +_stn_truebrg(0), _stn_height(0), +_stn_speed(0), +_stn_angle_limit(0), +_stn_limit(0), _max_speed(0), -_interval(0), _MPControl(false), _patrol(false), -_stn_deg_true(false), -_parent("") +_stn_deg_true(false) { invisible = false; @@ -92,60 +91,53 @@ void FGAIEscort::readFromScenario(SGPropertyNode* scFileNode) { void FGAIEscort::bind() { FGAIShip::bind(); - props->tie("station/rel-bearing-deg", + tie("station/rel-bearing-deg", SGRawValuePointer(&_stn_relbrg)); - props->tie("station/true-bearing-deg", + tie("station/true-bearing-deg", SGRawValuePointer(&_stn_truebrg)); - props->tie("station/range-nm", + tie("station/range-nm", SGRawValuePointer(&_stn_range)); - props->tie("station/range-limit-nm", + tie("station/range-limit-nm", SGRawValuePointer(&_stn_limit)); - props->tie("station/angle-limit-deg", + tie("station/angle-limit-deg", SGRawValuePointer(&_stn_angle_limit)); - props->tie("station/speed-kts", + tie("station/speed-kts", SGRawValuePointer(&_stn_speed)); - props->tie("station/height-ft", + tie("station/height-ft", SGRawValuePointer(&_stn_height)); - props->tie("controls/update-interval-sec", + tie("controls/update-interval-sec", SGRawValuePointer(&_interval)); - props->tie("controls/parent-mp-control", + tie("controls/parent-mp-control", SGRawValuePointer(&_MPControl)); - props->tie("station/target-range-nm", + tie("station/target-range-nm", SGRawValuePointer(&_tgtrange)); - props->tie("station/target-brg-deg-t", + tie("station/target-brg-deg-t", SGRawValuePointer(&_tgtbrg)); - props->tie("station/patrol", + tie("station/patrol", SGRawValuePointer(&_patrol)); } -void FGAIEscort::unbind() { - FGAIShip::unbind(); - - props->untie("station/rel-bearing-deg"); - props->untie("station/true-bearing-deg"); - props->untie("station/range-nm"); - props->untie("station/range-limit-nm"); - props->untie("station/angle-limit-deg"); - props->untie("station/speed-kts"); - props->untie("station/height-ft"); - props->untie("controls/update-interval-sec"); - -} - bool FGAIEscort::init(bool search_in_AI_path) { if (!FGAIShip::init(search_in_AI_path)) return false; + reinit(); + return true; +} +void FGAIEscort::reinit() { invisible = false; no_roll = false; props->setStringValue("controls/parent-name", _parent.c_str()); - setParent(); - pos = _tgtpos; - speed = _parent_speed; - hdg = _parent_hdg; - return true; + if (setParentNode()){ + setParent(); + pos = _tgtpos; + speed = _parent_speed; + hdg = _parent_hdg; + } + + FGAIShip::reinit(); } void FGAIEscort::update(double dt) { @@ -194,21 +186,19 @@ void FGAIEscort::setStnPatrol(bool p) { _patrol = p; } -void FGAIEscort::setParentName(const string& p) { - _parent = p; -} - bool FGAIEscort::getGroundElev(SGGeod inpos) { double height_m ; - if (globals->get_scenery()->get_elevation_m(SGGeod::fromGeodM(inpos, 3000), height_m, &_material,0)){ + const simgear::BVHMaterial* mat = 0; + if (globals->get_scenery()->get_elevation_m(SGGeod::fromGeodM(inpos, 3000), height_m, &mat, 0)){ + const SGMaterial* material = dynamic_cast(mat); _ht_agl_ft = inpos.getElevationFt() - height_m * SG_METER_TO_FEET; - if (_material) { - const vector& names = _material->get_names(); + if (material) { + const std::vector& names = material->get_names(); - _solid = _material->get_solid(); + _solid = material->get_solid(); if (!names.empty()) props->setStringValue("material/name", names[0].c_str()); @@ -231,75 +221,41 @@ bool FGAIEscort::getGroundElev(SGGeod inpos) { } -void FGAIEscort::setParent() { - - const SGPropertyNode *ai = fgGetNode("/ai/models", true); - - for (int i = ai->nChildren() - 1; i >= -1; i--) { - const SGPropertyNode *model; - - if (i < 0) { // last iteration: selected model - model = _selected_ac; - } else { - model = ai->getChild(i); - string path = ai->getPath(); - const string name = model->getStringValue("name"); - - if (!model->nChildren()){ - continue; - } - if (name == _parent) { - _selected_ac = model; // save selected model for last iteration - break; - } - - } - if (!model) - continue; - - }// end for loop - - if (_selected_ac != 0){ - const string name = _selected_ac->getStringValue("name"); - double lat = _selected_ac->getDoubleValue("position/latitude-deg"); - double lon = _selected_ac->getDoubleValue("position/longitude-deg"); - double elevation = _selected_ac->getDoubleValue("position/altitude-ft"); - _MPControl = _selected_ac->getBoolValue("controls/mp-control"); - - _selectedpos.setLatitudeDeg(lat); - _selectedpos.setLongitudeDeg(lon); - _selectedpos.setElevationFt(elevation); - - _parent_speed = _selected_ac->getDoubleValue("velocities/speed-kts"); - _parent_hdg = _selected_ac->getDoubleValue("orientation/true-heading-deg"); - - if(!_stn_deg_true){ - _stn_truebrg = calcTrueBearingDeg(_stn_brg, _parent_hdg); - _stn_relbrg = _stn_brg; - //cout << _name <<" set rel"<getDoubleValue("position/latitude-deg"); + double lon = _selected_ac->getDoubleValue("position/longitude-deg"); + double elevation = _selected_ac->getDoubleValue("position/altitude-ft"); + _MPControl = _selected_ac->getBoolValue("controls/mp-control"); + + _selectedpos.setLatitudeDeg(lat); + _selectedpos.setLongitudeDeg(lon); + _selectedpos.setElevationFt(elevation); + + _parent_speed = _selected_ac->getDoubleValue("velocities/speed-kts"); + _parent_hdg = _selected_ac->getDoubleValue("orientation/true-heading-deg"); + + if(!_stn_deg_true){ + _stn_truebrg = calcTrueBearingDeg(_stn_brg, _parent_hdg); + _stn_relbrg = _stn_brg; + //cout << _name <<" set rel"<getDoubleValue("orientation/true-heading-deg"); double pitch = _selected_ac->getDoubleValue("orientation/pitch-deg"); @@ -364,7 +306,7 @@ void FGAIEscort::setStationSpeed(){ // these are the AI rules for the manoeuvring of escorts if (_MPControl && _tgtrange > 4 * _stn_limit){ - SG_LOG(SG_GENERAL, SG_ALERT, "AIEscort: " << _name + SG_LOG(SG_AI, SG_ALERT, "AIEscort: " << _name << " re-aligning to MP pos"); pos = _tgtpos; speed = 0; @@ -432,10 +374,9 @@ void FGAIEscort::RunEscort(double dt){ setParent(); setStationSpeed(); - //getGroundElev(pos); _dt_count = 0; } -// end AIGroundvehicle +// end AIEscort