OGRE中使用CEGUI【1】

转载请注明出处 http://blog.sina.com.cn/lucyloveayu

         因为Ogre1.7.x以后便不再在SDK中附带CEGUI的渲染器了,所以CEGUI就自己出了CEGUIOgreRenderer的渲染器,这样在函数调用和依赖库上虽然有了一些区别,但是整个GUI的渲染步骤是不变的,还是依照创建CEGUI::Renderer对象->创建CEGUI::System对象进行初始化->调用渲染函数这三个雷打不动的步骤执行的,因为我自己在使用CEGUI的更新版本以后也困惑了好久,发现仅仅是几个函数的修改后真的是无语问苍天啊。

         当然,工欲善其事必先利其器,首先我们必须要把OGRECEGUI都做相关的了解,因为我自己接触ogre时间已经不短,但是对CEGUI却是知之甚少,主要就是从cegui的角度来说了(关于基础的CEGUI配置和渲染流程另一篇博文中http://blog.sina.com.cn/s/blog_5e3213f30100zq4q.html已经有了说明)。

CEGUI文件系统】

CEGUI使用很多类型的数据文件,其中绝大多数都是XML格式,除了特殊的图片文件(.tag等)以及可载入模块文件(DLL等)。但是为了清晰的说明数据文件的资源类型,数据文件并不是以”.xml”作为后缀,而是用更有意义个后缀名。比如imageset的后缀名就是.imageset,Font的后缀名就是.font等等。

Imageset——通常,为了提高效率,我们需要把材质等图片组合成一个大的材质图片。在使用的时候就需要在它上面截取到各个小材质,而这个imageset就是保存各个小材质在整张源图片上的区域信息(源图片同样在imageset中指定了)。每个区域信息都有一个独一无二的名字,当提到它们的名字的时候,系统就把它们当做图片处理。所以,也可以说imagesets定义了一系列的图片。通过修改imagesets中的源图片名、各个小区域的位置和大小,就可以很轻松的改变所画的GUI的外观。

Font——显而易见,Font文件定义了CEGUI使用的字体,所能定义的字体类型有两种:

         FreeTypeFont:这是一种基于true-type(.ttf)的字体文件。从CEGUI0.5.0开始,在.font中使用type=Free Type”指定这种字体类型。在更早的版本中,使用”Dynamic”指定。

Pixmap Font——这种就是众所周知的位图字体,这种字体基于一定义了文字图片的imageset。从CEGUI0.5.0开始,在.font文件中用Type=”Pixmap”指定此字体。在更早的版本中,用“static”指定。

Scheme——是把其他数据文件联系到一起的主要手段,同时它也是装载和定义各种控件最简便的方法。一个Scheme文件可以包含下面的一种或者多种文件(当Scheme被载入的时候,它所包含的文件也将被载入并初始化):

a.       Imageset(either a full imageset via XML,or a single image via an imagefile)

b.       Font

c.       WindowSet

d.       windowRendererSet

e.       windowAlias

f.        FalagardMapping

ImagesetFont上面已经提到了,这里列举仅仅是为了说明scheme可以包含它们。

WindowSet——用来指明一个可载入模块(.dll,.so等)的名字,并列出它所使用的控件中你想注册控件的名字。如果没有列出任何控件名,那么模块中所有的控件都是要被注册的。

WindowRendererSet——指明一个可载入模块(.dll等)的名字,并列出它所使用的窗口渲染器(window renderer)中你想注册的窗口渲染器的名字。如果没有列出任何窗口渲染器名,那么模块中所有的窗口渲染器都将被注册。“窗口渲染器是一个可以控制基本窗口类型渲染的东西。所有的窗口渲染器都是利用”Falagard“蒙皮系统进行渲染的(尽管这不是必须的)。

WindowAlias——提供通过别名制定一个窗口/控件类型的方法。使用此方法,也可以用另一控件类型来“替代”一个已经注册的控件类型。这样就达到隐藏已经注册控件的效果。

FalagardMapping——用来创建一个可用的WindowType类型。包含三个部分:TargetType(指定基类(具有相关功能);Renderer(指定窗口渲染器,可以控制渲染指定的TargetType);LookNFeel(指定要使用的皮肤,一般通过XML格式的looknfeel文件指定)。

Layout——LayoutMXL格式描述一个窗口的布局。每个镶嵌的“window”元素定义一个要创建的窗口或者控件,“proterty”元素为每个定义的窗口设置相关属性。

Config——CEGUI支持使用配置文件。这个文件允许你定义一些默认参数,比如:默认载入的Scheme,默认载入的Layout,初始化和终止脚本文件(ScripModule中使用)。

载入基本的文件

想要成功显示GUI,你需要载入一些文件。至少要载入下面的这些:

l  Imageset

l  Font

l  SchemeScheme文件恩能自动的载入其他的两个文件)

CEUGI的资源管理】

    要想让CEGUI跑起来,至少要对CEGUI进行最基本的初始化,并调用System::renderGUI方法,这看起来是可以了,但是你这时候仍然不能让程序画出任何东西。因为你没有设置资源管理器组(resource provider groups),我们将使用它们来装载一些文件供CEGUI在渲染的时候使用。由此CEGUI使用了一个工具对象,我们叫它“ResourceProvider”,此对象提供了一组负责CEGUI与其它文件装载系统进行通信的接口。

注意:OgreIrrilicht(鬼火引擎)都有它们自己的资源/文件管理和装载子系统,通过实现特定的ResourceProvider对象,CEGUI的渲染模块就可以和那些子系统无缝的组合起来。那样,CEGUI的数据文件就可以通过那些子系统装载了,但是因为更底层的库(Direct3DOpenGL)没有那样的资源管理系统,所以,CEGUI为它们提供了可用的默认资源管理系统(default ResourceProvider

DefaultResourceProvider相关说明

CEGUI::DefaultResourceProvider——CEGUI默认的资源管理系统,是为那些目前还没有的库提供基础帮助的系统。它不仅提供了CEGUI装载文件、数据时候所需要的函数,而且对“资源组”(resource groups)也提供了初步的支持。这里的“资源组”其实是一个标签,它代表系统的某个文件夹路径。这就使得我们可以将文件夹中的文件按照其逻辑类型进行分组,然后可以通过一个简单的标签而不是硬编码的路径去指定它。也就是说:当数据文件的路径有所改动的时候,我们只需要更新资源组的路径而不需要更改代码和XML文件中的路径信息。

如何指定资源组和路径?

DefaultResour允许你定义任意数目的资源组,并为每一个资源组指定一个路径。也就是说:你可以创建一个资源组,比如“imagesets”,并为其指定一个路径,假设是“./datafiles/imagesets”。然后,当你通过imagesetManager装载imageset的时候,就可以指定”imagesets”为它将要使用的资源组。这样系统就会在预定义的路径中寻找资源。目前,每个资源组只能被赋予一个路径。

下面是用来说明这个例子的代码:

在你没有资源管理器的时候,你需要用下面的方法来找到资源:

Imageset *wlis=ImagesetManager::getSingleton().createImageset(./datafiles/imagesets/WindowsLook.imageset)

用了资源组以后,在初始化阶段,你可以用默认的资源管理器创建如下的资源组:

DefaultResourceProvider *rp=static_cast(CEGUI::System::getsingleton().getresourceprovider())

Rp->setResourceGroupDirectory(“imagesets”, ./datafiles/imagesets/WindowsLook.imageset);

然后,在你需要载入imageset的时候,你可以这样指定要使用的资源组:

Imageset *wlis=imagesetManager::getsingleton().createImageset(“WindowsLook.iamgeset”,”imagesets”);

注意:此时你不需要提供任何路径信息,因为在你指定的资源组里已经有了那样的路径。(同样要注意数据文件不应该包含任何的相对路径信息,一般他们只需要包含文件名)。

那么,CEGUI的默认资源组是什么呢?

系统定义的任何代表可装载资源的资源类,都有获取和设置默认资源组的静态函数。当需要载入数据文件的时候,它就用那个默认资源组。比如imageset类。默认的资源组应该指向一个存储imageset xml文件盒材质文件的文件夹。

对于每个资源类,它们获取、设置资源组的静态很熟的额名字都是一样的(xerces是个例外):

const String &getDefaultResourceGroup();

void setDefaultResourceGroupconst String &groupname);

如下是资源类的一个列表,后面是它们各自管理的资源类型:

CEGUI::imageset    –imageset xml and texture image files

CEGUI::Font        - Font xml and tff font files

CEGUI::Scheme        -Scheme xml files

CEGUI::WindowManager –Windowlayout xml files

CEGUI::WidgetLookManager –LookNFeel xml files

CEGUI::ScriptModule     -script files in whichever scripted language

设置完成了默认的资源路径以后,我们还需要设置默认的资源组如下

CEGUI::Imageset::setDefaultResourceGroup("imagesets");    
CEGUI::Font::setDefaultResourceGroup("fonts");    
CEGUI::Scheme::setDefaultResourceGroup("schemes");    
CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");    
CEGUI::WindowManager::setDefaultResourceGroup("layouts");    
CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");    

Ps:当你仅仅使用xercesXML解析器,并为它定义了一个资源组的时候使用

CEGUI::XercesParser::setSchemaDefaultResourceGroup("schemas");

OGRE中使用CEGUI

因为在Ogre自从1.7以后便不在自己的附加库中添加CEGUI作为界面库,所以在使用方面需要有一些不同的地方:

1)Ogre1.4的版本中,要添加cegui需要有两个如下的步骤进行初始化:

a.  创建渲染器:

mGUIRenderer=new CEGUI::OgreCEGUIRenderer(mWindow,Ogre::RENDER_QUEUE_OVERLAY,flase,1000,mSceneMgr);

b.  通过渲染器注册渲染系统

mGUISystem = new CEGUI::System(mGUIRenderer);

所以在之前的版本中你需要在程序中保留两个CEGUI相关句柄,一是其渲染器,一是其渲染系统。

而在Ogre1.7.x+CEGUI的初始化过程中,你只需要保留CEGUI中定义的OgreRenderer的句柄就可以了:

a.  通过

CEGUI::OgreRenderer &mGUIRenderere=CEGUI::OgreRenderer::bootstrapSystem();

b.  或者是

CEGUI::OgreRenderer &myRenderer=CEGUI::OgreRenderer::create();

    中选择其中一个来进行渲染系统的初始化。

2)接下来,要进行的就是设定默认的资源组的路径了,以为内使用了Ogre所以可以利用其本身的文件组织体系来定义组路径:

其方法就是在工程文件的Resources_d.cfg(如果是编译的话)中添加CEGUI的相关资源组的路径如下:

[Imagesets]

FileSystem=CEGUI_PATH/datafiles/imagesets

 

[Fonts]

FileSystem= CEGUI_PATH /datafiles/fonts

 

