Ogre3D 1.7版本 SampleBrowser 分析
来源:互联网 发布:破解软件 q3687474 编辑:程序博客网 时间:2024/04/27 16:09
Ogre3D 1.7废除了将近10年的简单Sample框架,采用了一种插件浏览器的方式载入不同的Sample。
SampleBrowser类型:派生于SampleContext类型,并实现SdkTrayListener接口
Ogre例子浏览器,展示了了一个所有例子的目录,并进行动态配置,资源载入,接点分类等工作。
SampleContext类型:为Sample提供了一个标准的上下文,可以管理Sample类型的子类。在同一时间允许一个Sample运行,并管理一个Sample队列。
Sample类型:所有Sample类型的基类,被用来派生新的Sample类型。
FileSystemLayer类型 :提供在不同系统中找到Ogre配置文件的方法。
SamplePlugin类型 :在插件中保存一个Sample集合(SampleSet)。
SdkCameraMan类型:摄像机控制类型
SdkTrays.h(里面包含一系列类型):提供一个完整的操作界面,用Overlay作为底层。
流程:
- 进入main函数,创建SampleBrowser类型。
- SampleBrowser调用其基类型的 void go(Sample* initialSample = 0) 来维护整个程序的生命周期。
01
virtual
void
go(Sample* initialSample = 0)
02
{
03
04
while
(!mLastRun)
05
{
06
mLastRun =
true
;
// assume this is our last run
07
08
createRoot();
09
if
(!oneTimeConfig())
return
;
10
11
// if the context was reconfigured, set requested renderer
12
if
(!mFirstRun) mRoot->setRenderSystem(mRoot->getRenderSystemByName(mNextRenderer));
13
14
setup();
15
16
// restore the last sample if there was one or, if not, start initial sample
17
if
(!mFirstRun) recoverLastSample();
18
else
if
(initialSample) runSample(initialSample);
19
20
mRoot->startRendering();
// start the render loop
21
22
mRoot->saveConfig();
23
shutdown();
24
if
(mRoot) OGRE_DELETE mRoot;
25
26
mFirstRun =
false
;
27
}
28
29
}
3.其中 while (!mLastRun) 是用来检查是否是最后一次运行。因为1.7版本中Ogre3D有了在一个应用程序生命周期中重复启动运行自身的能力,这样我们就可以在运行期改变基础设置(比如类似CS一样在运行期改变OpenGL渲染到D3D渲染等)。虽然这不是一个震撼的事情,但对于产品来说是一个很好的用户体验。
4.createRoot(); 创建Root对象,和以往一样,Root永远是Ogre的外观模式的应用。
1
virtual
void
createRoot()
2
{
3
Ogre::String pluginsPath = Ogre::StringUtil::BLANK;
4
mRoot = OGRE_NEW Ogre::Root(pluginsPath, mFSLayer->getWritablePath(
"ogre.cfg"
),
5
mFSLayer->getWritablePath(
"ogre.log"
));
6
}
和以往一样的创建了Ogre::Root对象,唯一不同的是通过FileSystemLayer类型的mFSLayer实例来搜索不同平台相应的配置文件(我怀疑是因为为了支持iPhone等新平台而采用的)。
5. if (!oneTimeConfig()) return;检查是否有配置文件(第一次运行是没有的),如果没有配置文件则弹出配置窗口,否则直接载入配置文件。
6.if (!mFirstRun) mRoot->setRenderSystem(mRoot->getRenderSystemByName(mNextRenderer));如果用户切换渲染器的时候运行。
7.setup();配置系统(这里比较长,放到后面单独来说)
8.if (!mFirstRun) recoverLastSample();如过是用户切换了系统,那么就还原上次执行的Sample。else if (initialSample) runSample(initialSample);否则运行初始化的Sample。
9.mRoot->startRendering(); 开始渲染循环。
10.mRoot->saveConfig();循环结束之后储存配置文件。
11.shutdown();关闭(释放资源)。
12.if (mRoot) OGRE_DELETE mRoot;删除Ogre::Root类型实例。
virtual void SampleContext::setup()
01
/*-----------------------------------------------------------------------------
02
| Sets up the context after configuration.
03
-----------------------------------------------------------------------------*/
04
virtual
void
setup()
05
{
06
createWindow();
//创建渲染窗口
07
setupInput();
//设置输入系统
08
locateResources();
//定位本地资源
09
loadResources();
//载入资源
10
11
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
12
13
// adds context as listener to process context-level (above the sample level) events
14
mRoot->addFrameListener(
this
);
//增加Frame监听
15
Ogre::WindowEventUtilities::addWindowEventListener(mWindow,
this
);
//增加窗口事件监听
16
}
基本上和以前的流程一样。
但是SampleBrowser在自己的实现中重载了这个方法
01
/*-----------------------------------------------------------------------------
02
| Extends setup to create dummy scene and tray interface.
03
-----------------------------------------------------------------------------*/
04
virtual
void
setup()
05
{
06
07
createWindow();
08
setupInput();
09
locateResources();
10
11
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup(
"Essential"
);
12
13
mTrayMgr =
new
SdkTrayManager(
"BrowserControls"
, mWindow, mMouse,
this
);
14
mTrayMgr->showBackdrop(
"SdkTrays/Bands"
);
15
mTrayMgr->getTrayContainer(TL_NONE)->hide();
16
17
createDummyScene();
18
loadResources();
19
Sample* startupSample = loadSamples();
20
21
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
22
23
// adds context as listener to process context-level (above the sample level) events
24
mRoot->addFrameListener(
this
);
25
Ogre::WindowEventUtilities::addWindowEventListener(mWindow,
this
);
26
27
// create template material for sample thumbnails
28
Ogre::MaterialPtr thumbMat = Ogre::MaterialManager::getSingleton().create(
"SampleThumbnail"
,
"Essential"
);
29
thumbMat->getTechnique(0)->getPass(0)->createTextureUnitState();
30
31
setupWidgets();
32
windowResized(mWindow);
// adjust menus for resolution
33
// if this is our first time running, and there's a startup sample, run it
34
if
(startupSample && mFirstRun) runSample(startupSample);
35
}
这里和前面的主要区别是创建了Dummy场景,并配置了界面(SdkTrayManager),最后载入startupSample。
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre1.7SampleBrowser的插件结构分析
- 【图解】Ogre1.8 SampleBrowser流程全面分析
- Ogre3d 1.7.x 的 RTShaderSystem的一个BUG
- 安装Ogre3D
- OGRE SampleBrowser框架解析
- OGRE SampleBrowser框架解析
- OGRE SampleBrowser框架解析
- OGRE SampleBrowser框架解析
- OGRE SampleBrowser框架解析
- ogre3d 1.7beginner's guide 第二章 Ogre之场景绘图
- Ogre3D 实现角色换装
- Ogre3D嵌入Qt框架
- Ogre3D嵌入Qt框架
- BIG ENDIAN V.S. LITTER ENDIAN
- 文档中的英语单词总结
- ArcGIs Desktop9.3安装步骤
- Linux 下编译C程序
- 我爱你
- Ogre3D 1.7版本 SampleBrowser 分析
- 在Ogre中使用Newton物理引擎SDK
- InvalidOwnerException错误
- Http Etag和Last-Modified
- JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
- 商务Web应用程序的界面设计(译文)
- IT名人经典语录
- 使用Writer书写日志测试
- 2010年3月14—上周工作总结