Page 1 of 1

CEGUI buttons on 2nd Ogre scene too?

Posted: Fri Sep 02, 2011 18:28
by mmixLinus
Hi All,

Ok, I've been staring and hacking for two weeks now, to no avail :D [CEGUI 0.7.4 Ogre 1.7.2]
(EDIT: Cross posted to the Ogre forums!)

Short: My goal is to have some CEGUI buttons/window rendered on top of a Viewport in a second Ogre Scene (which in turn is rendered to a texture).

Long:
To do this incrementally, to make sure everything is working, I've started by creating a second SceneManager with a viewport and camera, which I Render-to-texture. This texture, I subsequently show by setting the texture name of a TextureUnitState of an already existing material, to my "RTTName"-string. To make sure I'm seeing the right things, I set up a SkyDome (animated texture) and made the camera rotate in the XZ-plane. All this works. I also get the standard Ogre App Overlay on that second Scene/Viewport (which surprised me a bit). You know, FPS stat box and large OGRE text. So I see a "window into a different world with a moving sky and a rotating camera, and an Ogre Overlay...".

Finally I wanted to see a CEGUI FrameWindow on top of that scene. Nope. That didn't work. Here's the code. Note, I am already showing CEGUI windows and buttons in my SceneManager1/Viewport1.

Code: Select all

void CMMNode::setupOverlayRTT()
{
   USES_CONVERSION;
   CEGUI::WindowManager&   wmgr      = CEGUI::WindowManager::getSingleton();
   CEGUI::Window         *myRTTRoot   = wmgr.createWindow("DefaultWindow", "rtt_root");
   CEGUI::String         sLocalName   = STRING_CUBE_TO_CEGUI(m_sOverlayName);

   CEGUI::Window *pRealRoot = CEGUI::System::getSingleton().setGUISheet(myRTTRoot);

   m_OverlaySceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC, "RTTSceneMgr");
   {
      bool  bEnable = true;
      float fCurvature = 8.0f;
      float fTiling = 0.3f;
      float fDistance = 100.0f;
      m_OverlaySceneMgr->setSkyDome(bEnable, "Environment/SunilSky", fCurvature, fTiling, fDistance,
         true,
         Ogre::Quaternion::IDENTITY,
         24, 24);
   }

   m_pMyOverlay = static_cast<CEGUI::FrameWindow*>(wmgr.getWindow(sLocalName));      // for example "Overlay_Album"
   m_pMyOverlay->setProperty("AutoRenderingSurface", "True");
   m_pMyOverlay->show();
   m_pMyOverlay->isVisible();
   m_pMyOverlay->isActive();

   myRTTRoot->addChildWindow(m_pMyOverlay);
   myRTTRoot->setProperty("AutoRenderingSurface", "True");
   myRTTRoot->show();
   myRTTRoot->isVisible();
   myRTTRoot->isActive();

   m_OverlayCam = m_OverlaySceneMgr->createCamera("OverlayRTTCam");
   m_OverlayCam->setPosition(0, 0, 100);
   m_OverlayCam->lookAt(0, 0, 0);

   m_OverlayCam->setNearClipDistance(1.5f);
   m_OverlayCam->setFarClipDistance(3000.0f);
   m_OverlayCam->setAspectRatio(1.0f);

   const Ogre::String rttTexName = "R2TTex";
   const CEGUI::String rttImgName = "R2TImage";
   
   Ogre::TexturePtr cTex = Ogre::TextureManager::getSingleton().createManual(rttTexName,
      Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
      Ogre::TEX_TYPE_2D, 512, 512, 0,
      Ogre::PF_R8G8B8,
      Ogre::TU_RENDERTARGET);

   Ogre::RenderTexture *RTTRenderTarget = cTex->getBuffer()->getRenderTarget();
   RTTRenderTarget->addListener(this);
   CEGUI::OgreRenderer&   myRenderer = CEGUI::OgreRenderer::create(static_cast<Ogre::RenderTarget&>(*RTTRenderTarget));

   Ogre::Viewport *m_overlayViewport = RTTRenderTarget->addViewport(m_OverlayCam, 110);
   m_overlayViewport->setOverlaysEnabled(true);
   m_overlayViewport->setClearEveryFrame(false);
   m_overlayViewport->setBackgroundColour(Ogre::ColourValue::Red);

/* Not sure if I need this...
   CEGUI::Texture&      aRttTexture   = myRenderer.createTexture(cTex);
   CEGUI::Imageset&   imageSet   = CEGUI::ImagesetManager::getSingleton().create((CEGUI::utf8*)"R2TImageset", aRttTexture);
   imageSet.defineImage(rttImgName,
      CEGUI::Point(0.0f, 0.0f),
      CEGUI::Size(aRttTexture.getSize()),
      CEGUI::Point(0.0f,0.0f));

   Ogre::CompositorManager::getSingleton().addCompositor( m_overlayViewport, "Ogre/Scene" ) ;   // was Comp/GuiAlpha
    Ogre::CompositorManager::getSingleton().setCompositorEnabled( m_overlayViewport, "Ogre/Scene", true ) ;   // was Comp/GuiAlpha
*/
   CEGUI::System::getSingleton().setGUISheet(pRealRoot);
}


