OGRE 1.7 例子程序分析

OGRE之第一个程序 首先,此程序运行在 OGRE1.9SDK+VS2012环境 阅读详情

如果你自己都不清楚所谈论的东西,就根本不可能精确的描述它——冯诺依曼

 

今天我就试着来表述一件众人皆知的事情,以测试自己到底有没有明白这件事情。

 

OGRE是著名的设计模式大师,这已是不争的事实。可以说OGRE里将设计模式用得淋漓尽致。在这里我就不批判设计模式该不该用了。反正OGRE已经用了,并且没有出现什么不好的结果。适合的就是最好的,OGRE证明了这一点。

 

随着OGRE  1.7的发布,大家熟悉的DEMO程序不见了,换来的是一个个的DLL库。而这些库,就是作为OGRE的一个插件而存在。拿SkyBox为例,(不要问为什么拿SkyBox,如果真要知道,我只能说,我刚好看上它了。)我们可以在SkyBox.cpp里发现如下代码。

 

SamplePlugin* sp;

Sample* s;

 

extern "C" _OgreSampleExport void dllStartPlugin()

{

    s = new Sample_SkyBox;

    sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample");

    sp->addSample(s);

    Root::getSingleton().installPlugin(sp);

}

 

extern "C" _OgreSampleExport void dllStopPlugin()

{

    Root::getSingleton().uninstallPlugin(sp);

    OGRE_DELETE sp;

    delete s;

}

 

dllStartPlugin  和 dllStopPlugin 是插件的加载和卸载接口。可以看到,当调用dllStartPlugin 时,它先新建了一个Sample_SkyBox实例,这就是我们真正的示例程序。紧接着,它又新建了一个插件。插件的名字则以实例的Title信息加上Sample来标志。随后,这个示例程序的实例被加入插件中,然后调用Root::getSingleton().installPlugin(sp);函数初始化我们的插件。

 

显然,我们需要看看installPlugin干了些什么。

 

    void Root::installPlugin(Plugin* plugin)

    {

        LogManager::getSingleton().logMessage("Installing plugin: " + plugin->getName());

 

        mPlugins.push_back(plugin);

        plugin->install();

 

        // if rendersystem is already initialised, call rendersystem init too

        if (mIsInitialised)

        {

            plugin->initialise();

        }

 

        LogManager::getSingleton().logMessage("Plugin successfully installed");

    }

 

不难看出,OGRE在这个函数中将插件加入了自己的插件容器中,并调用插件的初始化接口。以及输出相关LOG信息。

 

而又是在何时调用这个dllStartPlugin来加载插件的呢。我们打开SampleBrowser.h找到virtual Sample* loadSamples()函数。在这个函数中的前几句便反应了它所做的工作。

 

Sample* startupSample = 0;

Ogre::StringVector unloadedSamplePlugins;

Ogre::ConfigFile cfg;

cfg.load(mFSLayer->getConfigFilePath("samples.cfg"));

 

Ogre::String sampleDir = cfg.getSetting("SampleFolder");        // Mac OS X just uses Resources/ directory

Ogre::StringVector sampleList = cfg.getMultiSetting("SamplePlugin");

Ogre::String startupSampleTitle = cfg.getSetting("StartupSample");

 

在这里,例子浏览器加载了samples.cfg文件,并读取相关内容。我们看看samples.cfg 里装了些什么便一切明了了。

 

SampleFolder=.

SamplePlugin=Sample_BezierPatch_d

SamplePlugin=Sample_BSP_d

SamplePlugin=Sample_CameraTrack_d

SamplePlugin=Sample_CelShading_d

SamplePlugin=Sample_Character_d

SamplePlugin=Sample_Compositor_d

SamplePlugin=Sample_CubeMapping_d

SamplePlugin=Sample_DeferredShading_d

。。。。

 

这些正好是我们的例子插件的DLL文件名。loadSamples函数在读取了这些信息后,将其放入 StringVector sampleList 中,然后依次遍历这个容器,并调用插件加载函数。代码如下

            // loop through all sample plugins...

for (Ogre::StringVector::iterator i = sampleList.begin(); i != sampleList.end(); i++)

{

    mRoot->loadPlugin(sampleDir + *i);

}

 

按照我们分析问题的方案(我们总是从程序的行为进行跟踪分析)。于是我们看看loadPlugin函数做了些什么。

 

    void Root::loadPlugin(const String& pluginName)

    {

    //根据名字加载动态库

        DynLib* lib = DynLibManager::getSingleton().load( pluginName );

     //查找是否已经加载,如果没有存在,则加入其中。并且取得入口函数并执行。

        if (std::find(mPluginLibs.begin(), mPluginLibs.end(), lib) == mPluginLibs.end())

        {

            mPluginLibs.push_back(lib);

            DLL_START_PLUGIN pFunc = (DLL_START_PLUGIN)lib->getSymbol("dllStartPlugin");

            if (!pFunc)

                OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find symbol dllStartPlugin in library " + pluginName,

                    "Root::loadPlugin");

            pFunc();//执行dllStartPlugin( )

        }

 

    }

 

