txpparser.h
来自「最新osg包」· C头文件 代码 · 共 536 行
H
536 行
/*************************************************************************** * December 2003 * * This TerraPage loader was re-written in a fashion to use PagedLOD * to manage paging entirely, also includes a version of Terrex's smart mesh * adapted to work with PagedLOD. The essential code by Boris Bralo is still present, * slight modified. * nick at terrex dot com * * Ported to PagedLOD technology by Trajce Nikolov (Nick) & Robert Osfield *****************************************************************************//*************************************************************************** * OpenSceneGraph loader for Terrapage format database * by Boris Bralo 2002 * * based on/modifed sgl (Scene Graph Library) loader by Bryan Walsh * * This loader is based on/modified from Terrain Experts Performer Loader, * and was ported to SGL by Bryan Walsh / bryanw at earthlink dot net * * That loader is redistributed under the terms listed on Terrain Experts * website (www.terrex.com/www/pages/technology/technologypage.htm) * * "TerraPage is provided as an Open Source format for use by anyone... * We supply the TerraPage C++ source code free of charge. Anyone * can use it and redistribute it as needed (including our competitors). * We do, however, ask that you keep the TERREX copyrights intact." * * Copyright Terrain Experts Inc. 1999. * All Rights Reserved. * *****************************************************************************/#ifndef __TXPPARSER_H_#define __TXPPARSER_H_#include <osg/Referenced>#include <osg/Texture2D>#include <osg/StateSet>#include <osg/Node>#include <stack>#include "trpage_read.h"#include "TXPArchive.h"namespace txp{// Gets local texture via the image helperosg::Texture2D* getLocalTexture(trpgrImageHelper& image_helper, const trpgTexture* tex);osg::Texture2D* getTemplateTexture(trpgrImageHelper& image_helper, trpgLocalMaterial* locmat, const trpgTexture* tex, int index=0);// This is group that will has geode node// It is better since all the geometry children will be// added into one Geode node as drawables, then having one// geode node per child// Means, instad of having// Group// +-----------// | |// Geode Geode// | |// Drawable Drawable// we will have// Group// |// Geode// +-----------// | |// Drawable Drawableclass GeodeGroup : public osg::Group{public: GeodeGroup() : osg::Group(), _geode(NULL) {} GeodeGroup(const GeodeGroup& gg,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): osg::Group(gg, copyop), _geode(gg._geode) {} META_Node(txp, GeodeGroup); osg::Geode* getGeode() { if (_geode == 0) { _geode = new osg::Geode(); addChild(_geode); } return _geode; }protected: osg::Geode* _geode;};class TXPArchive;class childRefRead;struct DeferredLightAttribute;class TXPParser : public trpgSceneParser, public osg::Referenced{public: TXPParser(); // Sets the archive to be parsed inline void setArchive(TXPArchive* archive) { _archive = archive; } // Gets the archive inline TXPArchive* getArchive() { return _archive; } // Scene parser osg::Group *parseScene( trpgReadBuffer &buf, std::map<int,osg::ref_ptr<osg::StateSet> > &materials, std::map<int,osg::ref_ptr<osg::Node> > &models, double realMinRange, double realMaxRange, double usedMaxRange); // Returns the current Top Group inline osg::Group* getCurrTop() { return _currentTop ? _currentTop : _root.get(); } // Sets the group as potentional tile group inline void setPotentionalTileGroup(osg::Group* grp) { _tileGroups[grp] = 1; } // Return the current material list (passed in to ParseScene()) inline std::map<int,osg::ref_ptr<osg::StateSet> >* getMaterials() { return _materialMap; } // Ensure material is loaded inline void loadMaterial( int ix ) { _archive->loadMaterial( ix ); } // New to TerraPage 2.0 - local materials std::vector<osg::ref_ptr<osg::StateSet> >* getLocalMaterials() { return &_localMaterials; } // Load local materials void loadLocalMaterials(); // Return the current model list std::map<int,osg::ref_ptr<osg::Node> >* getModels() { return _models; } // Request a model to be load bool requestModel(int ix); // Return a reference to the tile header (after a tile has been read) inline trpgTileHeader *getTileHeaderRef() { return &_tileHeader; } // Returns true if we are under billboard subgraph inline const bool underBillboardSubgraph() const { return _underBillboardSubgraph; } // Sets if we are under billboard subgraph inline void setUnderBillboardSubgraph(bool b) { _underBillboardSubgraph = b; } // TXP Billboard info struct TXPBillboardInfo { int type; int mode; trpg3dPoint center; trpg3dPoint axis; }; // Sets info for the last billboard parsed inline void setLastBillboardInfo(TXPBillboardInfo& info) { _lastBillboardInfo = info; } // Gets info for the last billboard parsed inline void getLastBillboardInfo(TXPBillboardInfo& info) { info = _lastBillboardInfo; } // Gets light attrib DeferredLightAttribute& getLightAttribute(int ix); // Returns if we are under layer subgraph inline const bool underLayerSubgraph() const { return _underLayerSubgraph; } // Sets if we are under layer subgraph inline void setUnderLayerSubgraph(bool b) { _underLayerSubgraph = b; } // Set the current layer geode inline void setLayerGeode(osg::Geode* layer) { _layerGeode = layer; } // Returns the current layer geode inline osg::Geode* getLayerGeode() const { return _layerGeode; } inline unsigned int getNumLayerLavels() const { return _numLayerLevels; } // default value to use when setting up textures. void setMaxAnisotropy(float anisotropy) { _defaultMaxAnisotropy = anisotropy; } float getMaxAnisotropy() const { return _defaultMaxAnisotropy; } // We need to change the LOD ranges within tiles since // we have done it for the PagedLODs representing tiles inline double checkAndGetMinRange(double range) { if ((range-_realMinRange) < 0.0001) return 0.0; else return range; } inline double checkAndGetMaxRange(double range) { if ((range-_realMaxRange) < 0.0001) return _usedMaxRange; else return range; } // gets tile center, from the top lod node inline const osg::Vec3 getTileCenter() const { return _tileCenter; } inline void setCurrentNode( osg::Node* node ) { _currentNode = node; } // After parsing this will return the number of trpgChildRef node found. unsigned int GetNbChildrenRef() const; // This will return the trpgChildRef node pointer associated with the index. // Will return 0 if index is out of bound const trpgChildRef* GetChildRef(unsigned int idx) const; protected: virtual ~TXPParser(); // Removes any empty groups and LODs void removeEmptyGroups(); // Called on start children bool StartChildren(void *); // Called on end children bool EndChildren(void *); // THE archive TXPArchive *_archive; // Current parent osg::Group* _currentTop; // Current node osg::Node* _currentNode; // The root of the tile osg::ref_ptr<osg::Group> _root; // Parents list std::stack<osg::Group*> _parents; // Potentional Tile groups std::map<osg::Group*,int> _tileGroups; // Replace the tile lod to regular group void replaceTileLod(osg::Group*); // Materials typedef std::map<int,osg::ref_ptr<osg::StateSet> >* MaterialMapType; MaterialMapType _materialMap; // Local materials std::vector<osg::ref_ptr<osg::StateSet> > _localMaterials; // Model list typedef std::map<int,osg::ref_ptr<osg::Node> > OSGModelsMapType; OSGModelsMapType* _models; // Tile header trpgTileHeader _tileHeader; // true if we are under billboard subgraph bool _underBillboardSubgraph; // Number of levels below the billboard node int _numBillboardLevels; // Last billboard we parsed TXPBillboardInfo _lastBillboardInfo; // true if we are under layer subgraph bool _underLayerSubgraph; // Numbers of levels below layer subgraph int _numLayerLevels; // Our Layer Geode osg::Geode* _layerGeode; // default value to use when setting up textures. float _defaultMaxAnisotropy; // LOD ranges to be used when parsing tiles double _realMinRange; double _realMaxRange; double _usedMaxRange; // tile center osg::Vec3 _tileCenter; // TEMP osg::Geode* createBoundingBox(int x,int y, int lod); private: childRefRead *_childRefCB; };//! callback functions for various scene graph elements//----------------------------------------------------------------------------class geomRead : public trpgr_Callback{public: geomRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class groupRead : public trpgr_Callback{public: groupRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class attachRead : public trpgr_Callback{public: attachRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class childRefRead : public trpgr_Callback{public: typedef std::vector<trpgChildRef> ChildRefList; childRefRead(TXPParser *in_parse) : _parse(in_parse) {} void Reset(); void *Parse(trpgToken tok,trpgReadBuffer &buf); // After parsing this will return the number of trpgChildRef node found. unsigned int GetNbChildrenRef() const { return childRefList.size(); } // This will return the trpgChildRef node associated with the index. // this will return 0 if idx is out of bound const trpgChildRef* GetChildRef(unsigned int idx) const { if(idx >= childRefList.size()) return 0; else return &childRefList[idx]; }protected: TXPParser *_parse; private: ChildRefList childRefList;};//----------------------------------------------------------------------------class lodRead : public trpgr_Callback{public: lodRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class tileHeaderRead : public trpgr_Callback{public: tileHeaderRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class modelRefRead : public trpgr_Callback{public: modelRefRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class billboardRead : public trpgr_Callback{public: billboardRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class lightRead: public trpgr_Callback{public: lightRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class layerRead: public trpgr_Callback{public: layerRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};//----------------------------------------------------------------------------class labelRead: public trpgr_Callback{public: labelRead(TXPParser *in_parse) : _parse(in_parse) {} void *Parse(trpgToken tok,trpgReadBuffer &buf);protected: TXPParser *_parse;};} // namespace#endif // __TXPPARSER_H_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?