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.