X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAICarrier.cxx;h=fae5d26bc38b91b76ee9028d99b8d091a117ca78;hb=9d995907db00728da7eac9297ecbab93ed8a7400;hp=e522019398fd3a7932152e1d9116fa438fe5e632;hpb=f528fc7154f88eb2810958e84dfd84e85f752ed3;p=flightgear.git diff --git a/src/AIModel/AICarrier.cxx b/src/AIModel/AICarrier.cxx index e52201939..fae5d26bc 100644 --- a/src/AIModel/AICarrier.cxx +++ b/src/AIModel/AICarrier.cxx @@ -25,154 +25,14 @@ #include #include -#include -#include -#include -#include -#include - #include -#include #include -#include -#include -#include #include #include
-#include
#include "AICarrier.hxx" -/// Hmm: move that kind of configuration into the model file??? -class LineCollector : public osg::NodeVisitor { - struct LinePrimitiveFunctor { - LinePrimitiveFunctor() : _lineCollector(0) - { } - void operator() (const osg::Vec3&, bool) - { } - void operator() (const osg::Vec3& v1, const osg::Vec3& v2, bool) - { if (_lineCollector) _lineCollector->addLine(v1, v2); } - void operator() (const osg::Vec3&, const osg::Vec3&, const osg::Vec3&, - bool) - { } - void operator() (const osg::Vec3&, const osg::Vec3&, const osg::Vec3&, - const osg::Vec3&, bool) - { } - LineCollector* _lineCollector; - }; - -public: - LineCollector() : - osg::NodeVisitor(osg::NodeVisitor::NODE_VISITOR, - osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) - { } - virtual void apply(osg::Geode& geode) - { - osg::TemplatePrimitiveFunctor pf; - pf._lineCollector = this; - for (unsigned i = 0; i < geode.getNumDrawables(); ++i) { - geode.getDrawable(i)->accept(pf); - } - } - virtual void apply(osg::Node& node) - { - traverse(node); - } - virtual void apply(osg::Transform& transform) - { - osg::Matrix matrix = _matrix; - if (transform.computeLocalToWorldMatrix(_matrix, this)) - traverse(transform); - _matrix = matrix; - } - - const std::vector& getLineSegments() const - { return _lineSegments; } - - void addLine(const osg::Vec3& v1, const osg::Vec3& v2) - { - // Trick to get the ends in the right order. - // Use the x axis in the original coordinate system. Choose the - // most negative x-axis as the one pointing forward - SGVec3f tv1(_matrix.preMult(v1)); - SGVec3f tv2(_matrix.preMult(v2)); - if (tv1[0] > tv2[0]) - _lineSegments.push_back(SGLineSegmentf(tv1, tv2)); - else - _lineSegments.push_back(SGLineSegmentf(tv2, tv1)); - } - - void addBVHElements(osg::Node& node, simgear::BVHLineGeometry::Type type) - { - if (_lineSegments.empty()) - return; - - SGSceneUserData* userData; - userData = SGSceneUserData::getOrCreateSceneUserData(&node); - - simgear::BVHNode* bvNode = userData->getBVHNode(); - if (!bvNode && _lineSegments.size() == 1) { - simgear::BVHLineGeometry* bvLine; - bvLine = new simgear::BVHLineGeometry(_lineSegments.front(), type); - userData->setBVHNode(bvLine); - return; - } - - simgear::BVHGroup* group = new simgear::BVHGroup; - if (bvNode) - group->addChild(bvNode); - - for (unsigned i = 0; i < _lineSegments.size(); ++i) { - simgear::BVHLineGeometry* bvLine; - bvLine = new simgear::BVHLineGeometry(_lineSegments[i], type); - group->addChild(bvLine); - } - userData->setBVHNode(group); - } - -private: - osg::Matrix _matrix; - std::vector _lineSegments; -}; - -class FGCarrierVisitor : public osg::NodeVisitor { -public: - FGCarrierVisitor(FGAICarrier* carrier, - const std::list& wireObjects, - const std::list& catapultObjects) : - osg::NodeVisitor(osg::NodeVisitor::NODE_VISITOR, - osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), - mWireObjects(wireObjects), - mCatapultObjects(catapultObjects) - { } - virtual void apply(osg::Node& node) - { - if (std::find(mWireObjects.begin(), mWireObjects.end(), node.getName()) - != mWireObjects.end()) { - LineCollector lineCollector; - node.accept(lineCollector); - simgear::BVHLineGeometry::Type type; - type = simgear::BVHLineGeometry::CarrierWire; - lineCollector.addBVHElements(node, type); - } - if (std::find(mCatapultObjects.begin(), mCatapultObjects.end(), - node.getName()) != mCatapultObjects.end()) { - LineCollector lineCollector; - node.accept(lineCollector); - simgear::BVHLineGeometry::Type type; - type = simgear::BVHLineGeometry::CarrierCatapult; - lineCollector.addBVHElements(node, type); - } - - traverse(node); - } - -private: - std::list mWireObjects; - std::list mCatapultObjects; -}; - FGAICarrier::FGAICarrier() : FGAIShip(otCarrier) { } @@ -195,6 +55,9 @@ void FGAICarrier::readFromScenario(SGPropertyNode* scFileNode) { setMaxLong(scFileNode->getDoubleValue("max-long", 0)); setMinLong(scFileNode->getDoubleValue("min-long", 0)); setMPControl(scFileNode->getBoolValue("mp-control", false)); + setAIControl(scFileNode->getBoolValue("ai-control", false)); + setCallSign(scFileNode->getStringValue("callsign", "")); + SGPropertyNode* flols = scFileNode->getChild("flols-pos"); if (flols) { @@ -207,24 +70,10 @@ void FGAICarrier::readFromScenario(SGPropertyNode* scFileNode) { } else flols_off = SGVec3d::zeros(); - std::vector props = scFileNode->getChildren("wire"); + std::vector props = scFileNode->getChildren("parking-pos"); std::vector::const_iterator it; for (it = props.begin(); it != props.end(); ++it) { - std::string s = (*it)->getStringValue(); - if (!s.empty()) - wire_objects.push_back(s); - } - - props = scFileNode->getChildren("catapult"); - for (it = props.begin(); it != props.end(); ++it) { - std::string s = (*it)->getStringValue(); - if (!s.empty()) - catapult_objects.push_back(s); - } - - props = scFileNode->getChildren("parking-pos"); - for (it = props.begin(); it != props.end(); ++it) { - string name = (*it)->getStringValue("name", "unnamed"); + const string name = (*it)->getStringValue("name", "unnamed"); // Transform to the right coordinate frame, configuration is done in // the usual x-back, y-right, z-up coordinates, computations // in the simulation usual body x-forward, y-right, z-down coordinates @@ -273,21 +122,25 @@ void FGAICarrier::setMPControl(bool c) { MPControl = c; } +void FGAICarrier::setAIControl(bool c) { + AIControl = c; +} + void FGAICarrier::update(double dt) { // Now update the position and heading. This will compute new hdg and // roll values required for the rotation speed computation. FGAIShip::update(dt); //automatic turn into wind with a target wind of 25 kts otd - //SG_LOG(SG_GENERAL, SG_ALERT, "AICarrier: MPControl " << MPControl ); - if (!MPControl){ + //SG_LOG(SG_AI, SG_ALERT, "AICarrier: MPControl " << MPControl << " AIControl " << AIControl); + if (!MPControl && AIControl){ if(turn_to_launch_hdg){ TurnToLaunch(); } else if(turn_to_recovery_hdg ){ TurnToRecover(); - } else if(OutsideBox() || returning ) {// check that the carrier is inside - ReturnToBox(); // the operating box, + } else if(OutsideBox() || returning ) {// check that the carrier is inside + ReturnToBox(); // the operating box, } else { TurnToBase(); } @@ -312,7 +165,7 @@ void FGAICarrier::update(double dt) { SGVec3d cartPos = SGVec3d::fromGeod(pos); // The position of the eyepoint - at least near that ... - SGVec3d eyePos(globals->get_current_view()->get_view_pos()); + SGVec3d eyePos(globals->get_view_position_cart()); // Add the position offset of the AIModel to gain the earth // centered position SGVec3d eyeWrtCarrier = eyePos - cartPos; @@ -320,10 +173,10 @@ void FGAICarrier::update(double dt) { eyeWrtCarrier = ec2body.transform(eyeWrtCarrier); // the eyepoints vector wrt the flols position SGVec3d eyeWrtFlols = eyeWrtCarrier - flols_off; - + // the distance from the eyepoint to the flols dist = norm(eyeWrtFlols); - + // now the angle, positive angles are upwards if (fabs(dist) < SGLimits::min()) { angle = 0; @@ -332,7 +185,7 @@ void FGAICarrier::update(double dt) { sAngle = SGMiscd::min(1, SGMiscd::max(-1, sAngle)); angle = SGMiscd::rad2deg(asin(sAngle)); } - + // set the value of source if ( angle <= 4.35 && angle > 4.01 ) source = 1; @@ -376,7 +229,7 @@ bool FGAICarrier::init(bool search_in_AI_path) { base_course = hdg; base_speed = speed; - pos_norm = 0; + pos_norm = raw_pos_norm = 0; elevators = false; transition_time = 150; time_constant = 0.005; @@ -387,79 +240,68 @@ bool FGAICarrier::init(bool search_in_AI_path) { return true; } -void FGAICarrier::initModel(osg::Node *node) -{ - // SG_LOG(SG_GENERAL, SG_BULK, "AICarrier::initModel()" ); - FGAIShip::initModel(node); - // process the 3d model here - // mark some objects solid, mark the wires ... - FGCarrierVisitor carrierVisitor(this, wire_objects, catapult_objects); - model->accept(carrierVisitor); -} - void FGAICarrier::bind() { FGAIShip::bind(); props->untie("velocities/true-airspeed-kt"); - props->tie("controls/flols/source-lights", - SGRawValuePointer(&source)); - props->tie("controls/flols/distance-m", - SGRawValuePointer(&dist)); - props->tie("controls/flols/angle-degs", - SGRawValuePointer(&angle)); - props->tie("controls/turn-to-launch-hdg", - SGRawValuePointer(&turn_to_launch_hdg)); - props->tie("controls/in-to-wind", - SGRawValuePointer(&turn_to_launch_hdg)); - props->tie("controls/base-course-deg", - SGRawValuePointer(&base_course)); - props->tie("controls/base-speed-kts", - SGRawValuePointer(&base_speed)); - props->tie("controls/start-pos-lat-deg", - SGRawValueMethods(pos, &SGGeod::getLatitudeDeg)); - props->tie("controls/start-pos-long-deg", - SGRawValueMethods(pos, &SGGeod::getLongitudeDeg)); - props->tie("controls/mp-control", + tie("controls/flols/source-lights", + SGRawValuePointer(&source)); + tie("controls/flols/distance-m", + SGRawValuePointer(&dist)); + tie("controls/flols/angle-degs", + SGRawValuePointer(&angle)); + tie("controls/turn-to-launch-hdg", + SGRawValuePointer(&turn_to_launch_hdg)); + tie("controls/in-to-wind", + SGRawValuePointer(&turn_to_launch_hdg)); + tie("controls/base-course-deg", + SGRawValuePointer(&base_course)); + tie("controls/base-speed-kts", + SGRawValuePointer(&base_speed)); + tie("controls/start-pos-lat-deg", + SGRawValueMethods(pos, &SGGeod::getLatitudeDeg)); + tie("controls/start-pos-long-deg", + SGRawValueMethods(pos, &SGGeod::getLongitudeDeg)); + tie("controls/mp-control", SGRawValuePointer(&MPControl)); - props->tie("velocities/speed-kts", - SGRawValuePointer(&speed)); - props->tie("environment/surface-wind-speed-true-kts", - SGRawValuePointer(&wind_speed_kts)); - props->tie("environment/surface-wind-from-true-degs", - SGRawValuePointer(&wind_from_deg)); - props->tie("environment/rel-wind-from-degs", - SGRawValuePointer(&rel_wind_from_deg)); - props->tie("environment/rel-wind-from-carrier-hdg-degs", - SGRawValuePointer(&rel_wind)); - props->tie("environment/rel-wind-speed-kts", - SGRawValuePointer(&rel_wind_speed_kts)); - props->tie("environment/in-to-wind", + tie("controls/ai-control", + SGRawValuePointer(&AIControl)); + tie("environment/surface-wind-speed-true-kts", + SGRawValuePointer(&wind_speed_kts)); + tie("environment/surface-wind-from-true-degs", + SGRawValuePointer(&wind_from_deg)); + tie("environment/rel-wind-from-degs", + SGRawValuePointer(&rel_wind_from_deg)); + tie("environment/rel-wind-from-carrier-hdg-degs", + SGRawValuePointer(&rel_wind)); + tie("environment/rel-wind-speed-kts", + SGRawValuePointer(&rel_wind_speed_kts)); + tie("environment/in-to-wind", SGRawValuePointer(&in_to_wind)); - props->tie("controls/flols/wave-off-lights", - SGRawValuePointer(&wave_off_lights)); - props->tie("controls/elevators", - SGRawValuePointer(&elevators)); - props->tie("surface-positions/elevators-pos-norm", - SGRawValuePointer(&pos_norm)); - props->tie("controls/constants/elevators/trans-time-s", - SGRawValuePointer(&transition_time)); - props->tie("controls/constants/elevators/time-constant", - SGRawValuePointer(&time_constant)); - props->tie("controls/jbd", + //tie("controls/flols/wave-off-lights", + // SGRawValuePointer(&wave_off_lights)); + tie("controls/elevators", + SGRawValuePointer(&elevators)); + tie("surface-positions/elevators-pos-norm", + SGRawValuePointer(&pos_norm)); + tie("controls/constants/elevators/trans-time-s", + SGRawValuePointer(&transition_time)); + tie("controls/constants/elevators/time-constant", + SGRawValuePointer(&time_constant)); + tie("controls/jbd", SGRawValuePointer(&jbd)); - props->tie("surface-positions/jbd-pos-norm", + tie("surface-positions/jbd-pos-norm", SGRawValuePointer(&jbd_pos_norm)); - props->tie("controls/constants/jbd/trans-time-s", + tie("controls/constants/jbd/trans-time-s", SGRawValuePointer(&jbd_transition_time)); - props->tie("controls/constants/jbd/time-constant", + tie("controls/constants/jbd/time-constant", SGRawValuePointer(&jbd_time_constant)); - props->tie("controls/turn-to-recovery-hdg", + tie("controls/turn-to-recovery-hdg", SGRawValuePointer(&turn_to_recovery_hdg)); - props->tie("controls/turn-to-base-course", + tie("controls/turn-to-base-course", SGRawValuePointer(&turn_to_base_course)); - props->setBoolValue("controls/flols/cut-lights", false); props->setBoolValue("controls/flols/wave-off-lights", false); props->setBoolValue("controls/flols/cond-datum-lights", true); @@ -470,36 +312,6 @@ void FGAICarrier::bind() { props->setDoubleValue("controls/lighting/flood-lights-red-norm", 0); } - -void FGAICarrier::unbind() { - FGAIShip::unbind(); - - props->untie("velocities/true-airspeed-kt"); - props->untie("controls/flols/source-lights"); - props->untie("controls/flols/distance-m"); - props->untie("controls/flols/angle-degs"); - props->untie("controls/turn-to-launch-hdg"); - props->untie("velocities/speed-kts"); - props->untie("environment/wind-speed-true-kts"); - props->untie("environment/wind-from-true-degs"); - props->untie("environment/rel-wind-from-degs"); - props->untie("environment/rel-wind-speed-kts"); - props->untie("environment/in-to-wind"); - props->untie("controls/flols/wave-off-lights"); - props->untie("controls/elevators"); - props->untie("surface-positions/elevators-pos-norm"); - props->untie("controls/constants/elevators/trans-time-secs"); - props->untie("controls/constants/elevators/time-constant"); - props->untie("controls/jbd"); - props->untie("surface-positions/jbd/pos-norm"); - props->untie("controls/constants/jbd/trans-time-s"); - props->untie("controls/jbd-time-constant"); - props->untie("controls/mp-control"); - props->untie("controls/turn-to-recovery-hdg"); - props->untie("controls/turn-to-base-course"); -} - - bool FGAICarrier::getParkPosition(const string& id, SGGeod& geodPos, double& hdng, SGVec3d& uvw) { @@ -556,11 +368,14 @@ void FGAICarrier::UpdateWind( double dt) { rel_wind = rel_wind_from_deg - hdg; SG_NORMALIZE_RANGE(rel_wind, -180.0, 180.0); + //set in to wind property + InToWind(); + //switch the wave-off lights - if (InToWind()) - wave_off_lights = false; - else - wave_off_lights = true; + //if (InToWind()) + // wave_off_lights = false; + //else + // wave_off_lights = true; // cout << "rel wind: " << rel_wind << endl; @@ -595,12 +410,12 @@ void FGAICarrier::TurnToRecover(){ if (wind_speed_kts < 3){ tgt_heading = base_course + 60; } else if (rel_wind < -9 && rel_wind >= -180){ - tgt_heading = wind_from_deg; + tgt_heading = wind_from_deg; } else if (rel_wind > -7 && rel_wind < 45){ tgt_heading = wind_from_deg + 60; } else if (rel_wind >=45 && rel_wind < 180){ tgt_heading = wind_from_deg + 45; - } else + } else tgt_heading = hdg; SG_NORMALIZE_RANGE(tgt_heading, 0.0, 360.0); @@ -648,7 +463,7 @@ void FGAICarrier::ReturnToBox(){ bool FGAICarrier::OutsideBox() { //returns true if the carrier is outside operating box if ( max_lat == 0 && min_lat == 0 && max_long == 0 && min_long == 0) { - SG_LOG(SG_GENERAL, SG_DEBUG, "AICarrier: No Operating Box defined" ); + SG_LOG(SG_AI, SG_DEBUG, "AICarrier: No Operating Box defined" ); return false; } @@ -682,7 +497,6 @@ bool FGAICarrier::OutsideBox() { //returns true if the carrier is outside operat return true; } - SG_LOG(SG_GENERAL, SG_DEBUG, "AICarrier: Inside Operating Box" ); return false; } // end OutsideBox @@ -734,7 +548,7 @@ void FGAICarrier::UpdateElevator(double dt, double transition_time) { void FGAICarrier::UpdateJBD(double dt, double jbd_transition_time) { - string launchbar_state = _launchbar_state_node->getStringValue(); + const string launchbar_state = _launchbar_state_node->getStringValue(); double step = 0; if (launchbar_state == "Engaged"){