网页功能: 加入收藏 设为首页 网站搜索  
本地化支持:OGRE+CEGUI中文输入:OGRE方面的问题
发表日期:2007-03-28作者:[转贴] 出处:  

 本文原文发表在http://www.ogre3d.org.cn
代码还没有上传上去,全文也没有写完,先转载过来一章,供大家拍砖。


本地化支持:OGRE+CEGUI中文输入:OGRE方面的问题
From OGRE 3D 中文网
Jump to: navigation, search
其实从许久以前的版本开始,CEGUI基本上已经成为官方制定的GUI系统,并在OGRE的演示程序中使用(能得到同等待遇的似乎只有ODE物理引擎)。 

而中文输入这种关联与GUI的事件,已经基本上和OGRE引擎没有多少关系了。但是这里仍然有几件事情需要我们注意。 


从CEGUI版本0.4.x 迁移到版本0.5.x 
OGRE 引擎对CEGUI的支持是通过一个叫做OgreGUIRenderer.dll的插件来完成的,你可以在OGRE提供的SDK中找到这个文件。不过到目前为止,官方之提供了对0.4.0版本CEGUI的支持。似乎为了保持版本的稳定性,目前还看不出来OGRE官方对这个插件的升级计划。 

0.4.0也是一个不错的CEGUI版本(我没有用过,纯属瞎说),但是对于中文支持有一个致命的弱点,那就是不支持分页对文字的读取。中文常用汉字就有上千个,再分为不同的字体,对内存的占用量是无法接受的。CEGUI版本0.5.0已经解决了这个问题。 

这时候就需要我们继承革命前辈“自己动手丰衣足食”的优良传统了。根据OGRE官方论坛提供的方法,我们对OgreGUIRenderer.dll插件进行一次手术。让其适配CEGUI版本0.5.x。 

首先需要下载OGRE引擎的源代码和相应的依赖包,我这里使用的平台是WindowsXP+Visual Studio2005(VC8.0)。 
解压完源代码并配置好依赖项目,你会看到OgreCEGUIRenderer项目(ogrenew\Samples\Common\CEGUIRenderer),然后进行如下修改: 

文件OgreCEGUITexture.h,第109行, 

virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight);
改为 

virtual void loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight, PixelFormat pixelFormat = CEGUI::Texture::PF_RGBA);


文件OgreCEGUITexture.cpp,第144行, 

void OgreCEGUITexture::loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight)
改为 

void OgreCEGUITexture::loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight, PixelFormat pixelFormat)


相同文件,第167行 

d_ogre_texture = TextureManager::getSingleton().loadRawData(getUniqueName(), "General", odc, buffWidth, buffHeight, PF_A8R8G8B8, TEX_TYPE_2D, 0, 1.0f);
改为 

d_ogre_texture = TextureManager::getSingleton().loadRawData(getUniqueName(), "General", odc, buffWidth, buffHeight, pixelFormat == CEGUI::Texture::PF_RGB ? PF_R8G8B8:PF_A8R8G8B8, TEX_TYPE_2D, 0, 1.0f);

然后去CEGUI网站上下载最新0.5.x版本的CEGUI库,覆盖OGRE相应的CEGUI依赖文件(包括头文件以及lib、dll文件)。编译生成新的OgreGUIRenderer.dll,如果你觉得这个过程很麻烦,那么可以到这里下载。 

后遗症是因为CEGUI版本接口的变动,之前OGRE所提供的Demo中使用CEGUI部分会无法编译通过。 

得到Win32系统消息 
我们这里有两种得到Win32系统消息的办法,一种是好的,一种是简单的。请根据实际情况选择相应的方法: 

好的方法 
OGRE 3D是一个跨平台的引擎,所以平台相关的操作自然要封装在具体的实现里面。这样就等于说,用户在使用中无法了解具体的平台相关信息。对于跨平台的设计来说这样做是合理的,但是对于一些需要得到系统消息的项目来说,就有一些特殊需要了。 

OGRE 项目并不是没有顾全到这种情况,因此提供了两种不同的创建窗口办法,简单的方法是Demo中所使用的,委托OGRE创建并维护窗口。另外一种方法是手动创建窗口,之后交给OGRE引擎用来渲染,并手动维护。手动维护窗口虽然比较麻烦,但是这样可以更自由的控制窗口,换句话说可以简单得得到任何窗口信息,包括消息。 

创建窗口不是一个困难的过程,但是却是麻烦。在这里交给读者作为作业来做吧(我还没抽出时间来实现呢)。然后通过下面的方法来初始化渲染窗口: 

//假设之前已经执行完创建窗口以及Ogre::Root对象的过程
//hWnd为窗口句柄,root为Ogre::Root类型实例
Ogre::NamevaluePairList params;//构造参数

std::stringstream ss;
ss<<hWnd;//窗口句柄
params["externalWindowHandle"] = ss.str();//把窗口句柄做为字符串形势设置到参数中

root->initialise(false);//Ogre::Root对象初始化参数为false,表示手动创建渲染窗口

//下面创建渲染窗口
Ogre::RenderWindow * window = _root->createRenderWindow("name", //名称
    width,//宽度
    height, //高度
    false, //是否全屏显示
    &params);


这样就能把手动创建的窗口交给Ogre进行渲染操作,代价是你作为窗口的拥有者应该管理窗口的一切行为。这是一个正规的方法,任何真正的项目都应该遵守尽量不要破坏库的封装。 

简单的方法 
也可以称作懒人的方法,或者免费打工仔偷懒的方法。极力不推荐,但这里的演示却是用它。我知道这有一些矛盾,但作为只是想要测试中文输入功能的工作来说,还勉强算说得过去。 

这种方法就是破坏OGRE引擎的封装,通过直接修改OGRE源代码来得到已经被封装好的Win32窗口消息。我不会在这做太多地介绍,因为你马上会看到相应的源代码,没有什么难度,只要覆盖OGRE工程中相应的文件就可以了。 

 http://ogre3d.org.cn/wiki/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%2BCEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:OGRE%E6%96%B9%E9%9D%A2%E7%9A%84%E9%97%AE%E9%A2%98


我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 本地化支持:OGRE+CEGUI中文输入:OGRE方面的问题
本类热点文章
  DDraw和D3D立即模式编程手册
  矩阵求逆的快速算法
  本地化支持:OGRE+CEGUI中文输入:OGRE方..
  Direct3D中实现图元的鼠标拾取
  3D场景中的圆形天空顶
  OpenGL显卡编程
  一种高效的基于大规模地形场景的OCCLUS..
  一个完善的读取3DS文件例子
  如何制作一个可控制的人体骨骼模型
  Direct3D 入门之我见
  Slope(斜坡) 法线生成算法,在地形渲染..
  在Direct3D中渲染文字
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00563