本文内容已经移至我最新的个人博客,欢迎大家到我的新网站交流学习。 查看文章请点我。
最近搞了一段时间的CEGUI和OSG的结合,感觉问题好多,虽然最后有点成果,但是做的还是太浅,所以写此文来记录所遇到的问题。
本人所用的CEGUI版本为0.7.5 OSG的版本为3.1.1 版本不同可能会造成不少问题,下面有部分关于版本的问题介绍。
一、 头文件错误问题
头文件<RendererModules/OpenGLGUIRenderer/openglrenderer.h>
在新版本中改为<RendererModules/OpenGL/CEGUIOpenGLRenderer.h>
二、 语句更改问题
语句new CEGUI::System(new CEGUI::OpenGLRenderer(0));
在新版本中改为&CEGUI::OpenGLRenderer::bootstrapSystem();
三、 OSG嵌入到CEGUI中,鼠标位置不正确问题
将OSG嵌入到CEGUI中的时候,会导致鼠标定位不准确的问题。原因是OSG和CEGUI的坐标系的Y坐标是相反的。所以要在CEGUI继承的osgGA::GUIEventHandler类的handle方法中用屏幕的分辨率减去得到的鼠标的纵坐标。比如:屏幕分辨率为1366*768,用到坐标的语句要写成
CEGUI::System::getSingleton().injectMousePosition(ea.getX(), 768-ea.getY());
四、CEGUI单线程问题
因为CEGUI是单线程的,所以只有设置单线程才能编译通过。设置单线程的语句为:viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
五、realize()函数的位置以及上下文设置问题。
再将OSG和CEGUI结合起来的时候,需要把CEGUI的东西放在realise()函数之后。而且还需要获得上下文信息。语句如下:
viewer->realize(); viewer->getCamera()->getGraphicsContext()->makeCurrent();
下面再添加CEGUI的东西。
六、CEGUI添加到OSG中后不显示子控件和字体的问题。
当CEGUI绘制好界面后加入到OSG中,可能会出现某些子控件无法显示的问题,比如菜单栏的各菜单按钮无法显示、文本框上按钮的文字无法显示。解决方案为添加语句,设置几个属性值,代码如下。
osg::ref_ptr<osg::StateSet>stateset= gnode->getOrCreateStateSet(); stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
七、在CEGUI中使用LUA脚本问题
在CEGUI中可以使用LUA脚本来完成绘制UI和添加事件的功能。使用LUA脚本之前需要导入脚本的类库--CEGUILuaScriptModule.lib、添加脚本头文件--<ScriptingModules/LuaScriptModule/CEGUILua.h>、
添加语句:
LuaScriptModule& scriptmod(LuaScriptModule::create()); System::getSingleton().setScriptingModule(&scriptmod); System::getSingleton().executeScriptFile("脚本名称.lua");
八、在OSG中添加CEGUI的理论问题
在OSG中添加CEGUI其实是将CEGUI的东西看成是一个drawable添加到OSG中。所以,CEGUI要继承OSG的osg::Drawable类,并且drawable要添加到一个Geode(节点)中,再将Geode添加到一个Group(组)中。
九、CEGUI中文显示问题
要在CEGUI中显示中文,需要先去windows文件夹Font目录下拷贝一个中文字体到CEGUI的datafiles文件夹下的fonts目录下,比如拷贝的是宋体的字体文件,拷贝完成后文件并不叫宋体,而是一段英文,比如叫abc.ttf。然后在fonts目录下随便找一个后缀为font的文件复制一下,将名字改成abc.font。打开abc.font文件,将其中的Name属性改成abc, Filename属性改成abc.ttf。然后再去schemes目录下你程序用的schemes文件打开将Font 属性下的filename改成刚才的字体文件。然后在程序中加入如下方法:
CEGUI::utf8* CEGUIDrawable::changeChinese(std::wstring str){ std::wstring aa=str; char buff[128]=""; WideCharToMultiByte(CP_UTF8,0,aa.c_str(),aa.size(),buff,sizeof(buff),0,0); return (CEGUI::utf8*)buff; }
调用如下:比如有一个叫root的窗口要设置文字。
root->setText(changeChinese(L”中文”));
中文字符串前一定要加一个L。
十、CEGUI加入到OSG中时,makeCurrent()方法报错问题。
当CEGUI加入到OSG中时,可能makeCurrent()方法会报错。这时要在CEGUI的代码部分后面加一个releaseContext()方法。也就是所有CEGUI的内容都写在makeCurrent()与releaseContext()之间。
十一、CEGUI初始化资源路径语句变更问题
在CEGUI 0.75中,初始化资源路径的语句由:
CEGUI::SchemeManager::getSingleton().loadScheme("TaharezLook.scheme") CEGUI::ImagesetManager::getSingleton().getImageset("TaharezLook") CEGUI::FontManager::getSingleton().createFont("DejaVuSans-10.font");
变更为:
CEGUI::SchemeManager::getSingleton().create("TaharezLook.scheme") CEGUI::ImagesetManager::getSingleton().get("TaharezLook"); CEGUI::FontManager::getSingleton().create("DejaVuSans-10.font");