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

📄 daewriter.h

📁 最新osg包
💻 H
字号:
/* * Copyright 2006 Sony Computer Entertainment Inc. * * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this  * file except in compliance with the License. You may obtain a copy of the License at: * http://research.scea.com/scea_shared_source_license.html * * Unless required by applicable law or agreed to in writing, software distributed under the License  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  * implied. See the License for the specific language governing permissions and limitations under the  * License.  */#ifndef _DAE_WRITER_H_#define _DAE_WRITER_H_#include <map>#include <stack>#include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/LightSource>#include <osg/Camera>#include <osg/Material>#include <osg/MatrixTransform>#include <osg/PositionAttitudeTransform>#include <osg/Switch>#include <osg/StateSet>#include <osg/LOD>#include <osg/ProxyNode>#include <osg/CoordinateSystemNode>#include <osg/BlendColor>#include <osg/BlendFunc>#include <osg/Notify>#include <osg/NodeVisitor>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/Registry>#include <dae.h>#include <dae/daeDocument.h>class domCOLLADA;class domGeometry;class domInstance_geometry;class domLibrary_cameras;class domLibrary_effects;class domLibrary_geometries;class domLibrary_lights;class domLibrary_materials;class domLibrary_visual_scenes;class domMaterial;class domMesh;class domNode;class domSource;class domVisual_scene;class domP;namespace osgdae {  /**@class daeWriter@brief Write a OSG scene into a DAE file */ class daeWriter : public osg::NodeVisitor{protected:    class ArrayNIndices;public:    enum NodeType { NODE, GEODE, GROUP, LIGHT, CAMERA, MATRIX, POSATT, SWITCH, LOD };    daeWriter( DAE *dae_, const std::string &fileURI, bool usePolygons=false, bool GoogleMode = false );    virtual ~daeWriter();    void setRootNode( const osg::Node &node );    bool isSuccess() { return success; }    bool writeFile();    virtual void    apply( osg::Node &node );    virtual void    apply( osg::Geode &node );    virtual void    apply( osg::Group &node );    virtual void    apply( osg::LightSource &node );    virtual void    apply( osg::Camera &node );    virtual void    apply( osg::MatrixTransform &node );    virtual void    apply( osg::PositionAttitudeTransform &node );    virtual void    apply( osg::Switch &node );    virtual void    apply( osg::LOD &node );    //virtual void  apply( osg::Billboard &node);    virtual void    apply( osg::ProxyNode &node );    //virtual void  apply( osg::Projection &node)    virtual void    apply( osg::CoordinateSystemNode &node );    //virtual void  apply( osg::ClipNode &node)    //virtual void  apply( osg::TexGenNode &node)    virtual void    apply( osg::Transform &node );    //virtual void  apply( osg::CameraView &node)    //virtual void  apply( osg::Sequence &node)    //virtual void  apply( osg::PagedLOD &node)    //virtual void  apply( osg::ClearNode &node)    //virtual void  apply( osg::OccluderNode &node)    void traverse (osg::Node &node);  /*protected:    struct MeshData {        domMesh *mesh;        domSource *pos;        domSource *norm;        domSource *color;        std::vector< domSource * > texcoord;        std::string name;    };*/protected: //methods    void debugPrint( osg::Node &node );            bool processGeometry( osg::Geometry *geom, domGeometry *geo, const std::string &name );    domSource* createSource( daeElement *parent, const std::string &baseName, int size, bool color = false, bool uv = false );    template < typename Ty >        Ty *createPrimGroup( daeString type, domMesh *mesh, domSource *norm, domSource *color, const std::vector< domSource* > &texcoord );    void processMaterial( osg::StateSet *ss, domInstance_geometry *ig, const std::string &geoName );    void createAssetTag();    void pushStateSet(osg::StateSet* ss);    void popStateSet(osg::StateSet* ss);protected: //members    DAE *dae;    daeDocument *doc;    domCOLLADA *dom;    domLibrary_cameras *lib_cameras;    domLibrary_effects *lib_effects;    domLibrary_geometries *lib_geoms;    domLibrary_lights *lib_lights;    domLibrary_materials *lib_mats;    domLibrary_visual_scenes *lib_vis_scenes;    domNode *currentNode;    domVisual_scene *vs;    bool success;    NodeType lastVisited;    unsigned int lastDepth;  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;    }  };        std::map< std::string, int > uniqueNames;    std::map< osg::Geometry*, domGeometry * > geometryMap;    typedef std::map< osg::ref_ptr<osg::StateSet>, domMaterial *, CompareStateSet> MaterialMap;    MaterialMap materialMap;    typedef std::stack<osg::ref_ptr<osg::StateSet> > StateSetStack;    StateSetStack stateSetStack;    osg::ref_ptr<osg::StateSet> currentStateSet;    daeURI rootName;    bool usePolygons;    osg::StateSet* CleanStateSet(osg::StateSet* pStateSet) const;protected: //inner classes    class ArrayNIndices     {    public:        enum Mode { NONE = 0, VEC2 = 2, VEC3 = 3, VEC4 = 4 };        osg::Vec2Array *vec2;        osg::Vec3Array *vec3;        osg::Vec4Array *vec4;        osg::IndexArray *inds;        Mode mode;        ArrayNIndices( osg::Array *array, osg::IndexArray *ind ) : vec2(0), vec3(0), vec4(0), inds( ind ), mode(NONE)        {            if ( array != NULL )            {                switch( array->getType() )                {                case osg::Array::Vec2ArrayType:                    mode = VEC2;                    vec2 = (osg::Vec2Array*)array;                    break;                case osg::Array::Vec3ArrayType:                    mode = VEC3;                    vec3 = (osg::Vec3Array*)array;                    break;                case osg::Array::Vec4ArrayType:                    mode = VEC4;                    vec4 = (osg::Vec4Array*)array;                    break;                default:                    osg::notify( osg::WARN ) << "Array is unsupported vector type" << std::endl;                    break;                }            }        }    };private: //members                /** append elements (verts, normals, colors and texcoord) for file write */        void appendGeometryIndices(osg::Geometry *geom,                                          domP * p,                                          unsigned int vindex,                                          domSource * norm,                                          domSource * color,                                          const ArrayNIndices & verts,                                          const ArrayNIndices & normals,                                          const ArrayNIndices & colors,                                          const std::vector<ArrayNIndices> & texcoords,                                          unsigned int  ncount,                                          unsigned int  ccount);        /** provide a name to node */        std::string getNodeName(const osg::Node & node,const std::string & defaultName);                /** provide an unique name */        std::string uniquify( const std::string &name );        /** work in Google compatibility mode */        bool m_GoogleMode;        /** Current RenderingHint */        /** This are needed because the stateSet merge code currently does not handle it */        int m_CurrentRenderingHint;};}#endif

⌨️ 快捷键说明

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