zoukankan      html  css  js  c++  java
  • OSG节点访问和遍历

    遍历节点树:
    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);
        }
    }
    #include <osg/Node>
    #include <osgDB/ReadFile>
    #include <iostream>
    
    using namespace std;
    
    class InfoVisitor: public osg::NodeVisitor
    {
    public:
        InfoVisitor()
            :osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0)
        {}
    
        virtual void apply(osg::Node& node)
        {
            for(int i = 0; i < _indent; i++)  cout << "    ";
            cout << "[" << _indent << "]"<< node.libraryName()
                   << "::" << node.className() << endl;
    
            _indent++;
            traverse(node);
            _indent--;
    
           for(int i = 0; i < _indent; i++)  cout << "    ";
            cout << "[" << _indent << "] "<< node.libraryName()
                   << "::" << node.className() << endl;
        }
    
        virtual void apply(osg::Geode& node)
        {
            for(int i = 0; i < _indent; i++)  cout << "    ";
            cout << "[" << _indent << "] "<< node.libraryName()
                    << "::" << node.className() << endl;
    
            _indent++;
    
            for(unsigned int n = 0; n < node.getNumDrawables(); n++)
            {
                osg::Drawable* draw = node.getDrawable(n);
                if(!draw)
                    continue;
                for(int i = 0; i <  _indent; i++)  cout << "    ";
                cout << "[" << _indent << "]" << draw->libraryName() << "::" 
                       << draw->className() << endl;
            }
    
            traverse(node);
            _indent--;
    
            for(int i = 0; i < _indent; i++)  cout << "    ";
            cout << "[" << _indent << "]"<< node.libraryName()
                    << "::" << node.className() << endl;
        }
    private:
        int _indent;
    };
    
    int main(int argc, char** argv)
    {
        osg::ArgumentParser  parser(&argc, argv);
        osg::Node* root = osgDB::readNodeFiles(parser);
    
        if(!root)
        {
            root = osgDB::readNodeFile("avatar.osg");
        }
    
        InfoVisitor infoVisitor;
        if(root)
        {
            root->accept(infoVisitor);
        }
    
        system("pause");
        return 0;
    }

    转自:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html

  • 相关阅读:
    类别的三个作用
    require()
    commonJS
    ng-app&data-ng-app
    《css网站布局实录》(李超)——读书札记
    高性能JS(读书札记)
    两个同级div重叠的情况
    前端性能优化
    正则表达式
    ajax
  • 原文地址:https://www.cnblogs.com/herd/p/11216675.html
Copyright © 2011-2022 走看看