CEGUI与OSG结合相关问题总结

   

本文内容已经移至我最新的个人博客,欢迎大家到我的新网站交流学习。 查看文章请点我。















































































































 最近搞了一段时间的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");


 

 

你可能感兴趣的:(CEGUI与OSG结合相关问题总结)