由此,我们便可以知道整个程序的流程。。即例子浏览器在初始化时读取samples_d.cfg文件,然后根据文件内容加载所有的DLL并初始化相关内容。

 

此时我们会考虑,如果我们想要新增一个例子,应该如何去做?于是,我们需要先看看Sample_SkyBox 以及SamplePlugin.

 

打开Sample_SkyBox.h 我们便会看到

class _OgreSampleClassExport Sample_SkyBox : public SdkSample

{

protected:

 

    void setupContent()

    {

    //实现代码

     }

};

上面代码说明了,Sample_SkyBox继承自SdkSample,并且实现了setupContent函数。

我们再打开SamplePlugin可以看到有些空函数,说明在我们的例子中,SamplePlugin并没有做太多的初始化工作。于是,我们得到如下的关系

 

1、      Sample_SkyBox派生自SdkSample

2、      SamplePlugin派生自Plugin

3、      SamplePlugin持有Sample_SkyBox实例指针

4、      SamplePlugin会注册到Root的插件管理中

5、      Sample_SkyBox应该被加入到Samples_d.cfg中。

 

于是,我们可以看到,如果我们想实现一个简单的例子。则只需要自SdkSample派生一个实现类,并至少实现setupContent函数。然后学着Sample_SkyBox的样子写好dllStartPlugin和dllStopPlugin函数,并导出成DLL,然后将DLL名字添加到smaples_d.cfg中。

 

以上描述均是Debug版本下。如果是Release,则去掉后面的_d即可。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/BoYueJiang/archive/2010/07/15/5735923.aspx

Ogre 1.7中的地形教程 地形创建的工作步骤:1.创建地形全局配置2.创建地形分组3.创建默认的地形分块属性4.创建地形分块第一步首先,在Ogre1.7中,地形是由一块一块的地形组成的,他们每快地形都有共同的属性,所以在创建地形之前我们必须指定地形块的全局配置。代码:  mTerrainGlobals = new Ogre::TerrainGlobalOptions(); mTerrainGlobals->setMaxPixelError(8); mTerrainGlobals->setCompositeM 阅读详情

相关推荐

Ogre插件体系精简版

模仿ogre插件体系。程序中Plugins.cfg文件路径为绝对路径。这些代码写完已经过了很长时间了。懒得改了。有需要的朋友们自己修改一下吧。

Ogre源代码结构学习笔记——插件(Plugin)其它问题

插件(Plugin)结构的具体内容 我转载的文章里说的很系统清楚了。 《Ogre源代码浅析——插件(Plugin)工作原理》 这里就是我在学习中,不理解问题的笔记。 1、上期结尾问题 平平疑问记录如下: Ogre会在每个要被动态加载的dll库对象中声明一个名为“dllStartPlugin”的函数, 这里目前还没理解,先记录以后解决。 函数 Root::loadPlugin中有调用一个名为“dll...

jean7155的专栏 408

ogre 官网示例程序大全

官网上可运行的例子,包含了源代码以及相关的资源文件。希望可以对初学者有所帮助

Ogre中的 plugin 机制

         Ogre把包括RenderSystem, SceneManager, CgProgramManager, ParticleSystem在内的很多东西都设计成了Plugin,其好处不言而喻。                  Plugin中有install(), uninstall(), initializ

tyger的专栏 1273

ogre 编程书籍 Ogre 3d 1.7 beginner's Guide - 2010 源代码

ogre 编程书籍 Ogre 3d 1.7 beginner's Guide - 2010 随书源代码

金融科技数据源

数字金融开放研究平台

平平淡淡,戒急用忍,一生学闭嘴。 1757

ogre的SampleBrowser项目的代码结构笔记1——SampleBrowser类

SampleBrowser.cpp文件为程序的入口。这里有几个不同操作系统的入口函数,比如main,winmain等。用宏定义控制编译那个。 SampleBrowser_OSX.h文件好像和Mac操作系统有关。Mac目前我不懂,略。 SampleBrowser.h文件主要定义了SampleBrowser类。 SampleBrowser类定义如下: class SampleBrowser : pub...

jean7155的专栏 592

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1283

Ogre源代码浅析——插件(Plugin)工作原理

Ogre引擎由多个模块组成,从不同角度来划分可以得到不同的结果。从功能上看Ogre可大致分为资源管理、场景管理和渲染管理三大模块;而从可执行部分的组织方式看,Ogre引擎则是由多个dll动态链接库组合而成的。 组成Ogre的各动态库基本上可以分为以下几部分:核心库、渲染层、场景管理逻辑层。核心库(OgreMain.dll,一般debug版会生成OgreMain_d.dll文件)负...

Chinamming的专栏 324

STM32+ESP8266接入OneNet物联网平台全流程

MQTT协议是物联网设备与云平台通信的主流轻量级消息传输标准,其发布/订阅模型天然适配嵌入式资源受限场景;OneJSON作为中国移动OneNet平台定制的数据格式,在标准JSON基础上精简Schema、降低解析开销,显著提升STM32等MCU的处理效率。该技术组合兼顾安全性、低功耗与工程可量产性,广泛应用于环境监测、智能仪表、工业传感器等远程数据采集系统。实际落地需协同完成云平台物模型定义、Token动态认证、MQTT Topic严格构造、AT指令可靠交互及单总线传感器数据融合等关键环节。本文以DS18B2

