您的位置:首页 > 其它

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) 来维护整个程序的生命周期。

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: