查看: 870|回复: 4

关于NodeVisitor的一个问题有一点不太懂,希望各位大神帮忙解读一下

[复制链接]

该用户从未签到

发表于 2014-3-17 22:14:38 | 显示全部楼层 |阅读模式
1 #include <osg/Node>
2 #include <osgDB/ReadFile>
3 #include <iostream>
4
5  using namespace std;
6
7 class InfoVisitor: public osg::NodeVisitor
8 {
9 public:
10     InfoVisitor()
11         sg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0)
12     {}
13
14     virtual void apply(osg::Node& node)
15     {
16         for(int i = 0; i < _indent; i++)  cout << "    ";
17         cout << "[" << _indent+1 << "]"<< node.libraryName()
18                << "::" << node.className() << endl;
19
20         _indent++;
21         traverse(node);
22         _indent--;
27     }
28
29     virtual void apply(osg::Geode& node)
30     {
31         for(int i = 0; i < _indent; i++)  cout << "    ";
32         cout << "[" << _indent+1 << "] "<< node.libraryName()
33                 << "::" << node.className() << endl;
34
35
36
37         for(unsigned int n = 0; n < node.getNumDrawables(); n++)
38         {
39             osg:rawable* draw = node.getDrawable(n);
40             if(!draw)
41                 continue;
42             for(int i = 0; i <  _indent; i++)  cout << "    ";
43             cout << "[" << _indent << "]" << draw->libraryName() << "::"
44                    << draw->className() << endl;
45         }
            _indent++;
47         traverse(node);
48         _indent--;
53     }
54 private:
55     int _indent;
56 };
57
58 int main(int argc, char** argv)
59 {
60     osg::ArgumentParser  parser(&argc, argv);
61     osg::Node* root = osgDB::readNodeFiles(parser);
62
63     if(!root)
64     {
65         root = osgDB::readNodeFile("avatar.osg");
66     }
67
68     InfoVisitor infoVisitor;
69     if(root)
70     {
71         root->accept(infoVisitor);
72     }
73
74     system("pause");
75     return 0;
76 }
请问执行21行的traverse(node)函数后,是执行22行代码,还是跳到29行 virtual void apply(osg::Geode& node)?执行47行代码后,48行代码会执行吗?望各位大神帮助!

该用户从未签到

发表于 2014-3-17 22:50:17 | 显示全部楼层
好好看下C语言的递归算法就明白了。

该用户从未签到

发表于 2014-3-18 07:21:22 | 显示全部楼层
代码怎么会有?

该用户从未签到

发表于 2014-3-19 16:13:02 | 显示全部楼层
22行执行完后,要看node有没有子节点,如果有的话就会执行29行。
47行会处理node的所有子节点,都处理完后会执行48行。

去学习学习设计模式,访问者模式   就好明白啦。

该用户从未签到

 楼主| 发表于 2014-3-20 10:02:26 | 显示全部楼层
dyq1983 发表于 2014-3-19 16:13
22行执行完后,要看node有没有子节点,如果有的话就会执行29行。
47行会处理node的所有子节点,都处理完后 ...

Thank you!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表