ogre如何渲染CEGUI

通过阅读CEGUIOgreRender的源代码,有如下收获:


   CEGUI是这样来初始化的:
mGUIRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
mGUISystem = &CEGUI::System::getSingleton();
CEGUI::SchemeManager::getSingleton().create("TaharezLookSkin.scheme");
mGUISystem->setDefaultMouseCursor("TaharezLook", "MouseArrow");
CEGUI::MouseCursor::getSingleton().setImage("TaharezLook","MouseArrow"); 
CEGUI::System::getSingleton().setDefaultTooltip( "TaharezLook/Tooltip" );
CEGUI::FontManager::getSingleton().create("SimHei-12.font");
mGUISystem->setDefaultFont("SimHei-12");


//设置mainsheet,其他CEGUI窗口要被渲染需要作为mainsheet的子窗口才行。
CEGUI::Window *MainSheet=CEGUI::WindowManager::getSingleton().loadWindowLayout("MainSheet.layout");
mGUISystem->setGUISheet(MainSheet); 
MainSheet->show();


   这个bootstrapSystem()首先判断System::getSingletonPtr()是否已经存在了,如果存在抛出异常。
   然后:
OgreRenderer& renderer = create(); //new一个OgreRender对象
    OgreResourceProvider& rp = createOgreResourceProvider();
    OgreImageCodec& ic = createOgreImageCodec();
    System::create(renderer, &rp, static_cast<XMLParser*>(0), &ic);


构造OgreRender对象的时候先检查Ogre是否已经初始化了,然后得到RenderTarget的宽高,
创建缺省的OgreWindowTarget和RenderingRoot,然后比较重要的是
添加了Ogre::Root的帧监听器,这个帧监听器重写了frameRenderingQueued。这个函数是在所有ogre 的视口都渲染完之后,swapbuffer之前被调用。
在这个frameRenderingQueued里面调用了System的renderGUI()。来渲染CEGUI的所有东西。
     看看这个renderGUI()做了什么:
调用OgreRender的beginRendering();
这个函数得到先前的视口和先前视口的投影矩阵。
调用activeSheet->render();渲染MainSheet窗口,这就是为什么CEGUI要设置MainSheet窗口了
这里只调用activeSheet的render(),也就是只渲染mainsheet这个窗口,所以如果其他窗口要能够渲染出来
必须作为mainsheet窗口的子窗口。

然后调用了CEGUI::RenderingRoot的draw()函数,
画完所有窗口之后,画光标调用:MouseCursor::getSingleton().draw();,所以CEGUI的光标总是在其他窗口之上。


最后调用OgreRender的endRendering();
这个函数恢复渲染系统以前的视口和透视矩阵和view矩阵。


   注意CEGUI::System对象构造的时候调用了setlocale(LC_NUMERIC, "C");设置了local




   看看OgreRender的变量:
static String d_rendererID;
Size d_displaySize;
Vector2 d_displayDPI;
RenderingRoot* d_defaultRoot; //缺省的Root
OgreWindowTarget* d_defaultTarget; //缺省的RenderTarget
TextureTargetList d_textureTargets; //所有纹理目标:OgreTextureTarget*
GeometryBufferList d_geometryBuffers; //所有几何缓存:OgreGeometryBuffer*
TextureList d_textures; //所有纹理OgreTexture*
uint d_maxTextureSize;   //最大纹理大小初始化为2048


Ogre::Root* d_ogreRoot;
Ogre::RenderSystem* d_renderSystem;
Ogre::Viewport* d_previousVP; //ogre的root,rendersystem,viewport


Ogre::Viewport* d_previousVP; //前一个视口
Ogre::Matrix4 d_previousProjMatrix; //先前的投影矩阵
BlendMode d_activeBlendMode; //混合模式
bool d_makeFrameControlCalls; //_beginFrame and _endFrame是否被调用

你可能感兴趣的:(ogre如何渲染CEGUI)