Crazy Eddie's GUI System  0.8.1
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Pages
The Beginners Guide to Initialising CEGUI
Author
Paul D Turner

Introduction

In order to get CEGUI initialised and rendering – regardless of your target API or engine – there are basically three steps that need to be performed:

Obviously you also need to load some data and perform other basic initialisation, which is covered in The Beginners Guide to resource loading with ResourceProviders and The Beginners Guide to Data Files and Defaults Initialisation. You'll also need to get your inputs into the system so that you can interact with the GUI elements, this is covered in The Beginners Guide to Injecting Inputs.


The Easy Way: Renderer 'bootstrapSystem' functions

This section describes the quickest and easiest way to get CEGUI up and running, and that is to use the static 'bootstrap' helper functions that are available on the Renderer class for your chosen API or engine. Unless you're doing something advanced or otherwise unusual, these are the fuctions you'll want to use, since they enable the creation of all the initial CEGUI objects in a single call.

Note that the Renderers also have destroySystem functions for cleaning up afterwards.

The Ogre3D and Irrlicht engines each have their own intergrated file loading and image parsing functionality which CEGUI can seamlessly make use of via custom implementations of the CEGUI::ResourceProvider and CEGUI::ImageCodec interfaces. In order to make use of these implementations, the user would typically be required to create instances of these objects and pass them, along with the CEGUI::Renderer, to the System::create function. Since this over-complicates system construction for the majority of cases, the bootstrapSystem functions for those Renderers will create all the engine specific supporting objects automatically.

As stated above, when using the boostrapSystem functions, initialising CEGUI is as simple as a single function call:

OpenGL (Fixed Function)

OpenGL 3

Direct3D

Ogre3D

Irrlicht


The Hard Way: Manual object creation.

If for some reason you don't want to use the bootstrapSystem functions, you can still, of course, create all the required objects manually. The following describes the creation of the Renderer and System objects via separate calls. Note that if you have already used the boostrapSystem function, you do not need to perform the following steps, and can instead skip to Call the function to render the GUI


Create an instance of a CEGUI::Renderer based object

This is fairly straight forward and should pose no major obstacles for any of the supported renderers. You must of course remember to include the header file for the renderer that you will be using.

The basic renderer creation code is:

Direct3D 9

Direct3D 10

OpenGL (Fixed Function)

OpenGL 3

Ogre3D

Irrlicht Engine


Create the CEGUI::System object to initialise the system

Another extremely simple step. Just instantiate the CEGUI::System object by using the System::create function, passing in the reference to the CEGUI::Renderer that you created in the previous step. This will cause the core CEGUI system to initialise itself.

CEGUI::System::create( myRenderer );


Call the function to render the GUI

This is the only step that, depending upon your target engine, can be done differently. Basically what you need to do call the CEGUI::System::renderAllGUIContexts function at the end of your rendering loop. For users of the Ogre3D engine, this step is taken care of automatically. For everybody else, some simple example code can be seen below:

Direct3D 9

// Start the scene
myD3DDevice->BeginScene();
// clear display
myD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
// user function to draw 3D scene
draw3DScene();
// draw GUI
// end the scene
myD3DDevice->EndScene();
// finally present the frame.
myD3DDevice->Present(0, 0, 0, 0);

Direct3D 10

// define colour view will be cleared to
float clear_colour[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
// clear display
myD3DDevice->ClearRenderTargetView(myRenderTargetView, clear_colour);
// user function to draw 3D scene
draw3DScene();
// draw GUI
// present the newly drawn frame.
mySwapChain->Present(0, 0);

OpenGL

// user function to draw 3D scene
draw3DScene();
// make sure that before calling renderAllGUIContexts, that any bound textures
// and shaders used to render the scene above are disabled using
// glBindTexture(0) and glUseProgram(0) respectively also set
// glActiveTexture(GL_TEXTURE_0)
// draw GUI
// NB: When not using >=3.2 core profile, this call should not occur
// between glBegin/glEnd calls.

Irrlicht

// start the scene
myIrrlichtDriver->beginScene(true, true, irr::video::SColor(150,50,50,50));
// draw main scene
myIrrlichtSceneManager->drawAll();
// draw gui
// end the scene
myIrrlichtDriver->endScene();


Conclusion

This is the most basic introduction to setting up CEGUI to render. There are things not covered here, such as using different rendering targets in Ogre and advanced options such as user specified resource providers, and so on.