and once a frame I move the camera. At set up, I do a

Code: Select all

   pTUS->setTextureName(sImageName);
where sImageName is "R2TTex".

What about

Code: Select all

//   myRenderer->setDefaultRootRenderTarget(*RTTRenderTarget);
or

Code: Select all

//   myRenderer->setTargetSceneManager(mySceneManager);
?
setTargetSceneManager doesn't exist anymore I think. I have no interesting errors or exceptions in log files etc, so my CEGUI windows and objects exist.
I think I have managed to miss some sort of CEGUI->Ogre connection. Any ideas?

Image

Thanks!!! /Linus

Re: CEGUI buttons on 2nd Ogre scene too?

Posted: Sat Sep 03, 2011 23:41
by Kulik
We briefly discussed this on IRC:

Code: Select all

12:13 < Kulik> is this even possible? http://www.cegui.org.uk/phpBB2/viewtopic.php?f=2&t=5801
12:13 < Kulik> without resorting to RTT hacks
12:15 < CrazyEddie> Kulik: it depends if he wants different CEGUI on each Ogre VP or the same
12:15 < Kulik> well I guess he wants different GUISheet on each
12:16 < Kulik> what sense would it make to make them the same?
12:16  * CrazyEddie shrugs
12:17 < CrazyEddie> ok, then I think you have to control  your own rendering loop, call renderGUI manually, and swap gui sheets out in-between calls.  Or use RTT of some kind, as you said.
12:17 < CrazyEddie> in the first scenario, I mean you cann renderGUI >1 time
12:17 < CrazyEddie> call*
12:17 < CrazyEddie> fucking keyboard
12:17 < CrazyEddie> lol


There are 2 solutions:
- swapping GUI sheets between renders
- abusing RTT of some window

I will hopefully get back to this later but wanted to post this in here so it doesn't get lost/forgotten.

Re: CEGUI buttons on 2nd Ogre scene too?

Posted: Sun Sep 04, 2011 17:13
by mmixLinus
*Ahem* :lol:

Oki, thanks guys! I, really appreciate your time and effort!

As far as I'm concerned, that's a [SOLVED] :) - haven't tried it, but I'll go for "swapping GUI sheets between renders"!

Good work, thanks!
/Linus

PS Different GUIs

CEGUI buttons on 2nd Ogre scene too?

Posted: Mon Oct 24, 2011 20:25
by mmixLinus
Hi again,

(recap: I am trying to get CEGUI windows/objects rendered onto my objects in Ogre space)

So, I've been busy, but also had a little time to try it out. :wink:

My conclusion is that swapping GUI sheets is not enough (does not solve my issue). The problem being that System is using the same Renderer whatever GUI Sheet I set as root.

So, looking at a feasible solution (for me at least), what do you think of letting System have a vector of Renderers, and associate each renderer with the necessary unique attributes (d_activeSheet, ...). Then let renderGUI() loop all renderers (each with a root window). I am assuming each texture target will be an entry in this RendererList.
Then of course, setGUISheet could be overloaded to setGUISheet(Renderer* rttRenderer, Window* sheet) so the list can be edited.

Is there even a remote possibility this will work? And the things I haven't thought of are....?
Maybe this can be done without actually hacking System? Just "regular" things like System->setRenderer and System->setGUIsheet?

If something along these lines actually does work, I know what my next nightmare is: getting mouse coordinates mapped to this "warped texture in a different scene" :cry:

Thank you for your time. MUCH appreciated!

Re: CEGUI buttons on 2nd Ogre scene too?

Posted: Mon Oct 24, 2011 22:01
by Kulik
The proper way to solve this once and for all is to have proper multiple RenderingRoots. That way you would set a root widget / GUI sheet for each of these rendering roots and each would render to whatever you choose, render texture, screen, ... depending on the renderer.

But this can't go into 0.7 as it's a huge change. If it is to go into 0.8 it has to happen fairly fast. From what I've heard RenderingRoots are there in some shape but the API needs to be polished and tightened.

If you are interested in pursuing this, join #cegui @ freenode to discuss this, CrazyEddie usually hangs in there during the weekends, I should be able to reply daily but that depends, it may take hours before I get to reply.

Re: CEGUI buttons on 2nd Ogre scene too?

Posted: Fri Oct 28, 2011 10:47
by mmixLinus
Ok, it seems the basics needed will come in 0.8, or perhaps are there already. I will have to set aside some time to try out the development branch. Multiple RenderingRoots actually sounds like the solution, to me. Hope this is on the planned path : )

Thanks!

Re: CEGUI buttons on 2nd Ogre scene too?

Posted: Sat Oct 29, 2011 09:09
by CrazyEddie
As of this writing, the default branch (0.8) code is 99% the same as 0.7 with regards to the rendering situation. However this is one final area that I would like to see movement on before (or while) we freeze and polish things a bit ready for a 0.8.0 release (finally!). What results may not be the final version of the multiple rendering roots, but it should certainly be directly supported in some way. Once that's done and working, I'll likely post an article of some kind about it - so keep your eyes peeled for that over the next few weeks :)

CE.