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

📄 fltexportvisitor.h

📁 最新osg包
💻 H
字号:
/*  * 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 the 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.*///// Copyright(c) 2008 Skew Matrix Software LLC.//#ifndef __FLTEXP_FLT_EXPORT_VISITOR_H__#define __FLTEXP_FLT_EXPORT_VISITOR_H__ 1#include <osg/NodeVisitor>#include "ExportOptions.h"#include "Types.h"#include <osgDB/fstream>#include <set>#include <memory>namespace osg {    class DrawArrays;    class DrawArrayLengths;    class DrawElements;    class Geometry;    class StateSet;    class Switch;    class Material;    class Texture2D;}namespace osgSim {    class DOFTransform;    class MultiSwitch;    class LightPointNode;    class ObjectRecordData;}namespace flt{class ExportOptions;class DataOutputStream;class MaterialPaletteManager;class TexturePaletteManager;class VertexPaletteManager;class LightSourcePaletteManager;/*!   The main NodeVisitor for walking the scene graph during export.   A collection of apply() methods is in FltExportVisitor.cpp.   The apply() methods call several other methods for writing   specific FLT record types, most of which are in exp*.cpp. */class FltExportVisitor : public osg::NodeVisitor{public:    FltExportVisitor( DataOutputStream* dos, ExportOptions* fltOpt );    ~FltExportVisitor(  );    bool complete( const osg::Node& node );    virtual void apply( osg::Group& node );    virtual void apply( osg::Sequence& node );    virtual void apply( osg::Switch& node );    virtual void apply( osg::LOD& node );    virtual void apply( osg::MatrixTransform& node );    virtual void apply( osg::PositionAttitudeTransform& node );    virtual void apply( osg::Transform& node );    virtual void apply( osg::LightSource& node );    virtual void apply( osg::Geode& node );    virtual void apply( osg::Node& node );    virtual void apply( osg::ProxyNode& node );    // Primary records    void writeHeader( const std::string& headerName );    void writeGroup( const osg::Group& node );    void writeGroup( const osg::Group& group,                     int32 flags,                     int32 loopCount,                     float32 loopDuration,                     float32 lastFrameDuration);    void writeSequence( const osg::Sequence& node );    void writeObject( const osg::Group& node, osgSim::ObjectRecordData* ord );    void writeDegreeOfFreedom( const osgSim::DOFTransform* dof );    void writeExternalReference( const osg::ProxyNode& node );    void writeLevelOfDetail( const osg::LOD& lod, const osg::Vec3d& center,                             double switchInDist, double switchOutDist);    void writeLightSource( const osg::LightSource& ls );    void writeSwitch( const osgSim::MultiSwitch* ms );    void writeSwitch( const osg::Switch* ms );    void writeLightPoint( const osgSim::LightPointNode* lpn );    // Ancillary records    void writeComment( const osg::Node& node, DataOutputStream* dos=NULL );    void writeLongID( const std::string& id, DataOutputStream* dos=NULL );    void writeMatrix( const osg::Referenced* ref );    void writeContinuationRecord( const unsigned short length );    // Control records    void writePush();    void writePop();    void writePushSubface();    void writePopSubface();    // Helper routine for traversing a pushed subtree    void writePushTraverseWritePop(osg::Node& node)    {        writePush();        traverse(node);        writePop();    }    // Geometry records    void writeFace( const osg::Geode& geode, const osg::Geometry& geom, GLenum mode );    void writeMesh( const osg::Geode& geode, const osg::Geometry& geom );    int writeVertexList( int first, unsigned int count );    int writeVertexList( const std::vector<unsigned int>& indices, unsigned int count );    void writeMeshPrimitive( const std::vector<unsigned int>& indices, GLenum mode );    void writeLocalVertexPool( const osg::Geometry& geom );    void writeMultitexture( const osg::Geometry& geom );    void writeUVList( int numVerts, const osg::Geometry& geom );    // Light Point records    void writeLightPoint();    // Exporter doesn't currently support color palette; write a dummy in its place to    // support loaders that require it.    void writeColorPalette();    // StateSet stack support    void pushStateSet( const osg::StateSet* rhs );    void popStateSet();    const osg::StateSet* getCurrentStateSet() const;    void clearStateSetStack();    // Write a .attr file if none exists in the data file path.    void writeATTRFile( int unit, const osg::Texture2D* texture ) const;private:    // Methods for handling different primitive set types.    //   These are defined in expGeometryRecords.cpp.    void handleDrawArrays( const osg::DrawArrays* da, const osg::Geometry& geom, const osg::Geode& geode );    void handleDrawArrayLengths( const osg::DrawArrayLengths* dal, const osg::Geometry& geom, const osg::Geode& geode );    void handleDrawElements( const osg::DrawElements* de, const osg::Geometry& geom, const osg::Geode& geode );    bool isLit( const osg::Geometry& geom ) const;    bool isTextured( int unit, const osg::Geometry& geom ) const;    bool isMesh( const GLenum mode ) const;    bool atLeastOneFace( const osg::Geometry& geom ) const;    bool atLeastOneMesh( const osg::Geometry& geom ) const;    osg::ref_ptr< ExportOptions > _fltOpt;    // _dos is the primary output stream, produces the actual .flt file.    DataOutputStream& _dos;    // _records is a temp file for most records. After the Header and palette    // records are written to _dos, _records is copied onto _dos.    osgDB::ofstream _recordsStr;    DataOutputStream* _records;    std::string _recordsTempName;    // Track state changes during a scene graph walk.    typedef std::vector< osg::ref_ptr<osg::StateSet> > StateSetStack;    StateSetStack _stateSetStack;    std::auto_ptr<MaterialPaletteManager>     _materialPalette;    std::auto_ptr<TexturePaletteManager>      _texturePalette;    std::auto_ptr<LightSourcePaletteManager>  _lightSourcePalette;    std::auto_ptr<VertexPaletteManager>       _vertexPalette;    // Used to avoid duplicate Header/Group records at top of output FLT file.    bool _firstNode;};/*!   Helper class to ensure symmetrical state push/pop behavior. */class ScopedStatePushPop{    public:        ScopedStatePushPop ( FltExportVisitor * fnv, const osg::StateSet *ss ) :            fnv_( fnv )        {            fnv_->pushStateSet( ss );        }        virtual ~ScopedStatePushPop ()        {            fnv_->popStateSet();        }    private:        FltExportVisitor * fnv_;};/*!   Automatically handles writing the LongID ancillary record. */struct IdHelper{    IdHelper(flt::FltExportVisitor& v, const std::string& id)      : v_(v), id_(id), dos_(NULL)    { }    // Write an ancillary ID record upon destruction if name is too long    ~IdHelper()    {        if (id_.length() > 8)            v_.writeLongID(id_,dos_);    }    // Allow implicit conversion to the abbreviated name string    operator const std::string() const    {        return( (id_.length() > 8) ? id_.substr(0, 8) : id_ );    }    flt::FltExportVisitor&  v_;    const std::string        id_;    DataOutputStream* dos_;};/*!   Supports wrapping subfaces with push/pop records. */struct SubfaceHelper{    SubfaceHelper(flt::FltExportVisitor& v, const osg::StateSet* ss )      : v_(v)    {        _polygonOffsetOn = ( ss->getMode( GL_POLYGON_OFFSET_FILL ) == osg::StateAttribute::ON );        if (_polygonOffsetOn)            v_.writePushSubface();    }    ~SubfaceHelper()    {        if (_polygonOffsetOn)            v_.writePopSubface();    }    flt::FltExportVisitor&  v_;    bool _polygonOffsetOn;};}#endif

⌨️ 快捷键说明

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