cegui0.7.5 必须添加代码 setDefaultFont。设置 默认字体。 用0.6的 就没用就可以显示中文...浪费半天时间 惨啊。
也可以改变scheme文件 。。也可以 用代码可以这样写:
CEGUI::FontManager::getSingleton().createFreeTypeFont("JianTi", 12/*pt*/, true, "msyh.ttf");
CEGUI::System::getSingleton().setDefaultFont("simfang-12");
全部代码 如下。
CEGUIEventCallback.h
#pragma once #include<osgViewer/Viewer> #include<osgDB/ReadFile> #include <osgViewer/ViewerEventHandlers> #include <osgGA/StateSetManipulator> #include <osgGA/TrackballManipulator> #include <osg/ShapeDrawable> #include <osg/ImageSequence> #include<CEGUISystem.h> //#include <RendererModules/OpenGL/OpenGLRenderer.h> //#include <RendererModules/OpenGL/CEGUIOpenGL.h> //#include <RendererModules/OpenGLguirenderer/OpenGLRenderer.h> #include <osg/Geode> #include <CEGUIScriptModule.h> #include <CEGUIFontManager.h> #include <CEGUISchemeManager.h> #include <CEGUIWindowManager.h> #include <CEGUIExceptions.h> #include <CEGUIimageset.h> #include <CEGUIFont.h> #include <CEGUIScheme.h> #include <CEGUIDefaultResourceProvider.h> #include <CEGUIWidgetModule.h> #include <falagard/CEGUIFalWidgetLookManager.h> #include <elements/CEGUIPushButton.h> struct CEGUIEventCallback : public osgGA::GUIEventHandler { CEGUIEventCallback() {} /** do customized Event code. */ virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv){ float x = ea.getX(); float y = ea.getY(); bool injectionRetVal = false; // CEGUI wants 0,0 in the top left corner; osg has 0,0 in the bottom left corner y = ea.getWindowHeight() - y; switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::DRAG): { injectionRetVal = CEGUI::System::getSingleton().injectMousePosition(x, y); break; } case(osgGA::GUIEventAdapter::MOVE): { CEGUI::System::getSingleton().injectMousePosition(x,y); break; } case(osgGA::GUIEventAdapter::PUSH): { CEGUI::System::getSingleton().injectMousePosition(x, y); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton); break; } case(osgGA::GUIEventAdapter::RELEASE): { CEGUI::System::getSingleton().injectMousePosition(x, y); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right injectionRetVal = CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton); break; } case(osgGA::GUIEventAdapter::DOUBLECLICK): { CEGUI::System::getSingleton().injectMousePosition(x, y); if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON) // left CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton); else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) // middle CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton); else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) // right CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton); break; } case(osgGA::GUIEventAdapter::KEYDOWN): { injectionRetVal = CEGUI::System::getSingleton().injectKeyDown( static_cast<CEGUI::uint>(ea.getKey()) ); injectionRetVal = injectionRetVal || CEGUI::System::getSingleton().injectChar( static_cast<CEGUI::utf32>( ea.getKey() ) ); break; } case(osgGA::GUIEventAdapter::KEYUP): injectionRetVal = CEGUI::System::getSingleton().injectKeyUp( static_cast<CEGUI::uint>(ea.getKey()) ); break; default: break; } CEGUI::Window* window = CEGUI::System::getSingleton().getGUISheet()->getCaptureWindow(); if (window && window->getParent()) { return injectionRetVal; } // do not consume the event, forward on to osg::Viewer return false; } virtual void accept(osgGA::GUIEventHandlerVisitor& v) { v.visit(*this); } };
CEGUIDrawable.h
#pragma once #include "CEGUIEventCallback.h" #include<osgViewer/Viewer> #include<osgDB/ReadFile> //#include "MyDriveManipulator.h" //#include "CameraManipulator.h" #include <osgViewer/ViewerEventHandlers> #include <osgGA/StateSetManipulator> #include <osgGA/TrackballManipulator> #include <osg/ShapeDrawable> #include<CEGUISystem.h> #include <RendererModules/OpenGL/CEGUIOpenGLRenderer.h> //#include <RendererModules/OpenGLguirenderer/OpenGLRenderer.h> #include <RendererModules/OpenGL/CEGUIOpenGL.h> #include <osg/Geode> #include <CEGUI.h> #include <CEGUIScriptModule.h> #include <CEGUIFontManager.h> #include <CEGUISchemeManager.h> #include <CEGUIWindowManager.h> #include "CEGUIAnimationManager.h" #include "CEGUIAnimationInstance.h" #include <CEGUIExceptions.h> #include <CEGUIimageset.h> #include <CEGUIFont.h> #include <CEGUIScheme.h> #include <CEGUIDefaultResourceProvider.h> #include <CEGUIWidgetModule.h> #include <falagard/CEGUIFalWidgetLookManager.h> #include <elements/CEGUIPushButton.h> #include <elements/CEGUIRadioButton.h> #include <elements/CEGUICheckbox.h> #include <osgGA/AnimationPathManipulator> class CEGUIDrawable : public osg::Drawable { public: CEGUIDrawable(); /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ CEGUIDrawable(const CEGUIDrawable& drawable,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): Drawable(drawable,copyop) {} META_Object(osg,CEGUIDrawable); void loadScheme(const std::string& scheme); void loadFont(const std::string& font); void loadLayout(const std::string& layout); void drawImplementation(osg::RenderInfo& renderInfo) const; osg::Camera* createHUD(int width, int height); protected: void initializeResourceDirs(); void setDefaultResourceGroups(); virtual ~CEGUIDrawable(); unsigned int _activeContextID; };
CEGUIDrawable.cpp
#include "CEGUIDrawable.h" #include <osg/PositionAttitudeTransform> CEGUIDrawable::CEGUIDrawable() { setSupportsDisplayList(false); setEventCallback(new CEGUIEventCallback()); // Create an OpenGLRenderer object that uses the current GL viewport as // the default output surface. CEGUI::OpenGLRenderer& myRenderer = CEGUI::OpenGLRenderer::create(); CEGUI::System::create(myRenderer); // clearing this queue actually makes sure it's created(!) myRenderer.getDefaultRenderingRoot().clearGeometry(CEGUI::RQ_OVERLAY); // initialise the required dirs for the DefaultResourceProvider initializeResourceDirs(); setDefaultResourceGroups(); CEGUI::SchemeManager::getSingleton().create("TaharezLook.scheme"); //CEGUI::FontManager::getSingleton().create("simfang-12.font"); CEGUI::System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow"); CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton(); CEGUI::Window* myRoot = wmgr.createWindow( "DefaultWindow", "root" ); CEGUI::System::getSingleton().setGUISheet( myRoot ); //CEGUI::FontManager::getSingleton().createFreeTypeFont("JianTi", 12/*pt*/, true, "msyh.ttf"); CEGUI::System::getSingleton().setDefaultFont("simfang-12"); //CEGUI::FrameWindow* fWnd = static_cast<CEGUI::FrameWindow*>(wmgr.createWindow( "TaharezLook/FrameWindow", "testWindow" )); //fWnd->setProperty("Alpha", "0.8"); //myRoot->addChildWindow( fWnd ); //// position a quarter of the way in from the top-left of parent. //fWnd->setPosition( CEGUI::UVector2( CEGUI::UDim( 0.25f, 0 ), CEGUI::UDim( 0.25f, 0 ) ) ); ////// set size to be half the size of the parent //fWnd->setSize(CEGUI::UVector2(cegui_reldim(0.25f), cegui_reldim( 0.25f))); //fWnd->setMaxSize(CEGUI::UVector2(cegui_reldim(1.0f), cegui_reldim( 1.0f))); //fWnd->setMinSize(CEGUI::UVector2(cegui_reldim(0.1f), cegui_reldim( 0.1f))); //fWnd->setText( "Hello World!" ); std::wstring swstt = L"帮助"; char buff[128] = ""; WideCharToMultiByte(CP_UTF8,0,swstt.c_str(),swstt.size(),buff,sizeof(buff),0,0); CEGUI::Window* buttonEast = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Button"); buttonEast->setPosition(CEGUI::UVector2(cegui_reldim(0.2f),cegui_reldim(0.1f))); buttonEast->setSize(CEGUI::UVector2(cegui_absdim(161),cegui_absdim(50))); buttonEast->setText((CEGUI::utf8*)buff); myRoot->addChildWindow(buttonEast); // //加入 帮助 对话框 std::wstring sws = L"帮助"; char buffee[128] = ""; WideCharToMultiByte(CP_UTF8,0,sws.c_str(),sws.size(),buffee,sizeof(buffee),0,0); //创建提示窗口 CEGUI::WindowManager& winMgr = CEGUI::WindowManager::getSingleton(); CEGUI::Window* mDialogHelp = (CEGUI::Window*)winMgr.createWindow("TaharezLook/FrameWindow","help"); mDialogHelp->setPosition(CEGUI::UVector2(cegui_reldim(0.25f),cegui_reldim(0.25f))); mDialogHelp->setSize(CEGUI::UVector2(cegui_reldim(0.5f),cegui_reldim(0.5f))); mDialogHelp->setMaxSize(CEGUI::UVector2(cegui_reldim(1.0f),cegui_reldim(1.0f))); mDialogHelp->setMinSize(CEGUI::UVector2(cegui_reldim(0.1f),cegui_reldim(0.1f))); mDialogHelp->setText((CEGUI::utf8*)buff); mDialogHelp->setProperty("Alpha","0.80"); myRoot->addChildWindow(mDialogHelp); CEGUI::Window* helpText = CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/StaticText"); helpText->setProperty("VertFormatting", "TopAligned");//设置顶对齐 std::wstring swstr = L"操作说明: \n漫游操作控制:\n前 W键 后 S键\n左 A键 右 D键 \n摄像机旋转:按鼠标左键\n加速:+,减速:-\n上升:Q 下降:E\n\n\nF2:隐藏界面 F5:截图 \n帮助:F1\n退出:ESC."; char buffw[256] = ""; WideCharToMultiByte(CP_UTF8,0,swstr.c_str(),swstr.size(),buffw,sizeof(buffw),0,0); helpText->setText((CEGUI::utf8*)buffw); helpText->setAlpha(0.8); //helpText->setProperty("BackgroundColours", "tl: FFFF0000 tr:FFFF0000 bl:FFFF0000 br:FFFF0000" ); helpText->setPosition(CEGUI::UVector2(cegui_reldim(0.1f),cegui_reldim(0.1f))); helpText->setSize(CEGUI::UVector2(cegui_reldim(0.8f),cegui_reldim(0.8f))); mDialogHelp->addChildWindow(helpText); // _activeContextID = 0; } CEGUIDrawable::~CEGUIDrawable() { CEGUI::System::getSingleton().destroy(); } void CEGUIDrawable::initializeResourceDirs() { CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*> (CEGUI::System::getSingleton().getResourceProvider()); // update to the directory for your datafiles -- sample datafiles are available with the CEGUI SDK download rp->setResourceGroupDirectory("schemes", "F:/work/september/debug/resources/datafiles/schemes/"); rp->setResourceGroupDirectory("imagesets", "F:/work/september/debug/resources/datafiles/imagesets/"); rp->setResourceGroupDirectory("fonts", "F:/work/september/debug/resources/datafiles/fonts/"); rp->setResourceGroupDirectory("layouts", "F:/work/september/debug/resources/datafiles/layouts/"); rp->setResourceGroupDirectory("looknfeels", "F:/work/september/debug/resources/datafiles/looknfeel/"); rp->setResourceGroupDirectory("lua_scripts", "F:/work/september/debug/resources/datafiles/lua_scripts/"); rp->setResourceGroupDirectory("local_schemes", "F:/work/september/debug/resources/datafiles/schemes/"); rp->setResourceGroupDirectory("local_imagesets", "F:/work/september/debug/resources/datafiles/imagesets/"); rp->setResourceGroupDirectory("local_fonts", "F:/work/september/debug/resources/datafiles/fonts/"); rp->setResourceGroupDirectory("local_layouts", "F:/work/september/debug/resources/datafiles/layouts/"); rp->setResourceGroupDirectory("local_looknfeels", "F:/work/september/debug/resources/datafiles/looknfeel/"); rp->setResourceGroupDirectory("local_lua_scripts", "F:/work/september/debug/resources/datafiles/lua_scripts/"); // This is only really needed if you are using Xerces and need to // specify the schemas location rp->setResourceGroupDirectory("schemas", "F:/work/september/debug/resources/datafiles/xml_schemas/"); } void CEGUIDrawable::setDefaultResourceGroups() { CEGUI::Imageset::setDefaultResourceGroup("imagesets"); CEGUI::Font::setDefaultResourceGroup("fonts"); CEGUI::Scheme::setDefaultResourceGroup("schemes"); CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels"); CEGUI::WindowManager::setDefaultResourceGroup("layouts"); CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts"); } void CEGUIDrawable::loadFont(const std::string& font) { try { CEGUI::Font& f = CEGUI::FontManager::getSingleton().create(font); } catch (CEGUI::Exception e) { std::cout<<"CEGUIDrawable::loadFont Error: "<<e.getMessage()<<std::endl; } } void CEGUIDrawable::loadScheme(const std::string& scheme) { try { CEGUI::Scheme& f = CEGUI::SchemeManager::getSingleton().create(scheme); } catch (CEGUI::Exception e) { std::cout<<"CEGUIDrawable::loadScheme Error: "<<e.getMessage()<<std::endl; } } void CEGUIDrawable::loadLayout(const std::string& layout) { try { CEGUI::Window* myRoot = CEGUI::WindowManager::getSingleton().loadWindowLayout(layout.c_str()); CEGUI::System::getSingleton().setGUISheet(myRoot); } catch (CEGUI::Exception e) { std::cout<<"CEGUIDrawable::loadLayout error: "<<e.getMessage()<<std::endl; } } void CEGUIDrawable::drawImplementation(osg::RenderInfo& renderInfo) const { osg::State* state = renderInfo.getState(); if (state->getContextID()!=_activeContextID) return; glPushAttrib(GL_ALL_ATTRIB_BITS); state->disableAllVertexArrays(); CEGUI::System::getSingleton().renderGUI(); glPopAttrib(); state->checkGLErrors("CEGUIDrawable::drawImplementation"); }
main.cpp
#include <osgGA/GUIEventHandler> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgDB/ReadFile> #include <osgGA/GUIEventAdapter> #include <osgGA/GUIEventHandler> #include <osg/Drawable> #include <osg/Camera> #include <osg/PagedLOD> #include <RendererModules/OpenGL/CEGUIOpenGL.h> #include <RendererModules/OpenGL/CEGUIOpenGLRenderer.h> #include <osg/Depth> #include <iostream> #include "CEGUIDrawable.h" osg::Camera* createHUD(int width, int height) { // create a camera to set up the projection and model view matrices, and the subgraph to draw in the HUD osg::Camera* camera = new osg::Camera; // set the projection matrix camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width,0,height)); // set the view matrix camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); camera->setViewMatrix(osg::Matrix::identity()); // only clear the depth buffer camera->setClearMask(GL_DEPTH_BUFFER_BIT); // draw subgraph after main camera view. // The bin order is set to an arbitrarily large number to ensure that // there is no conflict with other post rendering activity (e.g., osgEarth) camera->setRenderOrder(osg::Camera::POST_RENDER/*, 10000*/); // we don't want the camera to grab event focus from the viewers main camera(s). camera->setAllowEventFocus(false); return camera; } int main(int argc, char** argv) { osgViewer::Viewer viewer; //viewer.getCamera()->setClearColor(osg::Vec4(0.f,0.f,0.f,1.f)); viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer.realize(); viewer.getCamera()->getGraphicsContext()->makeCurrent(); osgViewer::Viewer::Windows windows; viewer.getWindows(windows); if (windows.empty()) { return 1; } osg::Node* node = osgDB::readNodeFile("F:\\work\\lou.osgt"); //osg::Node* node2 = osgDB::readNodeFile("C:\\Users\\Administrator.PC-20110818ERIO\\Desktop\\test\\fz-plod.ive"); osg::Group* root = new osg::Group(); root->addChild(node); // root->addChild(node2); osg::ref_ptr<osg::Geode> geode = new osg::Geode; osg::ref_ptr<CEGUIDrawable> cd = new CEGUIDrawable(); geode->addDrawable(cd.get()); osg::StateSet* ss = geode->getOrCreateStateSet(); ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF); ss->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON); osg::Depth* depth = new osg::Depth(osg::Depth::LESS,0.0,1.0,false); ss->setAttributeAndModes(depth); // separate camera created to separate the 3d scene from the 2d GUI osg::Camera* hudCam = createHUD(windows[0]->getTraits()->width, windows[0]->getTraits()->height); hudCam->setGraphicsContext(windows[0]); hudCam->setViewport(0,0,windows[0]->getTraits()->width, windows[0]->getTraits()->height); viewer.addSlave(hudCam, false); hudCam->addChild(geode); viewer.setSceneData( root ); return viewer.run(); }