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


流程: 

  1. 进入main函数,创建SampleBrowser类型。
  2. SampleBrowser调用其基类型的 void go(Sample* initialSample = 0) 来维护整个程序的生命周期。
view source
print?
01virtual 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的外观模式的应用。

view source
print?
1virtual 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()

view source
print?
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在自己的实现中重载了这个方法

view source
print?
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。

原创粉丝点击