3D图形编程

学无止尽

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  4 Posts :: 46 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿(2)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

原文地址: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作为底层。

流程

  1. 进入main函数,创建SampleBrowser类型。
  2. 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();
        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;
    #ifndef OGRE_STATIC_LIB
        pluginsPath 
= mFSLayer->getConfigFilePath("plugins.cfg");
    
#endif
    
//mRoot = OGRE_NEW Ogre::Root(pluginsPath, mFSLayer->getWritablePath("ogre.cfg"), 
    
//    mFSLayer->getWritablePath("ogre.log"));
        mRoot = OGRE_NEW Ogre::Root(pluginsPath, "ogre.cfg""ogre.log");

    #ifdef OGRE_STATIC_LIB
                mStaticPluginLoader.load();
    
#endif
}

和以往一样的创建了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在自己的实现中重载了这个方法

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);
    Ogre::WindowEventUtilities::addWindowEventListener(mWindow, 
this);
}

 

 

这里和前面的主要区别是创建了Dummy场景,并配置了界面(SdkTrayManager),最后载入startupSample。

posted on 2011-11-28 13:26 Nightsky 阅读(493) 评论(0)  编辑 收藏 引用 所属分类: Ogre开发

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理