patch: set renderqueue for mygui

tdev

25-01-2012 13:42:10

so, i added the ability to say mygui in what renderqueue it should render, see attached patch.

finally, we are able to render MyGUI in front of Ogre overlays :)


Index: Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h
===================================================================
--- Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h (revision 4357)
+++ Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h (working copy)
@@ -13,6 +13,7 @@
#include "MyGUI_RenderManager.h"

#include <Ogre.h>
+#include <OgreSimpleRenderable.h>

#include "MyGUI_LastHeader.h"

@@ -24,12 +25,13 @@
public IRenderTarget,
public Ogre::WindowEventListener,
public Ogre::RenderQueueListener,
- public Ogre::RenderSystem::Listener
+ public Ogre::RenderSystem::Listener,
+ public Ogre::SimpleRenderable
{
public:
OgreRenderManager();

- void initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene);
+ void initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene, Ogre::uint8 queueID = Ogre::RENDER_QUEUE_OVERLAY+1);
void shutdown();

static OgreRenderManager& getInstance();
@@ -92,6 +94,13 @@
virtual bool checkTexture(ITexture* _texture);
#endif

+
+ protected:
+ Ogre::uint8 mQueueID;
+ // Renderable stubs
+ Ogre::Real getSquaredViewDepth(const Ogre::Camera*) const { return 0; };
+ Ogre::Real getBoundingRadius() const { return 0; };
+
private:
virtual void renderQueueStarted(Ogre::uint8 queueGroupId, const Ogre::String& invocation, bool& skipThisInvocation);
virtual void renderQueueEnded(Ogre::uint8 queueGroupId, const Ogre::String& invocation, bool& repeatThisInvocation);
Index: Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp
===================================================================
--- Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp (revision 4357)
+++ Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp (working copy)
@@ -33,15 +33,18 @@
mRenderSystem(nullptr),
mIsInitialise(false),
mManualRender(false),
- mCountBatch(0)
+ mCountBatch(0),
+ mQueueID(Ogre::RENDER_QUEUE_OVERLAY+1)
{
}

- void OgreRenderManager::initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene)
+ void OgreRenderManager::initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene, Ogre::uint8 _queueID)
{
MYGUI_PLATFORM_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
MYGUI_PLATFORM_LOG(Info, "* Initialise: " << getClassTypeName());

+ mQueueID = _queueID;
+
mColorBlendMode.blendType = Ogre::LBT_COLOUR;
mColorBlendMode.source1 = Ogre::LBS_TEXTURE;
mColorBlendMode.source2 = Ogre::LBS_DIFFUSE;
@@ -151,6 +154,9 @@
{
mSceneManager->addRenderQueueListener(this);
}
+
+ // now add ourself to the correct renderqueue, so that ogre knows something is in that queue
+ mSceneManager->getRenderQueue()->addRenderable(this, mQueueID, 1);
}

void OgreRenderManager::setActiveViewport(unsigned short _num)
@@ -173,7 +179,7 @@
if (gui == nullptr)
return;

- if (Ogre::RENDER_QUEUE_OVERLAY != queueGroupId)
+ if (mQueueID != queueGroupId)
return;

Ogre::Viewport* viewport = mSceneManager->getCurrentViewport();

Altren

25-01-2012 16:46:37

Yeah, thank you. I noticed it in redmine already.

jsding

28-01-2012 14:12:17

Thanks. Good feature, But If can set renderquery group for each layer or even widget, may more great--> then able to blend normal Ogre scenenodes and mygui. :D

so, i added the ability to say mygui in what renderqueue it should render, see attached patch.

finally, we are able to render MyGUI in front of Ogre overlays :)


Index: Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h
===================================================================
--- Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h (revision 4357)
+++ Platforms/Ogre/OgrePlatform/include/MyGUI_OgreRenderManager.h (working copy)
@@ -13,6 +13,7 @@
#include "MyGUI_RenderManager.h"

#include <Ogre.h>
+#include <OgreSimpleRenderable.h>

#include "MyGUI_LastHeader.h"

@@ -24,12 +25,13 @@
public IRenderTarget,
public Ogre::WindowEventListener,
public Ogre::RenderQueueListener,
- public Ogre::RenderSystem::Listener
+ public Ogre::RenderSystem::Listener,
+ public Ogre::SimpleRenderable
{
public:
OgreRenderManager();

- void initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene);
+ void initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene, Ogre::uint8 queueID = Ogre::RENDER_QUEUE_OVERLAY+1);
void shutdown();

static OgreRenderManager& getInstance();
@@ -92,6 +94,13 @@
virtual bool checkTexture(ITexture* _texture);
#endif

+
+ protected:
+ Ogre::uint8 mQueueID;
+ // Renderable stubs
+ Ogre::Real getSquaredViewDepth(const Ogre::Camera*) const { return 0; };
+ Ogre::Real getBoundingRadius() const { return 0; };
+
private:
virtual void renderQueueStarted(Ogre::uint8 queueGroupId, const Ogre::String& invocation, bool& skipThisInvocation);
virtual void renderQueueEnded(Ogre::uint8 queueGroupId, const Ogre::String& invocation, bool& repeatThisInvocation);
Index: Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp
===================================================================
--- Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp (revision 4357)
+++ Platforms/Ogre/OgrePlatform/src/MyGUI_OgreRenderManager.cpp (working copy)
@@ -33,15 +33,18 @@
mRenderSystem(nullptr),
mIsInitialise(false),
mManualRender(false),
- mCountBatch(0)
+ mCountBatch(0),
+ mQueueID(Ogre::RENDER_QUEUE_OVERLAY+1)
{
}

- void OgreRenderManager::initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene)
+ void OgreRenderManager::initialise(Ogre::RenderWindow* _window, Ogre::SceneManager* _scene, Ogre::uint8 _queueID)
{
MYGUI_PLATFORM_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
MYGUI_PLATFORM_LOG(Info, "* Initialise: " << getClassTypeName());

+ mQueueID = _queueID;
+
mColorBlendMode.blendType = Ogre::LBT_COLOUR;
mColorBlendMode.source1 = Ogre::LBS_TEXTURE;
mColorBlendMode.source2 = Ogre::LBS_DIFFUSE;
@@ -151,6 +154,9 @@
{
mSceneManager->addRenderQueueListener(this);
}
+
+ // now add ourself to the correct renderqueue, so that ogre knows something is in that queue
+ mSceneManager->getRenderQueue()->addRenderable(this, mQueueID, 1);
}

void OgreRenderManager::setActiveViewport(unsigned short _num)
@@ -173,7 +179,7 @@
if (gui == nullptr)
return;

- if (Ogre::RENDER_QUEUE_OVERLAY != queueGroupId)
+ if (mQueueID != queueGroupId)
return;

Ogre::Viewport* viewport = mSceneManager->getCurrentViewport();

scrawl

07-02-2012 12:03:01

finally, we are able to render MyGUI in front of Ogre overlays
if you only need this, you could also put mygui on a transparent viewport on top of your other viewport(s)