查看: 2026|回复: 8

请教关于osgxi工程里osgCEGUI的问题

[复制链接]

该用户从未签到

发表于 2011-9-19 22:24:45 | 显示全部楼层 |阅读模式
osgCEGUI的System类是一个单例。这样的设计能否满足如下需求:同一个程序,有两个标签可以使程序切换到两个完全不同的3d场景,每个场景中都应有到了CEGUI。这样的需求只用一个System单例可以吗?或者说用这种模式的话,会不会在某些情况下不适用?因为刚接触CEGUI,对这东西完全不熟,还请高手解答。

该用户从未签到

 楼主| 发表于 2011-9-20 10:34:27 | 显示全部楼层
cegui自身很多地方用到了单例模式,所以osgxi中system类即便设计成普通类应该也没什么用,所以作者才为了方便设计成了单例了吧(个人猜测)。那么这样的话,我上面提到的情况cegui能否实现。

该用户从未签到

发表于 2011-9-21 08:56:29 | 显示全部楼层
简单来说,cegui就是这种脑残,它完全不适合处理多线程的情形。我个人预测它未来会因此走向死路

该用户从未签到

发表于 2012-1-11 11:05:12 | 显示全部楼层
本帖最后由 xzll77 于 2012-1-11 11:06 编辑

我也想问这个问题,代码中,在sys节点只能加载一个layout文件,可是我想加载多个实现不同界面之间的调用,应该怎么改啊?

代码如下:
  1. class myCBK
  2.         :public osgCEGUI::SystemInitCallback
  3. {
  4. public:
  5. protected:
  6. private:
  7. };

  8. int main()
  9. {
  10.         // FIXME: we must set a CEGUI path to help our application find data files; otherwise it will crash.
  11.         // At present we just use the last path in OSG_FILE_PATH to temporarily make it work. This must be
  12.         // done before calling initSystem().
  13.         osgDB::FilePathList& filePaths = osgDB::getDataFilePathList();
  14.         osgCEGUI::setDataFilePath( filePaths.back() );

  15.         //setup viewer
  16.         osgViewer::Viewer viewer;
  17.         osg::Group* root = new osg::Group();
  18.         viewer.setSceneData(root);
  19.         //viewer.setLightingMode(osg::View::NO_LIGHT);
  20.         //viewer.setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);

  21.         //load cow.osg
  22.         root->addChild(osgDB::readNodeFile("cow.osg"));
  23.        
  24.         //create CEGUI System
  25.         osgCEGUI::System::initSystem();
  26.         osgCEGUI::System* sys = osgCEGUI::System::getSystemInstence();
  27.         sys->setSystemInitCallback(new myCBK());
  28.        
  29.         osg::Camera* cam = new osg::Camera();
  30.         cam->addChild(sys->getNode());
  31.         cam->setClearMask(GL_DEPTH_BUFFER_BIT);
  32.         cam->setRenderOrder(osg::Camera::POST_RENDER);
  33.         root->addChild(cam);

  34.         //load layout
  35.         sys->loadScheme("VanillaSkin.scheme");
  36.         sys->loadFont("MSyahei.font");
  37.         sys->loadLayout("VanillaWindows_CN.layout");//这里只能加载一次       
  38.                 //sys->loadLayout("test.layout");
  39.        
  40.         // add the thread model handler
  41.         viewer.addEventHandler(new osgViewer::ThreadingHandler);

  42.         // add the state manipulator
  43.         viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
  44.         // add the stats handler
  45.         viewer.addEventHandler(new osgViewer::StatsHandler);

  46.     return viewer.run();
  47. }
复制代码

该用户从未签到

发表于 2012-1-19 12:41:51 | 显示全部楼层
还想问,在这种框架下用什么函数实现对窗口的隐藏?对于CEGUI:Window*类型可以用->setVisible(false),但是在这里好像不适用。

该用户从未签到

发表于 2012-1-30 09:26:16 | 显示全部楼层
为何不适用

该用户从未签到

发表于 2012-1-31 11:01:54 | 显示全部楼层
array 发表于 2012-1-30 09:26
为何不适用

没有system->setVisible(false)这个函数,不知道怎么写呢?

关键是请问在这个框架下能不能加载多个layout文件?因为我想实现多个界面之间的切换,可现在system只能加载一个界面。

该用户从未签到

发表于 2012-2-3 09:44:02 | 显示全部楼层
我认为这纯粹是cegui的开发问题了,您可以浏览一下它相关的例子

该用户从未签到

发表于 2013-1-27 14:15:22 | 显示全部楼层
由于是单线程所以不能用 您可以设置一个bool变量然后 在帧函数里做相应的改变
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表