[Schemes]

FileSystem= CEGUI_PATH /datafiles/schemes

 

[LookNFeels]

FileSystem=ECEGUI_PATH /datafiles/looknfeel

 

[Layouts]

FileSystem= CEGUI_PATH /datafiles/layouts

然后就是在自己的工程文件中添加默认的资源组

    CEGUI::Imageset::setDefaultResourceGroup("Imagesets");//set default resources group

    CEGUI::Font::setDefaultResourceGroup("Fonts");

    CEGUI::Scheme::setDefaultResourceGroup("Schemes");

    CEGUI::WidgetLookManager::setDefaultResourceGroup("LookNFeels");

    CEGUI::WindowManager::setDefaultResourceGroup("Layouts");

3)做完了这些以后你就可以在自己的createScene中添加各种你所需要的CEGUI控件和窗口了,但需要注意的是,CEGUI仅仅是作为一个单纯的界面系统,并没有直接定义对于各种外设的响应,所以在使用CEGUI的时候需要利用OIS来得到外设的相关事件,并装换event处理成CEGUI的响应(在后面的文章中会详细介绍CEGUIOgre的外设事件转换)

4)在你的各种设置都完成了以后,千万不要忘记了在OGRE的析构函数中销毁你的CEGUI渲染系统,不然会造成内存的泄露,因为CEGUI本身并不会替用户销毁渲染器,�%

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值