objwriternodevisitor.h

来自「最新osg包」· C头文件 代码 · 共 161 行

H
161
字号
// -*-c++-*-/* * Wavefront OBJ loader for Open Scene Graph * * Copyright (C) 2001 Ulrich Hertlein <u.hertlein@web.de> * * Modified by Robert Osfield to support per Drawable coord, normal and * texture coord arrays, bug fixes, and support for texture mapping. * * Writing support added 2007 by Stephan Huber, http://digitalmind.de,  * some ideas taken from the dae-plugin * * The Open Scene Graph (OSG) is a cross platform C++/OpenGL library for  * real-time rendering of large 3D photo-realistic models.  * The OSG homepage is http://www.openscenegraph.org/ */  #ifndef OBJ_WRITER_NODE_VISITOR_HEADER__ #define OBJ_WRITER_NODE_VISITOR_HEADER__#include <string>#include <stack>#include <sstream>#include <osg/Notify>#include <osg/Node>#include <osg/MatrixTransform>#include <osg/Geode>#include <osg/Geometry>#include <osg/StateSet>#include <osg/Material>#include <osg/Texture2D>#include <osg/TexGen>#include <osg/TexMat>#include <osgDB/Registry>#include <osgDB/ReadFile>#include <osgDB/FileUtils>#include <osgDB/FileNameUtils>#include <map>#include <set>class OBJWriterNodeVisitor: public osg::NodeVisitor {    public:        OBJWriterNodeVisitor(std::ostream& fout, const std::string materialFileName = "") :             osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN),             _fout(fout),             _currentStateSet(new osg::StateSet()),            _lastVertexIndex(1),            _lastNormalIndex(1),            _lastTexIndex(1)        {            _fout << "# file written by OpenSceneGraph" << std::endl << std::endl;                        if (!materialFileName.empty()) {                _fout << "mtllib " << materialFileName << std::endl << std::endl;            }        }                virtual void apply(osg::Geode &node);                        virtual void apply(osg::Group &node)         {            _nameStack.push_back( node.getName().empty() ? node.className() : node.getName() );            _fout << std::endl;            _fout << "g " << getUniqueName() << std::endl;                    osg::NodeVisitor::traverse( node );            _nameStack.pop_back();        }                void traverse (osg::Node &node)        {            pushStateSet(node.getStateSet());            osg::NodeVisitor::traverse( node );            popStateSet(node.getStateSet());        }        void pushStateSet(osg::StateSet* ss)        {          if (NULL!=ss) {            // Save our current stateset            _stateSetStack.push(_currentStateSet.get());                        // merge with node stateset            _currentStateSet = static_cast<osg::StateSet*>(_currentStateSet->clone(osg::CopyOp::SHALLOW_COPY));            _currentStateSet->merge(*ss);              }        }        void popStateSet(osg::StateSet* ss)        {            if (NULL!=ss) {              // restore the previous stateset              _currentStateSet = _stateSetStack.top();              _stateSetStack.pop();            }        }                void writeMaterials(std::ostream& fout);                            class OBJMaterial {            public:                OBJMaterial() {}                OBJMaterial(osg::Material* mat, osg::Texture* tex);                                osg::Vec4  diffuse, ambient, specular;                std::string    image;                std::string name;        };            protected:        struct CompareStateSet        {            bool operator()(const osg::ref_ptr<osg::StateSet>& ss1, const osg::ref_ptr<osg::StateSet>& ss2) const            {                //std::cout << "CompareStateSet: " << ss1->compare(*ss2, false) << " " << ss1 << " " << ss2 << std::endl;                return ss1->compare(*ss2, true) < 0;            }        };        private:                void processGeometry(osg::Geometry* geo, osg::Matrix& m);        void processArray(const std::string& key, osg::Array* array, const osg::Matrix& m = osg::Matrix::identity(), bool isNormal = false);                void processStateSet(osg::StateSet* stateset);        std::string getUniqueName(const std::string& defaultValue = "");                typedef std::stack<osg::ref_ptr<osg::StateSet> > StateSetStack;        typedef std::map< osg::ref_ptr<osg::StateSet>, OBJMaterial, CompareStateSet> MaterialMap;        std::ostream&                            _fout;        std::list<std::string>                    _nameStack;        StateSetStack                            _stateSetStack;        osg::ref_ptr<osg::StateSet>                _currentStateSet;        std::map<std::string, unsigned int>        _nameMap;        unsigned int                            _lastVertexIndex, _lastNormalIndex, _lastTexIndex;        MaterialMap                                _materialMap;        };#endif

⌨️ 快捷键说明

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