查看: 1324|回复: 3

NodeVisitor类中的 traverse(Node& node)的含义是什么?

[复制链接]

该用户从未签到

发表于 2014-5-4 11:06:37 | 显示全部楼层 |阅读模式
        inline void traverse(Node& node)
        {
            if (_traversalMode==TRAVERSE_PARENTS) node.ascend(*this);
            else if (_traversalMode!=TRAVERSE_NONE) node.traverse(*this);
        }
没看懂这个源代码,望不吝赐教~

该用户从未签到

 楼主| 发表于 2014-5-4 11:08:22 | 显示全部楼层
如果可以,希望尽量描述的详细点~

该用户从未签到

发表于 2014-5-4 16:04:57 | 显示全部楼层
节点遍历inline void traverse(Node& node)
        {
            if (_traversalMode==TRAVERSE_PARENTS) node.ascend(*this);
            else if (_traversalMode!=TRAVERSE_NONE) node.traverse(*this);
        }
只说node.traverse(*this)往子节点遍历:node是基类指针,traverse是虚函数,所以node.traverse(*this)会调用派生类即void Group::traverse(NodeVisitor& nv),而
void Group::traverse(NodeVisitor& nv)
{
    for(NodeList::iterator itr=_children.begin();
        itr!=_children.end();
        ++itr)
    {
        (*itr)->accept(nv);//每个子节点
    }
}


void Node::accept(NodeVisitor& nv)
{
    if (nv.validNodeMask(*this))
    {
        nv.pushOntoNodePath(this);
        nv.apply(*this);
        nv.popFromNodePath();
    }
}

所以最终都nv.apply(*this)即执行nodevisitor对应节点的apply()函数,并且apply()一定要添加traverse(node),即继续往当前子节点的子节点遍历。

该用户从未签到

 楼主| 发表于 2014-5-4 16:35:03 | 显示全部楼层
buaahc 发表于 2014-5-4 16:04
节点遍历inline void traverse(Node& node)
        {
            if (_traversalMode==TRAVERSE_PARENT ...

“只说node.traverse(*this)往子节点遍历:node是基类指针,traverse是虚函数,所以node.traverse(*this)会调用派生类即void Group::traverse(NodeVisitor& nv),”
不愧是大师,一语中的,我之前一直纠结osg::Node类的源代码中该函数里啥也没有:
class Node
{
virtual void traverse(NodeVisitor& /*nv*/) {}
}
现在明白了,原来是调用其派生类Group类中的覆盖函数。

非常感谢~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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