OSG与CEGUI集成过程

OSG与CEGUI集成过程最近做了一段时间的CEGUI和OSG之间的结合,有一点小小的收获。写一篇文章来记录所做的一点点事情。下面写一点CEGUI和OSG之间结合的东西。一.整体过程概述:CEGUI作为OSG的Drawable集成到OSG中。CEGUI继承osg::Drawable类,作为一个Drawable完成初始化,加入到一个节点中(osg::Geode)。然后将该节点在Viewerd执行realize()

大家好,又见面了,我是你们的朋友全栈君。

 最近做了一段时间的CEGUI和OSG之间的结合,有一点小小的收获。写一篇文章来记录所做的一点点事情。

下面写一点CEGUI和OSG之间结合的东西。

一.整体过程概述:

CEGUI作为OSGDrawable集成到OSG中。CEGUI继承osg::Drawable类,作为一个Drawable完成初始化,加入到一个节点中(osg::Geode)。然后将该节点在Viewerd执行realize()之后加入到osg::Group对象中。即可将CEGUI集成到OSG中。

示例过程代码:

int main()

{

    osgViewer::Viewer* viewer = new osgViewer::Viewer();

    osg::ref_ptr<osg::Group> gp = new osg::Group;

    gp->addChild(osgDB::readNodeFile("cow.osg"));

    viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);//设置单线程模式

    viewer->realize();

    viewer->getCamera()->getGraphicsContext()->makeCurrent();

    osg::ref_ptr<osg::Geode> gnode = new osg::Geode;

    osg::ref_ptr<osg::StateSet> stateset = gnode->getOrCreateStateSet();

    stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);//光线

    stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);//这个设置决定了是CEGUI窗口可以遮挡OSG模型处于最前面。

 

    osg::ref_ptr<CEGUIDrawable> cd = new CEGUIDrawable();

    gnode->addDrawable(cd.get());//Drawable加入到节点中

    cd->InitCEGUIScene();//CEGUI初始化

    //

    gp->addChild(gnode);

    viewer->getCamera()->getGraphicsContext()->releaseContext();

    viewer->setSceneData(gp);

    viewer->addEventHandler(new ChangeWindow);

    viewer->run();

    return 0;

}

 

 

二.CEGUI的绘制过程:

1.     在构造函数中初始化CEGUI的资源文件路径。包括以下7类资源文件(schemes;imagesets;fonts;looknfeel;layouts;lua_scripts;animations;)。经常修改使用的是imagesets和layouts。这个与窗口布局相关以及所使用的资源图片相关。

2.     读取所绘制的窗体的需要的资源。该资源读取过程有两种方式实现。

(1)    直接读取:

void CEGUIDrawable::InitCEGUIScene(){

    SchemeManager::getSingleton().create("Demo8.scheme");

    ImagesetManager::getSingleton().create("ToolbarIcons.imageset");

    WindowManager& winMgr = WindowManager::getSingleton ();

    Window* root = winMgr.loadWindowLayout("Toolbar.layout");

    System::getSingleton().setGUISheet(root);

    System::getSingleton().setDefaultTooltip("TaharezLook/Tooltip");

}

 

通过以上语句可以根据需要读取到自己需要的主题文件、图片集文件、布局文件。这样窗体绘制的文件读入完成。

    (2)间接读取:

void CEGUIDrawable::InitCEGUIScene()

{

    using namespace CEGUI;

    LuaScriptModule& scriptmod(LuaScriptModule::create());// create a script module.

    System::getSingleton().setScriptingModule(&scriptmod); // tell CEGUI to use this scripting module

    System::getSingleton().executeScriptFile("demo8.lua");// execute the demo8 script which controls the rest of this demo

}

 

    间接读取即CEGUI直接读取脚本文件,相关资源的读取以及相关事件的处理放到脚本文件中进行。脚本文件使用LUA编写。

3.通过以上两个步骤,CEGUI即绘制完成。在OSG的仿真循环方法realize()之后执行

viewer->getCamera()->getGraphicsContext()->makeCurrent();

    osg::ref_ptr<osg::Geode> gnode = new osg::Geode;

osg::ref_ptr<osg::StateSet> stateset = gnode->getOrCreateStateSet();

    stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);//光线

    stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);//这个设置决定了是CEGUI窗口可以遮挡OSG模型处于最前面。

 

    osg::ref_ptr<CEGUIDrawable> cd = new CEGUIDrawable();

    gnode->addDrawable(cd.get());//Drawable加入到节点中

    cd->InitCEGUIScene();//CEGUI初始化

    //

    gp->addChild(gnode);

 

便将CEGUI的绘制的窗体加入到了OSG中。

三.CEGUI窗体的绘制过程。

CEGUI支持两种方式的窗体绘制使用,一种就是直接在c++文件当中创建窗体,使用窗体;另一种方式就是在layout文件当中定制窗体。从理论上讲,两种方式都能达到相同的目的。  

在不使用layout文件时,CEGUI是不太方便的,因为要定位控件,常常得修改文件当中的参数,如果在c++文件当中修改,每次都需要编译。

代码实例:

(1)      直接绘制:

FrameWindow* wnd = (FrameWindow*)winMgr.createWindow("TaharezLook/FrameWindow", "Demo Window");

    root->addChildWindow(wnd);

    wnd->setPosition(UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f)));

    wnd->setSize(UVector2(cegui_reldim(0.5f), cegui_reldim( 0.5f)));

    wnd->setMaxSize(UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f)));

    wnd->setMinSize(UVector2(cegui_reldim(0.1f), cegui_reldim( 0.1f)));

    wnd->setText("Hello World!");

     Checkbox* check1 = static_cast<Checkbox*>(CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Checkbox", "Cessna1"));

     check1->setText("no selected1");

     check1->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.2)));

     check1->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.06)));

     wnd->addChildWindow(check1);

     Checkbox* check2 = static_cast<Checkbox*>(CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Checkbox", "Cessna2"));

     check2->setText("no selected2"); 

     check2->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.4)));

     check2->setSize(CEGUI::UVector2(cegui_reldim(0.3f), cegui_reldim(0.06)));

     wnd->addChildWindow(check2);

 

     CEGUI::Scrollbar* stn2 = static_cast<CEGUI::Scrollbar*>(CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/HorizontalScrollbar", "scrb"));

     wnd->addChildWindow(stn2);

     stn2->setPosition(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim(0.6)));

     stn2->setSize(CEGUI::UVector2(cegui_reldim(0.5f), cegui_reldim(0.06)));

     stn2->setStepSize(0.1);

     stn2->setOverlapSize(0.1);

OSG与CEGUI集成过程

(2)        间接绘制

CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton();

child =static_cast<CEGUI::FrameWindow*>(winMgr.loadWindowLayout("MeasureWindow.layout"));

 

使用布局文件编辑器编辑好布局后直接通过上述两句代码即可实现直接绘制所看到的效果图。所以布局文件的使用可以使得布局的设计变得方便。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163735.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 项目管理中wbs是什么_项目管理的wbs图的用途

    项目管理中wbs是什么_项目管理的wbs图的用途本文将项目管理的三个重要术语PBS、WBS和OBS作简要解读

    2022年8月31日
    4
  • 关于random()跟nextInt()方法过不了公司安评测试「建议收藏」

    关于random()跟nextInt()方法过不了公司安评测试「建议收藏」手上的项目最近过不了公司的安平测试,报告处理啊之后,发现问题竟然处在nextInt()跟random()两个方法上面,具体不通过的原因如下:大概意思就是,这两个系统自带的方法会导致安全信息泄露,因此禁止。然后我就进去查看具体代码,发现如下:没有进行任何的安全加密,只是验证码生成随机遮掩线条。安评测试的逻辑估计是只要调用这个方法都是不安全的,呵呵!!崩溃了,在线等C友建议如何改善了!…

    2022年7月21日
    23
  • srsLTE测试SDR频偏[通俗易懂]

    srsLTE测试SDR频偏[通俗易懂]1、在Android手机上使用网络信号大师确定当前连接基站的EARFCN。2、修改srsue的ue.conf中earfcn参数为手机连接的基站。3、启动srsue尝试接入,如果收不到基站或接入失败,可以调节ue.conf中的频偏(freq_offset)参数,可以从修改-15000到15000(可以5000为步进调节)不停重复尝试接入。4、能成功接入基站后,FoundCell信息中会有CFO参数,此参数即为频偏,然后再根据此值调试频偏值,频偏=频偏+CFO,比如CFO为-5.5k,频偏=频偏-

    2022年9月27日
    2
  • Bean @session_spring类方法注解

    Bean @session_spring类方法注解刚开始的时候,在controller层使用@RequestParam的时候,发现这个参数是必须要输入值的,但是我们有时候必须查询的时候允许参数为空,使用这个注解就不行了。在集成了swagger2后,找了半天的原因,发现使用@ApiImplicitParam这个注解可以解决这个问题。对应下面的参数。所以我们可以使用这个注解来解决我们所遇到的参考为空的问题。而且已经集成了swagger2,所以我们尽量…

    2025年8月8日
    2
  • verilog 移位寄存器与流水灯「建议收藏」

    verilog 移位寄存器与流水灯「建议收藏」用Verilog写一个简单的多功能移位寄存器,并在移位寄存器的基础上进行修改,利用移位功能形成流水灯的效果基本的功能如下:寄存器示意图见下方虚拟面板图有两种改进方式:第一种是把最后一个功能改成循环右移,即此功能模式下,按一下时钟按键(代表时钟信号到来),高三位往右移一位,最低位移动到最高位。按一次移位一次,形成流水灯效果第二种在第一种的基础上把按键时钟改成接入内部时钟,每隔一段时间时钟…

    2022年7月16日
    16
  • Mac 计算机的日常使用 和 从零开始搭建Python开发环境

    Mac 计算机的日常使用 和 从零开始搭建Python开发环境Mac计算机的日常使用和从零开始搭建Python开发环境本文作者:魏泯效率魔法师,最后更新时间:2019年1月10日在进行学习mac常用操作的时候,保证你的mac已经连接网络。目录&#

    2022年7月6日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号