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