Ogre3D 1.7版本 SampleBrowser 分析
2010-04-21 20:26
288 查看
原文地址: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类型实例。
基本上和以前的流程一样。
但是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) 来维护整个程序的生命周期。
virtual void go(Sample* initialSample = 0) { while (!mLastRun) { mLastRun = true; // assume this is our last run createRoot(); if (!oneTimeConfig()) return; // if the context was reconfigured, set requested renderer if (!mFirstRun) mRoot->setRenderSystem(mRoot->getRenderSystemByName(mNextRenderer)); setup(); // restore the last sample if there was one or, if not, start initial sample if (!mFirstRun) recoverLastSample(); else if (initialSample) runSample(initialSample); mRoot->startRendering(); // start the render loop mRoot->saveConfig(); shutdown(); if (mRoot) OGRE_DELETE mRoot; mFirstRun = false; } }
3.其中 while (!mLastRun)
是用来检查是否是最后一次运行。因为1.7版本中Ogre3D有了在一个应用程序生命周期中重复启动运行自身的能力,这样我们就可以在运行期改变基础设置(比如类似CS一样在运行期改变OpenGL渲染到D3D渲染等)。虽然这不是一个震撼的事情,但对于产品来说是一个很好的用户体验。
4.createRoot();
创建Root对象,和以往一样,Root永远是Ogre的外观模式的应用。
virtual void createRoot() { Ogre::String pluginsPath = Ogre::StringUtil::BLANK; mRoot = OGRE_NEW Ogre::Root(pluginsPath, mFSLayer->getWritablePath("ogre.cfg"), mFSLayer->getWritablePath("ogre.log")); }
和以往一样的创建了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类型实例。
/*----------------------------------------------------------------------------- | Sets up the context after configuration. -----------------------------------------------------------------------------*/ virtual void setup() { createWindow();//创建渲染窗口 setupInput();//设置输入系统 locateResources();//定位本地资源 loadResources();//载入资源 Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); // adds context as listener to process context-level (above the sample level) events mRoot->addFrameListener(this);//增加Frame监听 Ogre::WindowEventUtilities::addWindowEventListener(mWindow, this);//增加窗口事件监听 }
基本上和以前的流程一样。
但是SampleBrowser在自己的实现中重载了这个方法
/*----------------------------------------------------------------------------- | Extends setup to create dummy scene and tray interface. -----------------------------------------------------------------------------*/ virtual void setup() { createWindow(); setupInput(); locateResources(); Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("Essential"); mTrayMgr = new SdkTrayManager("BrowserControls", mWindow, mMouse, this); mTrayMgr->showBackdrop("SdkTrays/Bands"); mTrayMgr->getTrayContainer(TL_NONE)->hide(); createDummyScene(); loadResources(); Sample* startupSample = loadSamples(); Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); // adds context as listener to process context-level (above the sample level) events mRoot->addFrameListener(this); Ogre::WindowEventUtilities::addWindowEventListener(mWindow, this); // create template material for sample thumbnails Ogre::MaterialPtr thumbMat = Ogre::MaterialManager::getSingleton().create("SampleThumbnail", "Essential"); thumbMat->getTechnique(0)->getPass(0)->createTextureUnitState(); setupWidgets(); windowResized(mWindow); // adjust menus for resolution // if this is our first time running, and there's a startup sample, run it if (startupSample && mFirstRun) runSample(startupSample); }
这里和前面的主要区别是创建了Dummy场景,并配置了界面(SdkTrayManager),最后载入startupSample。
相关文章推荐
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- Ogre3D 1.7版本 SampleBrowser 分析
- 详细分析intern(),jdk1.7以上版本
- Nutch学习笔记3:Nutch 1.7 版本 之 HtmlParser 解析流程分析
- 【Java并发编程】23、ConcurrentHashMap原理分析(1.7和1.8版本对比)
- Linux版本Membase无法写入default bucket的问题分析
- HashMap源码分析_JDK1.8版本
- 对于十字佣兵3285版本的代码分析
- Linux下安装subversion1.7或更高版本问题的解决
- 网易新闻客户端iOS版本中新闻详情页(UIWebView)技术实现的分析探讨
- 多版本软件构建策略分析
- 将java1.7升级到java1.8版本
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 声控飞机游戏移植HTML5《一》winform版本介绍与代码分析
- Kafka Consumer各版本分析总结
- 内核2.6.36版本kfifo代码修改分析
- 火狐Firefox ios版本二次开发 (三) 源码分析