u5v6w7的博客 1119

sentaurus学习笔记(HFET_pGate_GaN仿真)(五)

`(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。

qq_52640792的博客 940

OGRE 1.7 例子程序分析[DLL]

随着OGRE  1.7的发布,大家熟悉的DEMO程序不见了,换来的是一个个的DLL库。 而这些库,就是作为OGRE的一个插件而存在。 拿SkyBox为例,(不要问为什么拿SkyBox,如果真要知道 ,我只能说,我刚好看上它了。)我们可以在SkyBox.cpp里发现如下代码。  SamplePlugin* sp; Sample* s; extern "C" _OgreSampleExport

aquathinker的专栏 -- AquaMarine Animation 705

14.4kW大功率母线变换器设计:LLC+矩阵变压器+GaN实战解析

在数据中心供电架构中,隔离母线变换器将高压直流母线转换为48V低压母线,是大功率供电链路的核心环节。随着功率密度与效率要求不断攀升,传统移相全桥与普通LLC方案已难以满足300A级输出需求。基于LLC/CLLC谐振拓扑,结合矩阵变压器与GaN功率器件,成为新一代高性能母线变换器的主流技术路线。矩阵变压器将大功率磁性元件拆分为多个小单元,配合原边串联副边并联结构,有效降低绕组损耗并提升功率密度;GaN器件则通过高频软开关进一步压减开关损耗。本文以一台14.4kW样机为例,完整梳理从拓扑选型、谐振参数计算、同步

weixin_28273593的博客 341

Ogre1.7.2 + CEGUI0.7.5配置

转载请说明出处! http://blog.csdn.net/zhanghua1816/article/details/6650509 鉴于现在很多朋友开始学习研究Ogre或者CEGUI,不过很多朋友对如何配置这两个环境有很多问题,所以我把配置方法在此简单介绍一下,希望对大家有用,分享是一种快乐,大家共同进步嘛~~~。我这里的这种方法可能不是最简单的配置方法,但是我相信这种配置方法或许对

Everything is possible 7646

A Side Scan Sonar Image Denoising Algorithm Based on Compound of Fuzzy Weighted Average and Kalman F

Abstract 水下侧扫声纳图像的噪声来源:高斯噪声、脉冲、斑点噪声。 传统方法只能移除部分噪声,并且去噪后容易造成细节模糊。 本文在考虑到噪声的随机性以后,提出一种融合了模糊加权平均和卡尔曼滤波的去噪方法。 在最大化保留图像细节的基础上,同时去除高斯噪声和脉冲噪声 一.Introduction 由于海底环境和声波自身干涉的影响,声纳图像生成的图像难免会有噪点。声纳采集的图像通常会有高斯噪声、脉...

qq_44516871的博客 927

STM32F103标准库开发:Keil5新建STM32工程

新建STM32工程 步骤一:创建工程模板文件 新建一个文件夹 template 在文件夹template里面新建五个文件 (1)CMSIS: 存放内核驱动程序和启动引导文件 (2)FWLIB:存放库函数文件 (3)Project:存放工程文件 (4)System:存放自己写的驱动程序 (5)User:存放用户程序(主函数) 步骤二:导入stm...

MQ0522的博客 2万+

《Ogre一步一步学开发》 三、第一个Ogre 1.12 程序

三、第一个Ogre 1.12程序 Ogre1.7-1.9均为32位系统开发软件,网上存在大量Ogre教程均是以32位为例进行讲解的。从1.10开始,Ogre进入64位,开发环境的改变造成教程文章的缺失,本人本着边搜集,边整理的原则,以Ogre1.12.1SDK为例制作本教程。操作系统为 Windows 10 专业版,Microsoft Visual Studio 2017开发环境。 下载Ogre...

StudyOgre的博客 1519

图像紫边消除(depurple)

对图像紫边形成原因、消除方法进行了介绍。

沧海一升的博客 7564

Ogre学习教程:Ogre第一个程序

1. 已经安装了Ogre工程向导,VS2010 新建项目就可以看得OGRE的工程模版了,建立一个空项目,由于安装了Orge工程助手,所以免去了麻烦的配置过程(安装Orge工程助手步骤可以参考 Ogre1.8.1+VS2010环境配置): 2. 首先在项目中建立一个OgreDemo1.c和OgreDemo1.h文件。分别填入如下代码: OgreDemo1.h:

小熊不去实验室 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Ogre学习教程:Ogre1.8.1+VS2010环境配置

“伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧” 这是OGRE中文网的一则广告,我想,无论作为OGRE的学习者还是漫漫人生的一名旅人,这句话都是非常不错的激励语。放在这,是否能够让你隐约看到属于自己的新世界? Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,

小熊不去实验室 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Ogre场景管理器
下一篇: OGRE 分析之消息机制
凭谁问
博客等级 码龄15年 178粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值