1 #ifndef OPENMW_COMPONENTS_SCENEUTIL_VISITOR_H 2 #define OPENMW_COMPONENTS_SCENEUTIL_VISITOR_H 3 4 #include <osg/MatrixTransform> 5 #include <osg/NodeVisitor> 6 7 // Commonly used scene graph visitors 8 namespace SceneUtil 9 { 10 11 // Find a Group by name, case-insensitive 12 // If not found, mFoundNode will be nullptr 13 class FindByNameVisitor : public osg::NodeVisitor 14 { 15 public: FindByNameVisitor(const std::string & nameToFind)16 FindByNameVisitor(const std::string& nameToFind) 17 : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) 18 , mNameToFind(nameToFind) 19 , mFoundNode(nullptr) 20 { 21 } 22 23 void apply(osg::Group& group) override; 24 void apply(osg::MatrixTransform& node) override; 25 void apply(osg::Geometry& node) override; 26 27 bool checkGroup(osg::Group& group); 28 29 std::string mNameToFind; 30 osg::Group* mFoundNode; 31 }; 32 33 class FindByClassVisitor : public osg::NodeVisitor 34 { 35 public: FindByClassVisitor(const std::string & nameToFind)36 FindByClassVisitor(const std::string& nameToFind) 37 : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) 38 , mNameToFind(nameToFind) 39 { 40 } 41 42 void apply(osg::Node &node) override; 43 44 std::string mNameToFind; 45 std::vector<osg::Node *> mFoundNodes; 46 }; 47 48 // Disable freezeOnCull for all visited particlesystems 49 class DisableFreezeOnCullVisitor : public osg::NodeVisitor 50 { 51 public: DisableFreezeOnCullVisitor()52 DisableFreezeOnCullVisitor() 53 : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) 54 { 55 } 56 57 void apply(osg::MatrixTransform& node) override; 58 59 void apply(osg::Drawable& drw) override; 60 }; 61 62 /// Maps names to nodes 63 class NodeMapVisitor : public osg::NodeVisitor 64 { 65 public: 66 typedef std::map<std::string, osg::ref_ptr<osg::MatrixTransform> > NodeMap; 67 NodeMapVisitor(NodeMap & map)68 NodeMapVisitor(NodeMap& map) 69 : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) 70 , mMap(map) 71 { 72 } 73 74 void apply(osg::MatrixTransform& trans) override; 75 76 private: 77 NodeMap& mMap; 78 }; 79 80 /// @brief Base class for visitors that remove nodes from a scene graph. 81 /// Subclasses need to fill the mToRemove vector. 82 /// To use, node->accept(removeVisitor); removeVisitor.remove(); 83 class RemoveVisitor : public osg::NodeVisitor 84 { 85 public: RemoveVisitor()86 RemoveVisitor() 87 : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) 88 { 89 } 90 91 void remove(); 92 93 protected: 94 // <node to remove, parent node to remove it from> 95 typedef std::vector<std::pair<osg::Node*, osg::Group*> > RemoveVec; 96 std::vector<std::pair<osg::Node*, osg::Group*> > mToRemove; 97 }; 98 99 // Removes all drawables from a graph. 100 class CleanObjectRootVisitor : public RemoveVisitor 101 { 102 public: 103 void apply(osg::Drawable& drw) override; 104 void apply(osg::Group& node) override; 105 void apply(osg::MatrixTransform& node) override; 106 void apply(osg::Node& node) override; 107 108 void applyNode(osg::Node& node); 109 void applyDrawable(osg::Node& node); 110 }; 111 112 class RemoveTriBipVisitor : public RemoveVisitor 113 { 114 public: 115 void apply(osg::Drawable& drw) override; 116 void apply(osg::Group& node) override; 117 void apply(osg::MatrixTransform& node) override; 118 119 void applyImpl(osg::Node& node); 120 }; 121 } 122 123 #endif 124