[Orxonox-commit 3651] r8336 - code/branches/kicklib2/src/libraries/core

rgrieder at orxonox.net rgrieder at orxonox.net
Tue Apr 26 06:49:50 CEST 2011


Author: rgrieder
Date: 2011-04-26 06:49:49 +0200 (Tue, 26 Apr 2011)
New Revision: 8336

Modified:
   code/branches/kicklib2/src/libraries/core/GUIManager.cc
   code/branches/kicklib2/src/libraries/core/GUIManager.h
Log:
Added solution to the rendering order problem proposed by Crazy Eddie. However the GUI is still drawn on top of the overlays.
However if you click on "Singleplayer", then get back to the main menu and now open the console, you will see part of it inside the Singleplayer button :D

Modified: code/branches/kicklib2/src/libraries/core/GUIManager.cc
===================================================================
--- code/branches/kicklib2/src/libraries/core/GUIManager.cc	2011-04-26 04:43:42 UTC (rev 8335)
+++ code/branches/kicklib2/src/libraries/core/GUIManager.cc	2011-04-26 04:49:49 UTC (rev 8336)
@@ -56,6 +56,9 @@
 #  include <RendererModules/Ogre/CEGUIOgreImageCodec.h>
 #  include <RendererModules/Ogre/CEGUIOgreRenderer.h>
 #  include <RendererModules/Ogre/CEGUIOgreResourceProvider.h>
+#  include <OgreCamera.h>
+#  include <OgreRenderQueueListener.h>
+#  include <OgreSceneManager.h>
 #endif
 
 #include "util/Clock.h"
@@ -108,9 +111,9 @@
     /** Class with the same memory layout as CEGUI::LuaScriptModule. <br>
         We need this to fix a problem with an uninitialised member variable
         in CEGUI < 0.7 <br>
-        Notice that "public" modifier for the otherwise private variables.
+        Notice the "public" modifier for the otherwise private variables.
     */
-    class CEGUILUA_API LuaScriptModuleWorkaround : public CEGUI::ScriptModule
+    class LuaScriptModuleWorkaround : public CEGUI::ScriptModule
     {
     public:
         LuaScriptModuleWorkaround();
@@ -124,6 +127,18 @@
         CEGUI::String d_activeErrFuncName;
         int d_activeErrFuncIndex;
     };
+#else
+    /// RenderQueueListener based class used to hook into the ogre rendering system
+    class RQListener : public Ogre::RenderQueueListener
+    {
+    public:
+        /// Callback from Ogre invoked before other stuff in our target queue is rendered
+        void renderQueueEnded(Ogre::uint8 id, const Ogre::String& invocation, bool& skipThisQueue)
+        {
+            if (id == Ogre::RENDER_QUEUE_SKIES_LATE)//Ogre::RENDER_QUEUE_OVERLAY)
+                CEGUI::System::getSingleton().renderGUI();
+        }
+    };
 #endif
 
     static CEGUI::MouseButton convertButton(MouseButtonCode::ByEnum button);
@@ -170,6 +185,9 @@
         resourceProvider_ = guiRenderer_->createResourceProvider();
 #else
         guiRenderer_ = &OgreRenderer::create(*GraphicsManager::getInstance().getRenderWindow());
+        // We use our own RenderQueueListener so we can draw UNDER overlays
+        guiRenderer_->setFrameControlExecutionEnabled(false);
+        rqListener_ = new RQListener();
         resourceProvider_ = &OgreRenderer::createOgreResourceProvider();
         imageCodec_ = &OgreRenderer::createOgreImageCodec();
 #endif
@@ -244,11 +262,12 @@
         delete scriptModule_;
 #else
         System::destroy();
-        delete ceguiLogger_;
         OgreRenderer::destroyOgreResourceProvider(*resourceProvider_);
         OgreRenderer::destroyOgreImageCodec(*imageCodec_);
         OgreRenderer::destroy(*guiRenderer_);
         LuaScriptModule::destroy(*scriptModule_);
+        delete ceguiLogger_;
+        delete rqListener_;
 #endif
         delete luaState_;
     }
@@ -291,13 +310,18 @@
     */
     void GUIManager::setCamera(Ogre::Camera* camera)
     {
-        this->camera_ = camera;
 #ifdef ORXONOX_OLD_CEGUI
         if (camera == NULL)
             this->guiRenderer_->setTargetSceneManager(0);
         else
             this->guiRenderer_->setTargetSceneManager(camera->getSceneManager());
+#else
+        if (camera_ != NULL && camera_->getSceneManager() != NULL)
+            camera_->getSceneManager()->removeRenderQueueListener(rqListener_);
+        if (camera != NULL && camera->getSceneManager() != NULL)
+            camera->getSceneManager()->addRenderQueueListener(rqListener_);
 #endif
+        this->camera_ = camera;
     }
 
     /**

Modified: code/branches/kicklib2/src/libraries/core/GUIManager.h
===================================================================
--- code/branches/kicklib2/src/libraries/core/GUIManager.h	2011-04-26 04:43:42 UTC (rev 8335)
+++ code/branches/kicklib2/src/libraries/core/GUIManager.h	2011-04-26 04:49:49 UTC (rev 8336)
@@ -164,6 +164,7 @@
         CEGUI::ResourceProvider*             resourceProvider_; //!< CEGUI's resource provider
 #else
         CEGUI::OgreRenderer*                 guiRenderer_;      //!< CEGUI's interface to the Ogre Engine
+        Ogre::RenderQueueListener*           rqListener_;       //!< RQ listener so we can draw UNDER Ogre overlays
         CEGUI::OgreResourceProvider*         resourceProvider_; //!< CEGUI's resource provider
         CEGUI::OgreImageCodec*               imageCodec_;
 #endif




More information about the Orxonox-commit mailing list