跑osgearthviewer程序

使用一个earth文件做参数传入

跟进代码。

首先osgearthviewer程序加载earth的方式分为两种:

1.根据earth文件(load方式)

2.使用SDK加载(create方式)

我们使用earth文件是load方式,直接看load函数,定位到这个位置

    // load an earth file, and support all or our example command-line options// and earth file <external> tags    osg::Node* node = MapNodeHelper().load(arguments, &viewer);

上面的函数是用来加载earth文件的,仔细看一下这个函数

发现这个函数是通过osgDB的加载机制来实现earth文件的加载。

下面我们先要搞清楚的是osgDB的加载机制

这是osgDB读取的调用顺序

回到,我们自己的程序,我将代码调试过程截图:

这里有不少默认的属性,而我们是定位到自定义的部分:(下图)

因为,我只用了一个传入参数,所以,这个循环只执行一次,就是调用了一次readRefNodeFile文件

这个函数好像是管理缓存什么的,我们在函数里定位到这里:(下图)

这个read才是开始真正解析数据了。

  1 ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
  2 {
               ......关于osga和zip文件的
 52     // first attempt to load the file from existing ReaderWriter's第一次尝试从现有ReaderWriter的加载文件
 53     AvailableReaderWriterIterator itr(_rwList, _pluginMutex);
 54     for(;itr.valid();++itr)
 55     {
 56         ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
 57         if (readFunctor.isValid(rr))
 58             return rr;
 59         else results.push_back(rr);
 60     }
 61
 62     // check loaded archives.检查加载的档案
 63     AvailableArchiveIterator aaitr(_archiveCache, _archiveCacheMutex);
 64     for(;aaitr.valid();++aaitr)
 65     {
 66         ReaderWriter::ReadResult rr = readFunctor.doRead(*aaitr);
 67         if (readFunctor.isValid(rr))
 68             return rr;
 69         else
 70         {
 71             // don't pass on FILE_NOT_FOUND results as we don't want to prevent non archive plugins that haven't been
 72             // loaded yet from getting a chance to test for the presence of the file.
 73             if (rr.status()!=ReaderWriter::ReadResult::FILE_NOT_FOUND) results.push_back(rr);
 74         }
 75     }
 76
 77     // now look for a plug-in to load the file.现在寻找一个插件加载文件!!!
 78     std::string libraryName = createLibraryNameForFile(readFunctor._filename);
 79     if (loadLibrary(libraryName)!=NOT_LOADED)
 80     {
 81         for(;itr.valid();++itr)
 82         {
 83             ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
 84             if (readFunctor.isValid(rr))
 85                 return rr;
 86             else results.push_back(rr);
 87         }
 88     }
 89
 90     //If the filename contains a server address and wasn't loaded by any of the plugins, try to find a plugin which supports the server
 91     //protocol and supports wildcards. If not successfully use curl as a last fallback
 92     if (containsServerAddress(readFunctor._filename))
 93     {
 94         ReaderWriter* rw = getReaderWriterForProtocolAndExtension(
 95             osgDB::getServerProtocol(readFunctor._filename),
 96             osgDB::getFileExtension(readFunctor._filename)
 97         );
 98
 99         if (rw)
100         {
101             return readFunctor.doRead(*rw);
102         }
103         else
104         {
105             return  ReaderWriter::ReadResult("Warning: Could not find the .curl plugin to read from server.");
106         }
107     }
108
109     if (results.empty())
110     {
111         return ReaderWriter::ReadResult("Warning: Could not find plugin to read objects from file \""+readFunctor._filename+"\".");
112     }
113
114     // sort the results so the most relevant (i.e. ERROR_IN_READING_FILE is more relevant than FILE_NOT_FOUND) results get placed at the end of the results list.
115     std::sort(results.begin(), results.end());
116     ReaderWriter::ReadResult result = results.back();
117
118     if (result.message().empty())
119     {
120         switch(result.status())
121         {
122             case(ReaderWriter::ReadResult::FILE_NOT_HANDLED): result.message() = "Warning: reading \""+readFunctor._filename+"\" not supported."; break;
123             case(ReaderWriter::ReadResult::FILE_NOT_FOUND): result.message() = "Warning: could not find file \""+readFunctor._filename+"\"."; break;
124             case(ReaderWriter::ReadResult::ERROR_IN_READING_FILE): result.message() = "Warning: Error in reading to \""+readFunctor._filename+"\"."; break;
125             default: break;
126         }
127     }
128
129     return result;
130 }

