From: frohlich Date: Mon, 22 Jun 2009 18:54:29 +0000 (+0000) Subject: Remove carrier wire and catapult configuration from the scenario file. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=8f501de78c54dbb16fcdebacb8ed2ee5f2fb49b9;p=flightgear.git Remove carrier wire and catapult configuration from the scenario file. This is now included in the model xml file. So, wires and catapults also work even if they are not loaded by an AICarrier. Modified Files: AICarrier.cxx AICarrier.hxx --- diff --git a/src/AIModel/AICarrier.cxx b/src/AIModel/AICarrier.cxx index 4e98e29ac..6ed0f2d38 100644 --- a/src/AIModel/AICarrier.cxx +++ b/src/AIModel/AICarrier.cxx @@ -25,18 +25,9 @@ #include #include -#include -#include -#include -#include -#include - #include #include #include -#include -#include -#include #include #include
@@ -44,135 +35,6 @@ #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) { } @@ -207,22 +69,8 @@ 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"); // Transform to the right coordinate frame, configuration is done in @@ -387,16 +235,6 @@ 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); - node->accept(carrierVisitor); -} - void FGAICarrier::bind() { FGAIShip::bind(); diff --git a/src/AIModel/AICarrier.hxx b/src/AIModel/AICarrier.hxx index bd7bc405d..2bf64003a 100644 --- a/src/AIModel/AICarrier.hxx +++ b/src/AIModel/AICarrier.hxx @@ -68,7 +68,6 @@ public: bool OutsideBox(); bool init(bool search_in_AI_path=false); - void initModel(osg::Node *node); virtual const char* getTypeString(void) const { return "carrier"; } @@ -99,8 +98,6 @@ private: - list wire_objects; // List of wire object names - list catapult_objects; // List of catapult object names list ppositions; // List of positions where an aircraft can start. string sign; // The sign of this carrier.