提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
如果是需要只遍历开启的内容的话,visitor中做mode设置:
setTraversalMode(NodeVisitor::TRAVERSE_ACTIVE_CHILDREN);
参见OSG3.6.5源码:
oid Switch::traverse(NodeVisitor& nv)
{
if (nv.getTraversalMode()==NodeVisitor::TRAVERSE_ACTIVE_CHILDREN)
{
for(unsigned int pos=0;pos<_children.size();++pos)
{
if (_values[pos]) _children[pos]->accept(nv);
}
}
else
{
Group::traverse(nv);
}
}
osg visitor模式的处理如下:
void NodeVisitor::apply(Node& node)
{
traverse(node);
}
inline void NodeVisitor::traverse(Node& node)
{
if (_traversalMode==TRAVERSE_PARENTS) node.ascend(*this);
else if (_traversalMode!=TRAVERSE_NONE) node.traverse(*this);
}
void Node::accept(NodeVisitor& nv)
{
if (nv.validNodeMask(*this))
{
nv.pushOntoNodePath(this);
nv.apply(*this);
nv.popFromNodePath();
}
}
由上述代码可见,
traverse()函数是不同类型osg::Node派生的节点实现的,用于接收visitor后,其符合条件的子节点accept visitor,然后在节点内部会调用nv的apply方法访问自己。
879

被折叠的 条评论
为什么被折叠?



