[原][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才是开始真正解析数据了。
ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor)
{
......关于osga和zip文件的
// first attempt to load the file from existing ReaderWriter's第一次尝试从现有ReaderWriter的加载文件
AvailableReaderWriterIterator itr(_rwList, _pluginMutex);
for(;itr.valid();++itr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
if (readFunctor.isValid(rr))
return rr;
else results.push_back(rr);
} // check loaded archives.检查加载的档案
AvailableArchiveIterator aaitr(_archiveCache, _archiveCacheMutex);
for(;aaitr.valid();++aaitr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*aaitr);
if (readFunctor.isValid(rr))
return rr;
else
{
// don't pass on FILE_NOT_FOUND results as we don't want to prevent non archive plugins that haven't been
// loaded yet from getting a chance to test for the presence of the file.
if (rr.status()!=ReaderWriter::ReadResult::FILE_NOT_FOUND) results.push_back(rr);
}
} // now look for a plug-in to load the file.现在寻找一个插件加载文件!!!
std::string libraryName = createLibraryNameForFile(readFunctor._filename);
if (loadLibrary(libraryName)!=NOT_LOADED)
{
for(;itr.valid();++itr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
if (readFunctor.isValid(rr))
return rr;
else results.push_back(rr);
}
} //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
//protocol and supports wildcards. If not successfully use curl as a last fallback
if (containsServerAddress(readFunctor._filename))
{
ReaderWriter* rw = getReaderWriterForProtocolAndExtension(
osgDB::getServerProtocol(readFunctor._filename),
osgDB::getFileExtension(readFunctor._filename)
); if (rw)
{
return readFunctor.doRead(*rw);
}
else
{
return ReaderWriter::ReadResult("Warning: Could not find the .curl plugin to read from server.");
}
} if (results.empty())
{
return ReaderWriter::ReadResult("Warning: Could not find plugin to read objects from file \""+readFunctor._filename+"\".");
} // 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.
std::sort(results.begin(), results.end());
ReaderWriter::ReadResult result = results.back(); if (result.message().empty())
{
switch(result.status())
{
case(ReaderWriter::ReadResult::FILE_NOT_HANDLED): result.message() = "Warning: reading \""+readFunctor._filename+"\" not supported."; break;
case(ReaderWriter::ReadResult::FILE_NOT_FOUND): result.message() = "Warning: could not find file \""+readFunctor._filename+"\"."; break;
case(ReaderWriter::ReadResult::ERROR_IN_READING_FILE): result.message() = "Warning: Error in reading to \""+readFunctor._filename+"\"."; break;
default: break;
}
} return result;
}
在第一次进入次函数时
它在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文件读取的一帧)的更多相关文章
- Java中使用DOM4J来生成xml文件和解析xml文件
一.前言 现在有不少需求,是需要我们解析xml文件中的数据,然后导入到数据库中,当然解析xml文件也有好多种方法,小编觉得还是DOM4J用的最多最广泛也最好理解的吧.小编也是最近需求里遇到了,就来整理 ...
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...
- vue下载和上传excle数据文件,解析excel文件数据并存在数据库中
下载: VUE: window.open("xxxx/downloadOldTaskDataFile.do_", "_blank"); JAVA: /** * ...
- Jxl创建Excel文件和解析Excel文件
import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; im ...
- 创建xml文件、解析xml文件
1.创建XML文件: import codecs import xml.dom.minidom doc=xml.dom.minidom.Document() print doc root=do ...
- php上传文件代码解析
思想:把html的input标签组织成一个数组,然后去重 关键技术涉及的函数 is_dir mkdir move_uploaded_file() 涉及的数组 预定义数组$_FILES 步骤一:检查上传 ...
- java 两行代码解析json文件
public void JsonRead() throws IOException{ String str = FileUtils.readFileToString(new File("D: ...
- 在linux下通过hexdump生成一个十六进制的文本保存文件,解析此文件转变成正常源代码文件。
举例说明: 此十六进制保存的文件为此源代码hexdump生成的: #include<stdio.h> #include<string.h> #include<stdlib ...
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
随机推荐
- angularJS中的ng-repeat指令!
ng-repeat 指令: ng-repeat 指令用来遍历一个数组重复创建当前元素: <ul ng-app="myApp" ng-controller="myAp ...
- PHP中文字数限制:中文字符串截取(mb_substr)
一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...
- ThinkPHP分页用异步来做,玩转分页类!
具体为什么用异步来做分页我就不多说了! 用异步来做分页,主要还是看分页类怎么玩! 方便管理,还是把Ajax分页作为一个工具来使用: 同样新建工具类: 多次尝试,最终修改好的分页类是这样的:(我自己使用 ...
- postgresql 表空间创建、删除
表空间:字面上理解就是表存储的物理空间,其实包括数据库的表.索引.序列等. 可以将表空间创建在服务器的不同分区,这样做的好处有: 一.如果初始化集群所在分区已经用光,可以方便的其他分区上创建表空间已达 ...
- localstorage - HTML 5 Web 存储总结---【巷子】
001.localStorage概念 在html5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储,解决了cookie存储空间不足的问题(cookie中每条cookie存储 ...
- DetailView内匿名函数不可用
DetailView yii\widgets\DetailView 小部件显示的是单一 yii\widgets\DetailView::$model 数据的详情. 它非常适合用常规格式显示一个模型(例 ...
- HTTP监视器charles入门使用教程分享---http/s packet monitors---ubuntu installation
charles --usage http://www.cnblogs.com/chenlogin/p/5849471.html 按照Charles的提示,PC打开 chls.pro/ssl下载得到一个 ...
- python之sys.stdout、sys.stdin以及设置打印到日志文件等
转自:https://www.cnblogs.com/BigFishFly/p/6622784.html python之sys.stdout.sys.stdin 转自:http://www.cnblo ...
- Python开发【模块】:M2Crypto RSA加密、解密
M2Crypto 模块 快速安装: # 环境centos7.0,提前装好openssl(自行百度安装),windows装不上,暂不考虑了 [root@localhost ~]# pip install ...
- Python开发【Django】:组合搜索、JSONP、XSS过滤
组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import views urlpat ...