zoukankan      html  css  js  c++  java
  • [osg]节点遍历nodevisitor浅析

    参考:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html

    OSG中节点的访问使用的是一种访问器模式。
    一个典型的访问器涉及抽象访问者角色(Visitor), 具体访问者(Concrete Visitor), 节点角色(Node)。

    OSG中访问者角色为NodeVisitor类,其基本结构如下:

      NodeVisitor(TraversalMode tm)    //构造函数,TraversalMode为节点树的遍历方式
                       //TRAVERSE_NONE, 仅当前节点
                       //TRAVERSE_PARENTS, 向当前节点的父节点遍历
                       //TRAVERSE_ALL_CHILDREN, 向子节点遍历
      void traverse(Node& node)  //向下一个需要访问的节点推进
      void apply(Node& node)   //虚函数,访问各种节点类型,并执行访问器中的自定义操作
      void apply(Group& node)
      void apply(Geode& node)

    NodeVisitor 只是访问器角色的抽象接口,要使用访问器访问节点并执行自定义操作时,需要继承并重写
    apply(……)函数实现自定义功能。osg::Node类中的访问接口为 void accept(NodeVisitor& nv)。对节点
    的访问从节点接受一个访问器开始,将一个具体的访问器对象传递给节点,节点反过来执行访问器的apply(...)
    函数,并将自己传入访问器。可如下简单表示:

    void Node::accept(NodeVisitor& nv)
      {
        nv.apply(*ths) ;
      }

    遍历节点树:

     osg::Node类中有两个辅助函数:
      void ascend(NodeVisitor& nv)     //虚函数,向上一级节点推进访问器
      void traverse(NodeVisitor& nv)   //虚函数,向下一级节点推进访问器
      NodeVisitor的traverse()函数实现如下:
      inline void traverse(Node& node)
          {
                if (_traversalMode == TRAVERSE_PARENTS) 
            node.ascend(*this);
                else if (_traversalMode != TRAVERSE_NONE) 
            node.traverse(*this);
          }


      

  • 相关阅读:
    常见web安全攻防总结
    想使用消息队列,先考虑下这些问题
    Nginx基本属性配置详解
    mysql 数据分析如何实现日报、周报、月报和年报?
    SQL优化
    SQL优化例子
    工厂模式,从第三方登录说起
    最常见 200+ 面试题答案全解析-面试必备
    使用sslsplit嗅探tls/ssl连接
    选择指定图层上的所有实体
  • 原文地址:https://www.cnblogs.com/lyggqm/p/9139528.html
Copyright © 2011-2022 走看看