在第一次进入次函数时

它在78行  获取了插件叫osgDB_earth.dll(osgdb_earthd.dll)

它在第83行 开始加载插件调用了doRead函数

而doRead函数就是利用osgDB的机制调用,第三方插件osgDB_Earth中的读取方式:

正式开始读取本地earth文件(为什么是本地,因为读取服务器上的似乎有另外一套处理方案)振奋人心!

readstring直接调用doRead(URI.cpp)

但是,doRead当函数调用到加载URIReadCallback的时候,给我带来不少麻烦

这里使用的类是osgearth的Registry构造,让我一度和osgDB的Registry搞混。

调试了好久,而且由于里面加载了一个osgText::readFontFile("arial.ttf");

所以导致之前的readImplementation又被调用了一遍,非常打调试的连续性······MBD

继续在ReaderWriterOsgEarth的readNode函数中往下

一番磨难,似乎看到了胜利的曙光,进入到readNode函数中:

看到了序列化,关于序列化,我有另外一个博客,可以看下

[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)相关推荐

  1. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )

    文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...

  2. 第六章、epub文件处理 -- 解析container文件与.opf文件

    2019独角兽企业重金招聘Python工程师标准>>> 第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderAp ...

  3. (C++)将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法

    将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法 思路:将数据库所有要导出的信息通过sql语句得到,存储到结构体中,然后将结构体的内容通过自定义的xml格式导出. 此方法使用的是T ...

  4. 如何反编译apk文件并解析.class文件查看Java源代码

    如何反编译apk文件并解析.class文件查看Java源代码 前期工作:先准备好反编译需要用到的工具:下载链接. 1.把下载好的工具解压,得到下面这三个文件 2.配置环境变量到path(apktool ...

  5. settings.gradle.kts里读取properties配置文件或者解析json文件

    settings.gradle.kts里进行配置读取可进行动态控制 include 再结合 plugin+includeBuild方式可实现远程依赖和本地module的动态切换 读取配置test.pr ...

  6. python读文件代码-简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...

  7. STM32启动文件代码解析

    目录 启动流程 代码详解 启动文件使用的 ARM 汇编指令汇总 关于与启动文件有关的一些问题思考 下面是F1固件库V3.5.0的启动文件startup_stm32f10x_hd.s,以此为例做解析,其 ...

  8. FSN文件的解析(点钞机读取钱币文件)

    1.FsnParser.h文件 #pragma once #include <Windows.h> #include <iostream> #include <vecto ...

  9. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

    文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...

  10. java读取.fsn文件内容_FSN文件的解析(点钞机读取钱币文件)

    1.FsnParser.h文件 #pragma once #include #include #include #include #define READ_SIZE 100 /** * @brief ...

最新文章

  1. USART中的SART_IT_RXNE,USART_IT_TC,USART_IT_TXE
  2. TF之AutoML框架:AutoML框架的简介、特点、使用方法详细攻略
  3. 软件测试用例_通用测试用例执行软件
  4. redis.mecmcached和mongoDB的区别
  5. 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
  6. 2020年10月21日 星期三 工作日志
  7. JS代码优化工具Prepack
  8. access2007连接oracle数据库(通过ODBC)
  9. 漫谈CGI FastCGI WSGI
  10. 【jvm】jdk编译-未成功
  11. java oracle数据备份_Java后台备份oracle数据库脚本
  12. docker基础+registry
  13. Qt 学习之路 2(1):序 笔记
  14. NodeJS基础2---1 Promise小球运动
  15. 拓端tecdat|R语言特征选择——逐步回归
  16. 初级python程序实例
  17. AEC回声消除基础知识
  18. BIN转HEX,HEX转BIN,互相转换工具,PIC
  19. 一分钟搞懂app热更新
  20. html制作跳动的心注释比较全

热门文章

  1. 第十节 javascript之第四节 函数
  2. 光芒国际——我的面试(二)
  3. 放弃深度学习?我承认是因为线性代数
  4. 打造IOS移动渗透测试平台
  5. Android studio 中使用xUtils报错
  6. Total Commander如何设置自定义快捷键在当前目录打开ConEmu
  7. 彻底封杀讯雷下载,做好网络管理
  8. 如何发布第一个属于自己的npm包
  9. vue指令和特殊特性
  10. SVN服务器搭建详解