-class FGCarrierVisitor : public osg::NodeVisitor {
-public:
- FGCarrierVisitor(FGAICarrier* carrier,
- const std::list<std::string>& wireObjects,
- const std::list<std::string>& catapultObjects,
- const std::list<std::string>& solidObjects) :
- osg::NodeVisitor(osg::NodeVisitor::NODE_VISITOR,
- osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),
- mWireObjects(wireObjects),
- mCatapultObjects(catapultObjects),
- mSolidObjects(solidObjects),
- mFoundHot(false),
- mCarrier(carrier)
- { }
- virtual void apply(osg::Node& node)
- {
- osg::ref_ptr<osg::Referenced> oldUserData = mUserData;
- bool oldFoundHot = mFoundHot;
- mFoundHot = false;
-
- if (std::find(mWireObjects.begin(), mWireObjects.end(), node.getName())
- != mWireObjects.end()) {
- mFoundHot = true;
- mUserData = FGAICarrierHardware::newWire(mCarrier);
- }
- if (std::find(mCatapultObjects.begin(), mCatapultObjects.end(), node.getName())
- != mCatapultObjects.end()) {
- mFoundHot = true;
- mUserData = FGAICarrierHardware::newCatapult(mCarrier);
- }
- if (std::find(mSolidObjects.begin(), mSolidObjects.end(), node.getName())
- != mSolidObjects.end()) {
- mFoundHot = true;
- mUserData = FGAICarrierHardware::newSolid(mCarrier);
- //SG_LOG(SG_GENERAL, SG_ALERT, "AICarrierVisitor::apply() solidObject" );
- }
- node.setUserData(mUserData.get());
-
- traverse(node);
-
- mFoundHot = oldFoundHot || mFoundHot;
-
- if (mFoundHot) {
- node.setNodeMask(node.getNodeMask() | SG_NODEMASK_TERRAIN_BIT);
- } else
- node.setNodeMask(node.getNodeMask() & ~SG_NODEMASK_TERRAIN_BIT);
-
- mUserData = oldUserData;
- }
-
-private:
- std::list<std::string> mWireObjects;
- std::list<std::string> mCatapultObjects;
- std::list<std::string> mSolidObjects;
- bool mFoundHot;
- FGAICarrier* mCarrier;
- osg::ref_ptr<osg::Referenced> mUserData;
-};
-