[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
跑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文件读取的一帧)相关推荐
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...
- 第六章、epub文件处理 -- 解析container文件与.opf文件
2019独角兽企业重金招聘Python工程师标准>>> 第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderAp ...
- (C++)将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法
将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法 思路:将数据库所有要导出的信息通过sql语句得到,存储到结构体中,然后将结构体的内容通过自定义的xml格式导出. 此方法使用的是T ...
- 如何反编译apk文件并解析.class文件查看Java源代码
如何反编译apk文件并解析.class文件查看Java源代码 前期工作:先准备好反编译需要用到的工具:下载链接. 1.把下载好的工具解压,得到下面这三个文件 2.配置环境变量到path(apktool ...
- settings.gradle.kts里读取properties配置文件或者解析json文件
settings.gradle.kts里进行配置读取可进行动态控制 include 再结合 plugin+includeBuild方式可实现远程依赖和本地module的动态切换 读取配置test.pr ...
- python读文件代码-简单了解Python读取大文件代码实例
这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...
- STM32启动文件代码解析
目录 启动流程 代码详解 启动文件使用的 ARM 汇编指令汇总 关于与启动文件有关的一些问题思考 下面是F1固件库V3.5.0的启动文件startup_stm32f10x_hd.s,以此为例做解析,其 ...
- FSN文件的解析(点钞机读取钱币文件)
1.FsnParser.h文件 #pragma once #include <Windows.h> #include <iostream> #include <vecto ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )
文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...
- java读取.fsn文件内容_FSN文件的解析(点钞机读取钱币文件)
1.FsnParser.h文件 #pragma once #include #include #include #include #define READ_SIZE 100 /** * @brief ...
最新文章
- USART中的SART_IT_RXNE,USART_IT_TC,USART_IT_TXE
- TF之AutoML框架:AutoML框架的简介、特点、使用方法详细攻略
- 软件测试用例_通用测试用例执行软件
- redis.mecmcached和mongoDB的区别
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
- 2020年10月21日 星期三 工作日志
- JS代码优化工具Prepack
- access2007连接oracle数据库(通过ODBC)
- 漫谈CGI FastCGI WSGI
- 【jvm】jdk编译-未成功
- java oracle数据备份_Java后台备份oracle数据库脚本
- docker基础+registry
- Qt 学习之路 2(1):序 笔记
- NodeJS基础2---1 Promise小球运动
- 拓端tecdat|R语言特征选择——逐步回归
- 初级python程序实例
- AEC回声消除基础知识
- BIN转HEX,HEX转BIN,互相转换工具,PIC
- 一分钟搞懂app热更新
- html制作跳动的心注释比较全