⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basedotvisitor.cpp

📁 最新osg包
💻 CPP
字号:
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield  * * This library is open source and may be redistributed and/or modified under   * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  * (at your option) any later version.  The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. *  * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  * OpenSceneGraph Public License for more details.*/#include "BaseDotVisitor.h"#include <fstream>#include <cassert>#include <osg/Node>#include <osg/Geode>#include <osg/Group>using namespace osg;namespace osgDot {  BaseDotVisitor::BaseDotVisitor() {  }  BaseDotVisitor::~BaseDotVisitor() {  }  bool BaseDotVisitor::run( osg::Node& root, std::ostream* fout ) {    setTraversalMode( TRAVERSE_ALL_CHILDREN );    if ( fout && *fout ) {      root.accept( *this );            *fout << "digraph osg_scenegraph { rankdir = LR;" << std::endl;            *fout << _nodes.str() << _edges.str();            *fout << "}" << std::endl;      _nodes.clear();      _edges.clear();      _objectMap.clear();      return true;    }    return false;  }  void BaseDotVisitor::apply(Node& node) {     int id;    if ( getOrCreateId( &node, id ) ) {      handle( node, id );      handleNodeAndTraverse( node, id );    }  }  void BaseDotVisitor::apply(Geode& node) {    int id;    if ( getOrCreateId( &node, id ) ) {      handle( node, id );      handleNodeAndTraverse( node, id );      unsigned int i;      for ( i = 0; i < node.getNumDrawables(); i++ ) {        osg::Drawable* drawable = node.getDrawable( i );        int id2;        if ( getOrCreateId( drawable, id2 ) ) {          handle( *drawable, id2 );          osg::StateSet* s = drawable->getStateSet();          if ( s ) {            int id3;            if ( getOrCreateId( s, id3 ) ) {              handle( *s, id3 );            }            handle( *drawable, *s, id2, id3 );          }        }        handle( node, *drawable, id, id2 );      }    }  }    void BaseDotVisitor::apply(Group& node) {    int id;    if ( getOrCreateId( &node, id ) ) {      handle( node, id );      handleNodeAndTraverse( node, id );      unsigned int i;      for ( i = 0; i < node.getNumChildren(); i++ ) {        osg::Node* child = node.getChild( i );        //handleNodeAndTraverse( *child );        int id2;        getOrCreateId( child, id2 );        handle( node, *child, id, id2 );      }    }      }  void BaseDotVisitor::handle(osg::Node& node, int id) {  }  void BaseDotVisitor::handle(osg::Geode& node, int id) {  }  void BaseDotVisitor::handle(osg::Group& node, int id) {  }  void BaseDotVisitor::handle(osg::Group& parent, osg::Node& child, int parentID, int childID ) {  }  void BaseDotVisitor::handleNodeAndTraverse(osg::Node& node, int id) {    osg::StateSet* ss = node.getStateSet();    if ( ss ) {      int id2;      if ( getOrCreateId( ss, id2 ) ) {        handle( *ss, id2 );      }      handle( node, *ss, id, id2 );    }    traverse(node);  }  void BaseDotVisitor::handle(osg::StateSet& stateset, int id) {  }  void BaseDotVisitor::handle(osg::Node& node, osg::StateSet& stateset, int parentID, int childID) {  }    void BaseDotVisitor::handle(osg::Drawable& drawable, int id) {  }    void BaseDotVisitor::handle(osg::Drawable& drawable, osg::StateSet& stateset, int parentID, int childID ) {  }  void BaseDotVisitor::handle(osg::Geode& geode, osg::Drawable& drawable, int parentID, int childID ) {  }  bool BaseDotVisitor::getOrCreateId( osg::Object* object, int &id ) {    assert( object );    ObjectMap::iterator it = _objectMap.find( object );    if ( it != _objectMap.end() ) {      id = it->second;      return false;    }    id = _objectMap.size();    _objectMap[ object ] = id;    return true;  }} // namespace osgDot

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -