Ogre3D 1.7版本 SampleBrowser 分析

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作为底层。


流程 : 

  1. 进入main函数,创建SampleBrowser类型。
  2. SampleBrowser调用其基类型的 void go(Sample* initialSample = 0) 来维护整个程序的生命周期。

  

  1. virtual void go(Sample* initialSample = 0)  
  2. {  
  3.     while (!mLastRun)  
  4.     {  
  5.         mLastRun = true;  // assume this is our last run   
  6.         createRoot();  
  7.         if (!oneTimeConfig()) return;  
  8.         // if the context was reconfigured, set requested renderer   
  9.         if (!mFirstRun) mRoot->setRenderSystem(mRoot->getRenderSystemByName(mNextRenderer));  
  10.         setup();  
  11.         // restore the last sample if there was one or, if not, start initial sample   
  12.         if (!mFirstRun) recoverLastSample();  
  13.         else if (initialSample) runSample(initialSample);  
  14.         mRoot->startRendering();    // start the render loop   
  15.         mRoot->saveConfig();  
  16.         shutdown();  
  17.         if (mRoot) OGRE_DELETE mRoot;  
  18.         mFirstRun = false;  
  19.     }  
  20. }  

 

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类型实例。

 

 


 

  1. /*----------------------------------------------------------------------------- 
  2.        | Sets up the context after configuration. 
  3.        -----------------------------------------------------------------------------*/  
  4. virtual void setup()  
  5. {  
  6.     createWindow();//创建渲染窗口   
  7.     setupInput();//设置输入系统   
  8.     locateResources();//定位本地资源   
  9.     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在自己的实现中重载了这个方法

 

  1. /*----------------------------------------------------------------------------- 
  2.        | Extends setup to create dummy scene and tray interface. 
  3.        -----------------------------------------------------------------------------*/  
  4. virtual void setup()  
  5. {  
  6.             
  7.     createWindow();  
  8.     setupInput();  
  9.     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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值