Rendering to texture (RTT) in CEGUI

From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
Revision as of 19:05, 4 March 2014 by Ident (Talk | contribs)

Jump to: navigation, search

Written for CEGUI 0.8


Works with versions 0.8.x (stable)

Works with latest CEGUI stable!

Since version 0.8 the new GUIContext class allows it to render your CEGUI interface into a texture instead of rendering it normally into your main buffer.


CEGUI::System& ceguiSystem = CEGUI::System::getSingleton();
 
//Taking some random values as example for a GUIContext size.
int width = 1024;
int height = 800;
CEGUI::Sizef size(static_cast<float>(width), static_cast<float>(height));
 
// We create a CEGUI texture target and create a GUIContext that will use it.
CEGUI::TextureTarget* renderTextureTarget = ceguiSystem.getRenderer()->createTextureTarget();
CEGUI::GUIContext& renderGuiContext = ceguiSystem.createGUIContext(static_cast<CEGUI::RenderTarget&>(*renderTextureTarget) );
renderTextureTarget->declareRenderSize(size);
 
// We create a BasicImage and set the Texture
CEGUI::BasicImage* textureTargetImage = static_cast<CEGUI::BasicImage*>(&CEGUI::ImageManager::getSingleton().create("BasicImage", "MyTextureGroup/MyTextureName"));
textureTargetImage->setTexture(&renderTextureTarget->getTexture());
 
// We size the image using a function
setTextureTargetImageArea(textureTargetImage, static_cast<float>(width). static_cast<float>(height));

Here is the function for sizing the BasicImage:


void setTextureTargetImageArea(CEGUI::BasicImage* textureTargetImage, float width, float height)
{
    //Flipping is necessary due to differences between renderers regarding top or bottom being the origin
    bool isTextureTargetVerticallyFlipped = renderTextureTarget->isRenderingInverted();
    CEGUI::Rectf renderArea;
 
    if (isTextureTargetVerticallyFlipped)
        renderArea = CEGUI::Rectf(0.0f, height, width, 0.0f);
    else
        renderArea = CEGUI::Rectf(0.0f, 0.0f, width, height);
 
    textureTargetImage->setImageArea(renderArea);
}


If you want to retrieve the renderer-specific texture from a CEGUI texture you will need to cast it:

For example for OpenGL:

CEGUI::OpenGLTexture& glTexture = static_cast<CEGUI::OpenGLTexture&>(d_textureTarget->getTexture());

After that you can use the member function to receive whatever render-specific traits you need, such as the textureID in Opengl as an unsigned integer, etc.