Page 1 of 1

[Solved] CEGUI custom rendering

Posted: Sun Nov 12, 2017 15:19
by andrewfeng123
My goal is to draw a child window separately so that i can draw things in between the rendering process of GUI
my draw function looks something like this

Code: Select all

GetRenderer()->beginRendering();

Child->setVisible(0);                     //make it invisible first so that <Parent> doesn't draw it
Context->draw();                         //draw the context that contains <Parent>

/*
    draw stuff from my game
*/
Child->setVisible(1);
Child->activate();
Child->render();                         //doesn't draw anything

GetRenderer()->endRendering();


I also tried to draw Parent with the same method but without the disabling, nothing's on the screen.

I must be using Window::render() wrong and I can't find any information in the docs or in src that helps.

Re: CEGUI custom rendering

Posted: Sun Nov 12, 2017 16:42
by Ident
What is Child? What is Context?
(I can guess but I dont wanna guess wrong)

What speaks against doing your rendering by rendering to a texture and then using this texture as image for a Generic/Image widget in CEGUI for example?

Re: CEGUI custom rendering

Posted: Sun Nov 12, 2017 20:20
by andrewfeng123
I apologize for not making things clear,
Parent and Child are CEGUI::Window s,
Context is the CEGUI::GUIContext that contains Child and Parent.
Parent contains Child as a child window.

I want to separate the rendering of Parent and Child. RTT doesn't seem to do that because it draws the whole GUIContext.

That's why I was thinking about calling the CEGUI::Window::render().
Is such approach feasible in CEGUI?

Re: CEGUI custom rendering

Posted: Sun Nov 12, 2017 20:38
by Ident
Your overall goal with this is unclear to me. Can you please explain what you want to render in what way and most of all how it should look?

Re: CEGUI custom rendering

Posted: Sun Nov 12, 2017 22:22
by andrewfeng123
Okay, I need to draw my own content on top of the Parent window but beneath the Child window. The thing I want to draw is essentially a mask, that way the Child window looks special.

Imagine you are playing a game, a warning pops up and everything except for the warning window gets darker? I want that.

If you still don't get it. Here's the full story.

I have implemented a wrapper class for CEGUI::Window, lets call it "WidgetWindow".
A WidgetWindow is given a specific task and will return a specific value before its destruction.
One example would be the "Do you want to exit the game?" which returns true/false.
Another example would be the ColorPicker which collects user's input and returns 3 int values.

The reason I did this instead of using CEED to create a window and ... is that I need to be able to use these WidgetWindows from anywhere of the game. I don't want to copy and paste it to everywhere every time I need it...

Back to the story.

So I have the WidgetWindow which contains a CEGUI::Window.
My idea is that when a button is clicked, I attatch the WidgetWindow to the root CEGUI::Window so that It can receive user input from the root window's CEGUI::GUIContext without doing all the Inject input crap twice every frame.

There should be no problem if I only want that, but I also want to add some visual effects when some special kind of WidgetWindow is called.
Here's an example I found on the information superhighway.
Image

I know I can add it in the CEED editor but that means I need to added to every .layout file (StartMenu, GameScreen, Settings...). That's just not flexible so I want to do it on my side.

Re: CEGUI custom rendering

Posted: Thu Nov 16, 2017 21:38
by andrewfeng123
So does anyone know if Window::render() works? Or is there anything I need to call with it for it to work?

Re: CEGUI custom rendering

Posted: Thu Nov 16, 2017 21:43
by Ident
andrewfeng123 wrote:So does anyone know if Window::render() works? Or is there anything I need to call with it for it to work?

Sorry, I was busy these last days. I am going to reply to you tomorrow or saturday. This topic is something that requires me to look more into code before I can give a good answer, and I had no time yet due to my employment and other duties.

Re: CEGUI custom rendering

Posted: Thu Nov 16, 2017 22:11
by andrewfeng123
Ident wrote:
andrewfeng123 wrote:So does anyone know if Window::render() works? Or is there anything I need to call with it for it to work?

Sorry, I was busy these last days. I am going to reply to you tomorrow or saturday. This topic is something that requires me to look more into code before I can give a good answer, and I had no time yet due to my employment and other duties.


Thanks man ! I thought you forgot or something, please take your time!

Re: CEGUI custom rendering

Posted: Sat Nov 18, 2017 14:56
by andrewfeng123
Window::render() needs to be followed by a Window::getTargetRenderingSurface().draw()

however, this only works if the window has a RenderingSurface, from what I've tested, this only works for the root window of a context. (Since the root window is a DefaultWindow in CEED)

SO I TRIED--
A. Adding a RenderingSurface to the WidgetWindow by Window::setRenderingSurface(), the window successfully drew but it doesn't seem to take any input (no reaction, buttons freeze)

B. Adding a DefaultWindow to the .layout file of my WidgetWindow, the window also succesfully drew but this time... the DefaultWindow acts like a invisible barrier that blocks input to all other windows behind it...

Both attempts failed :x

Re: CEGUI custom rendering

Posted: Sun Nov 19, 2017 20:53
by Ident
Do I understand correctly that all you want is to "shadow" everything in the background of a dialog that requires input?

I think what you did is way too complicated for this, CEGUI can do these things easily without you having to dig into any rendering logic here. What you want to make is a window with relative size w:1 h:1 (fullscreen) that is a sibling of all the other windows you got attached to your root. This window shall be on top (we get to that later) and will shadow everything. By default a fullscreen window that is on top will steal away all input, so be careful when you follow the instructions i wrote below.

Here is how a hierarchy could for example look:

Code: Select all

CEGUI Root
|___ SomeWindow1
|___ SomeWindow2
|           |___ Text1
|        ....
|
|___NewWindowWithShadowingEffect (add this whenever is needed and remove it when it isnt needed)
            |___ DialogRootWindow


Now how to setup NewWindowWithShadowingEffect :
e.g. use a Generic/Image with an Image that is a 1x1 black pixel with alpha=1. Now you got this set up and attached it to your root window you should see all black. If not, maybe the window order isnt right, set it to AlwaysOnTop=true just to be sure. Set the window's alpha value to whatever you like in order to make it less black. Now this solution is simple and dynamic so you can easily change this at setup/runtime.

You still have to take care of your DialogRootWindowthough. You will attach this to this new shadowing-window so we can make that it will not be shadowed and also so it fits the whole input order. It will inherit the alpha by default. Change it so it doesnt inherit the alpha from the shadowing window by putting its "InheritAlpha" value to false. This will also mean that you can just attach windows normally and unchanged to your DialogRootWindow and their alpha will still not be affected by the alpha of NewWindowWithShadowingEffect, as DialogRootWindow already caught it and has the default alpha value itself.

To get rid of the shadow you can just detach NewWindowWithShadowingEffect which logically also detaches the dialog.

I hope this works for you, if not please tell me where you are stuck.

Re: CEGUI custom rendering

Posted: Mon Nov 20, 2017 23:30
by andrewfeng123
Thanks for your elegant solution! Lemme try that out.

I will post the full solution after I finish just in case.

Re: CEGUI custom rendering

Posted: Tue Nov 21, 2017 07:38
by Ident
The hierarchy was messed up in my post due to formatting, please check again as I now put it in code tags.

Re: CEGUI custom rendering

Posted: Fri Dec 01, 2017 15:57
by andrewfeng123
The goal is achieved!

I simply created a layout file with StaticImage, set alwaysOnTop = true;

I load this layout at the beginning and set it to invisible. Whenever I need a WidgetWindow that requires the shadow, I set the StaticImage to visible and add the WidgetWindow::window to the StaticImage as a Child.