Ogre3D 1.7版本 SampleBrowser 分析
2011-11-25 23:53
387 查看
转自http://class.gd/node/44
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) 来维护整个程序的生命周期。
3.其中 while (!mLastRun)是用来检查是否是最后一次运行。因为1.7版本中Ogre3D有了在一个应用程序生命周期中重复启动运行自身的能力,这样我们就可以在运行期改变基础设置(比如类似CS一样在运行期改变OpenGL渲染到D3D渲染等)。虽然这不是一个震撼的事情,但对于产品来说是一个很好的用户体验。
4.createRoot();创建Root对象,和以往一样,Root永远是Ogre的外观模式的应用。
和以往一样的创建了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()
基本上和以前的流程一样。
但是SampleBrowser在自己的实现中重载了这个方法
这里和前面的主要区别是创建了Dummy场景,并配置了界面(SdkTrayManager),最后载入startupSample。
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
|
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 | } |
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 | } |
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 | } |
相关文章推荐
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- 3D打印机切片引擎CuraEngine源码分析<四> CuraEngine中的ReadMe解读,CuraEngine的版本介绍
- 场景管理器 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第六章
- 详细分析intern(),jdk1.7以上版本
- OGRE 所有版本(从0.1到1.7) (SDK 及 源码 及 扩展库) 下载地址
- OGRE 1.7 例子程序分析[DLL]
- 粒子系统和Ogre 3D扩展 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第十章(终章)
- OGRE 1.7 例子程序分析
- Ogre 1.7版本中 ExampleApplication类的改造
- 摄像机,光源和阴影 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第四章
- Ogre 3D与材质 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第七章
- Nutch学习笔记3:Nutch 1.7 版本 之 HtmlParser 解析流程分析
- OGRE 所有版本(从0.1到1.7) (SDK 及 源码 及 扩展库) 下载地址
- OGRE1.7 3D图形引擎2:singleton,Smart Point,Memory Manager
- 屏蔽掉Ogre1.7版本以后的 LOGO和FPS数据显示
- 使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章
- OGRE 3D 1.7 Beginner's Guide