00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00029
00030 #ifndef _3D_FIND_NODE_VISITOR_H
00031 #define _3D_FIND_NODE_VISITOR_H
00032
00033 #include <osg/Node>
00034 #include <osg/NodeVisitor>
00035
00036
00039 class FindNamedNodeVisitor : public osg::NodeVisitor {
00040 public:
00041 FindNamedNodeVisitor(std::string strName, TraversalMode tm=TRAVERSE_ALL_CHILDREN) : NodeVisitor(tm), strName(strName), pResult(NULL) {}
00042 virtual void reset() { pResult = NULL; }
00043
00044 virtual void apply(osg::Node & node) {
00045 if (node.getName() == strName) { pResult = &node; setTraversalMode(TRAVERSE_NONE); }
00046 else traverse(node);
00047 }
00048
00049 osg::Node * pResult;
00050
00051 protected:
00052 const std::string strName;
00053 };
00054
00055
00057 inline osg::Node * FindNamedNode(std::string strName, osg::Node * pRoot) {
00058 FindNamedNodeVisitor v(strName);
00059 pRoot->accept(v);
00060 return v.pResult;
00061 }
00062
00063
00064
00065
00068 template <class T>
00069 class FindTypedNodeVisitor : public osg::NodeVisitor {
00070 public:
00071 FindTypedNodeVisitor(TraversalMode tm=TRAVERSE_ALL_CHILDREN) : osg::NodeVisitor(tm), pResult(NULL) {}
00072 virtual void reset() { pResult = NULL; }
00073
00074 virtual void apply(T & node) { pResult = &node; setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE); }
00075
00076 T * pResult;
00077 };
00078
00079
00081 template <class T>
00082 inline T * FindTypedNode(osg::Node * pRoot) {
00083 FindTypedNodeVisitor<T> v;
00084 pRoot->accept(v);
00085 return v.pResult;
00086 }
00087
00088
00089 #endif // _3D_FIND_NODE_VISITOR_H