ManualObject 2D         Demonstrates an easy way to use ManualObject for creating 2D overlays

Note: You should use a material that has lighting and depth write turned off for this to behave correctly. See Displaying 2D Backgrounds for an example how to set up such a material programmatically.

// Create a manual object for 2D
ManualObject* manual = mSceneMgr->createManualObject("manual");

// Use identity view/projection matrices
manual->setUseIdentityProjection(true);
manual->setUseIdentityView(true);

manual->begin("BaseWhiteNoLighting", RenderOperation::OT_LINE_STRIP);

manual->position(-0.2, -0.2, 0.0);
manual->position( 0.2, -0.2, 0.0);
manual->position( 0.2,  0.2, 0.0);
manual->position(-0.2,  0.2, 0.0);

manual->index(0);
manual->index(1);
manual->index(2);
manual->index(3);
manual->index(0);

manual->end();

// Use infinite AAB to always stay visible
AxisAlignedBox aabInf;
aabInf.setInfinite();
manual->setBoundingBox(aabInf);

// Render just before overlays
manual->setRenderQueueGroup(RENDER_QUEUE_OVERLAY - 1);

// Attach to scene
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(manual);

Gives an outlined rectangle in the middle of the screen that is always visible.

Note: If you want to create empty manual object sections first and then later on fill those sections with geometry data, you need to initialise section with all the vertex components you intend to use (position, texture coordinate, normal etc.)

If you do not do this, uninitialised vertex components will be discarded later on when you try to update your manual object.

// Create a manual object that is filled later on during the runtime
manual->begin("UI/Element", Ogre::RenderOperation::OT_TRIANGLE_LIST);
        manual->position(x2, y2);
        manual->textureCoord(1, 1);
        manual->position(x2, y);
        manual->textureCoord(1, 0);
        manual->position(x, y);
        manual->textureCoord(0, 0);
manual->end();

// Fill during the runtime normally
// Texture coordinates will generated because they were present
// in the buffer created by first call to end()
manual->beginUpdate(sectionId);
        manual->position(x2, y2);
        manual->textureCoord(1, 1);
        manual->position(x2, y);
        manual->textureCoord(1, 0);
        manual->position(x, y);
        manual->textureCoord(0, 0);
manual->end();


See also


Alias: ManualObject_2D