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

📄 readerwriterosgterrain.cpp

📁 最新osg包
💻 CPP
字号:
#include <sstream>#include <osg/Image>#include <osg/Group>#include <osg/Notify>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/ReadFile>#include <osgDB/Registry>#include <osgDB/Input>#include <osgDB/Output>#include <osgTerrain/TerrainTile>class ReaderWriterTerrain : public osgDB::ReaderWriter{    public:        ReaderWriterTerrain()        {            supportsExtension("osgTerrain","OpenSceneGraph terrain extension to .osg ascii format");            supportsExtension("terrain","OpenSceneGraph terrain ascii format");        }                virtual const char* className() const { return "Terrain ReaderWriter"; }        virtual osgDB::ReaderWriter::ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* opt) const        {            std::string ext = osgDB::getLowerCaseFileExtension(file);                        if (osgDB::equalCaseInsensitive(ext,"terrain"))            {#if 0                            KeywordValueMap keywordValueMap;                parseTerrainString(osgDB::getNameLessExtension(file), keywordValueMap);                            for(KeywordValueMap::iterator itr = keywordValueMap.begin();                    itr != keywordValueMap.end();                    ++itr)                {                    osg::notify(osg::NOTICE)<<"["<<itr->first<<"] = "<<"["<<itr->second<<"]"<<std::endl;                }#else                std::istringstream fin(osgDB::getNameLessExtension(file));                if (fin) return readNode(fin,opt);#endif                return 0;            }            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;            std::string fileName = osgDB::findDataFile( file, opt );            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;            // code for setting up the database path so that internally referenced file are searched for on relative paths.             osg::ref_ptr<Options> local_opt = opt ? static_cast<Options*>(opt->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;            local_opt->setDatabasePath(osgDB::getFilePath(fileName));            osgDB::ifstream fin(fileName.c_str());            if (fin)            {                return readNode(fin, local_opt.get());            }            return 0L;                                }        virtual osgDB::ReaderWriter::ReadResult readNode(std::istream& fin, const Options* options) const        {            fin.imbue(std::locale::classic());            osgDB::Input fr;            fr.attach(&fin);            fr.setOptions(options);            osg::ref_ptr<osg::Group> group = new osg::Group;            while(!fr.eof())            {                bool itrAdvanced = false;                if (fr.matchSequence("file %s") || fr.matchSequence("file %w") )                {                    osg::Node* node = osgDB::readNodeFile(fr[1].getStr());                    if (node) group->addChild(node);                    fr += 2;                    itrAdvanced = true;                }                osg::ref_ptr<osg::Node> node = fr.readNode();                if (node.valid())                {                    group->addChild(node.get());                    itrAdvanced = true;                }                if (!itrAdvanced)                {                    if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Terrain file - unreconised token : "<<fr[0].getStr() <<""<< std::endl;                    ++fr;                }            }            if (group->getNumChildren()>0) return group.release();            else return 0;        }        typedef std::map<std::string, std::string> KeywordValueMap;        bool parseTerrainString(const std::string& str, KeywordValueMap& keywordValueMap) const        {            bool success = false;            std::string::size_type pos = 0;            while(pos != std::string::npos)            {                pos = str.find_first_not_of(' ',pos);                if (pos == std::string::npos) break;                                std::string::size_type semicolon = str.find_first_of(';', pos);                std::string::size_type startstatement = pos;                std::string::size_type endstatement = std::string::npos;                if (semicolon!=std::string::npos)                {                    endstatement = semicolon-1;                    pos = semicolon+1;                }                else                {                    endstatement = str.length()-1;                    pos = std::string::npos;                }                                if (startstatement<endstatement) endstatement = str.find_last_not_of(' ',endstatement);                if (startstatement<=endstatement)                {                    // osg::notify(osg::NOTICE)<<"statement = ["<<str.substr(startstatement, endstatement-startstatement+1)<<"]"<<std::endl;                    std::string::size_type assignment = str.find_first_of('=', startstatement);                    if (assignment!=std::string::npos && assignment>endstatement)                    {                        assignment = std::string::npos;                    }                                        std::string::size_type startvariable = startstatement;                    std::string::size_type endvariable = startstatement;                    std::string::size_type startvalue = startstatement;                    std::string::size_type endvalue = endstatement;                                        if (assignment!=std::string::npos)                    {                        endvariable = assignment-1;                        startvalue = assignment+1;                        if (startvariable<=endvariable)                        {                            endvariable = str.find_last_not_of(' ',endvariable);                        }                        if (startvariable<=endvariable)                        {                            ++endvariable;                        }                    }                                        if (startvalue<=endvalue)                    {                        startvalue = str.find_first_not_of(' ',startvalue);                    }                                        if (startvalue<=endvalue)                    {                        if (startvariable<endvariable)                        {                            keywordValueMap[str.substr(startvariable, endvariable-startvariable)] = str.substr(startvalue, endvalue-startvalue+1);                            success = true;                        }                         else                        {                            keywordValueMap[""] = str.substr(startvalue, endvalue-startvalue+1);                            success = true;                        }                    }                                    }            }                        return success;        }};// now register with Registry to instantiate the above// reader/writer.REGISTER_OSGPLUGIN(terrain, ReaderWriterTerrain)

⌨️ 快捷键说明

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