Page 1 of 3
Ogre ImGui binding
Posted: Tue Sep 06, 2016 1:00 pm
by Crashy
Hi everybody,
I've just released my quick and (not so) dirty integration of imgui in ogre. I'm using it with Ogre 2.0 and GL3+/D3D11 render systems,
but it may work with other ogre versions and/or D3d9 with minor modifications.
Now it works with Ogre 1.x too, and in D3D9, D3D11 & Gl 3+
Disclaimer: this is my very first release of open source code, so feel free to comment about improvements/fixes
http://bitbucket.org/LMCrashy/ogreimgui/overview
screenshot:
From the readme:
Integration
Create and init the ImguiManager after your Ogre init:
Code: Select all
ImguiManager::createSingleton();
ImguiManager::getSingleton().init(mSceneMgr,mOISKeyboardInput,mOISMouseInput);
Then in your render loop:
Code: Select all
ImguiManager::getSingleton().newFrame(getDeltaTime(), Ogre::Rect(0,0,_getRenderWindow()->getWidth(),_getRenderWindow()->getHeight()));
And voilĂ !
You can then use imgui just like you want.
Note
You'll also need to transfer input events from your OIS Input listener to the Imgui manager.
For example:
Code: Select all
bool MyInputManager::mouseMoved( const OIS::MouseEvent &arg )
{
Ogre::ImguiManager::getSingleton().mouseMoved(arg);
}
Re: Ogre ImGui binding
Posted: Tue Sep 06, 2016 3:53 pm
by insider
Excellent
Re: Ogre ImGui binding
Posted: Wed Sep 07, 2016 2:35 am
by hydexon
OH DEAR GOD, Thanks you so much!
Re: Ogre ImGui binding
Posted: Wed Sep 07, 2016 2:50 am
by xrgo
Fantastic!! thanks for sharing =D!
Re: Ogre ImGui binding
Posted: Wed Sep 07, 2016 8:43 am
by Crashy
Thanks for your positive feedback.
I've just made some changes to use unified gpu programs, and I can also confirm it works with the D3D11 Render System.
Re: Ogre ImGui binding
Posted: Fri Sep 09, 2016 10:11 am
by Crashy
Aaaand now I've fixed build issues with Ogre 1.x and added D3D9 shaders.
Re: Ogre ImGui binding
Posted: Sun Sep 18, 2016 8:50 pm
by chaos creator
A few days ago I saw your post, searched for ImGUI and was surprised that I haven't seen it earlier.
So I immediately started trying to port it to Ogre 2.1 since that's what I'm currently porting.
First of all, your code was very legible and easy to understand, without it I don't even know if I would have even tried writing my own binding
But unfortunately some things didn't work under Ogre 2.1
So first I tried doing everything the correct "v2 way" - which was way too complicated.
Using vao's and creating a movable object and renderables didn't work out for me (at least in the
short amout of time I spent on it)
(BTW, there is a bug in your GLSL shader where you output "ocol" in the vertexshader but try to input "col" in the fragmentshader)
One of the issues render queue listeners: only renderQueueStarted is called (for the Ogre overlays to work),
so the listeners are basically useless
Then I had to modify the setting of the used Pass to use a hlms macro- and blendblock.
Also the correct blend mode was ignored by the render system, so I had to set it manually.
I'm not exactly sure how much I changed in the end, but I suspect your version and my 2.1 port differ to much to bundle it into one repro (also I changed some things to my own coding style
)
Sooo.... I'll just show my own version
https://bitbucket.org/ChaosCreator/imgu ... inding/src
Usage
Just init ImguiManager once after you init Ogre:
Code: Select all
ImguiManager::getSingleton().init(mSceneManager);
... and that's about it.
No need to include anything else (besides the 4 source files)
Don't call Imgui::newFrame() or Imgui::render() or something similar, the ImguiManager does it for you.
Also be aware that it just renders the GUI in the middle of frameRenderingQueued.
Besides that: you can now call all your Imgui functions and the results are immediately shown.
Input
Nearly forgot to say...
You have to do that part yourself (at least for now)
I removed the OIS part as I'm using SDL. SDL has no listeners, so I see no point of handling input in the ImguiManager itself.
Basically you need to update the Imgui key- and mousestate within your own code, but that is completely unrelated to ogre.
And after all, the gui should also be seperated from the input system of your choise
@Crashy
I also use the Imgui clipping data to set the scissoring tests accordingly
You might look into that, but it means splitting the Renderables much more finely since clipping is performed on every Gui element
Re: Ogre ImGui binding
Posted: Thu Sep 29, 2016 12:02 am
by only_a_ptr
Yay! I was almost determined to begin researching and integrating DearImgui and OGRE myself, but now I can just remain lazy.
Many thanks for both the 2.0 and 2.1 variant.
Re: Ogre ImGui binding
Posted: Sun Oct 16, 2016 2:31 am
by hydexon
I have a little issue to trying it on Windows 10, OGRE 2.1/D3D11, OGRE throws an exception, about an sampler0 is not found when you set the named constant in ImGuiManager::createMaterial(), line 441.
The relevant log about the exception was:
Code: Select all
Invalid target for D3D11 shader 'imgui/VP/D3D9' - 'vs_2_0'
Invalid target for D3D11 shader 'imgui/FP/D3D9' - 'ps_2_0'
Exception thrown at 0x00007FFFFDCB7788 in DragoraCarbon.exe: Microsoft C++ exception: Ogre::InvalidParametersException at memory location 0x000000DED57CD510.
Unhandled exception at 0x00007FFFFDCB7788 in DragoraCarbon.exe: Microsoft C++ exception: Ogre::InvalidParametersException at memory location 0x000000DED57CD510.
i'm using the "chaos creator" version, i wonder why is using D3D9 as their default version when i'm using D3D11 version.
Re: Ogre ImGui binding
Posted: Sun Oct 23, 2016 1:33 pm
by einherjer
Same problem for me with the OGRE 2.1 version:
14:31:07: OGRE EXCEPTION(2:InvalidParametersException): Parameter called sampler0 does not exist. Known names are: in GpuProgramParameters::_findNamedConstantDefinition at C:\OgreSDK\OgreMain\src\OgreGpuProgramParams.cpp (line 2214)
If I am commeting out the following line
Code: Select all
mPass->getFragmentProgramParameters()->setNamedConstant("sampler0", 0);
I am getting the following error when trying to render the GUI:
14:40:49: OGRE EXCEPTION(3:RenderingAPIException): D3D11 device cannot draw indexed
Error Description:ID3D11DeviceContext::DrawIndexed: A Vertex Shader is always required when drawing, but none is currently bound.
Active OGRE vertex shader name: imgui/VP/D3D11
Active OGRE fragment shader name: imgui/FP/D3D11 in D3D11RenderSystem::_render at C:\OgreSDK\RenderSystems\Direct3D11\src\OgreD3D11RenderSystem.cpp (line 3330)
What are we doing wrong (OGRE 2.1, D3D11, 64 bit, statically linked)?
Re: Ogre ImGui binding
Posted: Fri Oct 28, 2016 12:09 pm
by chaos creator
Does it work under OpenGL?
I never used D3D11 because Ogre crashed even when I only included the Plugin.
Probably I should look into it, but because OpenGl is crossplattform I saw no problem in switching to it.
So unfortunatly right now I can't even search for the reason for the crash - but at least it was never guaranteed to work ;D
If you can try openGl I would be happy to hear if it worked
Re: Ogre ImGui binding
Posted: Fri Oct 28, 2016 10:55 pm
by hydexon
chaos creator wrote:Does it work under OpenGL?
I never used D3D11 because Ogre crashed even when I only included the Plugin.
Probably I should look into it, but because OpenGl is crossplattform I saw no problem in switching to it.
So unfortunatly right now I can't even search for the reason for the crash - but at least it was never guaranteed to work ;D
If you can try openGl I would be happy to hear if it worked
Doesn't work in OpenGL (in Windows), but unlike DX11, they don't crash but don't display anythying from ImGui ( called ImGui::ShowTestWindow() just after setting up ImGui ), the Log output throws OpenGL Error such GL_BIND something is invalid.
Re: Ogre ImGui binding
Posted: Wed Nov 02, 2016 3:29 pm
by john21wall
Hi guys, I am currently working with a program which implements terrain the same way it is implemented in the third basic tutorial. I have to add some effects which are easy done using material passes (fog_override so I have only fog where the terrain is and not above, caustics as animated texture), so I would love to use an .material file for this terrain. Is this somehow possible? Like if I would create an object using the entity-strategy described in basic tutorial 1.
Re: Ogre ImGui binding
Posted: Fri May 19, 2017 1:25 pm
by only_a_ptr
Hello.
I created a demo application to test the binding:
https://github.com/only-a-ptr/ogre-imgui-test. It's basically trimmed OgreWiki-TutFramework with ImGUI + the binding included.
With DirectX9, I get a blurry text and slightly misaligned elements - apparently the entire sizing is off, although settings are default.
- DirectX9
- Ogre.log
- DirectX9
- (15.06 KiB) Downloaded 193 times
With OpenGL,
UPDATE: I fixed the GLSL shader bug discovered by user <chaos creator> above. The rendering is now crisp
- but that only makes me more baffled by the DirectX issue.
I'm using Windows 7 x64, Visual Studio 2015 pro, OGRE 1.9 - rest is visible from the logs.
I'm quite baffled by the scaling issue of DirectX - can anyone enlighten me please? Note that so far I've only worked with LMCrashy's repository version of the binding, I haven't inspected the other modification (and mentioned bugs).
Re: Ogre ImGui binding
Posted: Wed May 24, 2017 8:48 pm
by only_a_ptr
Sorry for bumping, but attachment limit...
I tested again on a different machine (geForce videocard). Same issue. I'm attaching Ogre.log to show my full specs, and also a comparsion image of DirectX9 / OpenGL rendering result.
- closeup render output.
Anyone has an idea what's the problem?
Re: Ogre ImGui binding
Posted: Wed May 24, 2017 11:48 pm
by dark_sylinc
Looks like the D3D9 version isn't using the half-texel offset correction (whereas OGL & D3D11 don't need it)
Ogre 1.x provides how much offset to apply via RenderSystem::getHorizontalTexelOffset & RenderSystem::getVerticalTexelOffset and also via
texel_offsets auto binding for shaders.
I don't know anything about this ImGui port so I cannot help further. AFAIK ImGui already has a D3D9 backend, so it's very likely they already some facility to perform the texel offset, if so, it would be just a matter of telling ImGui to use it when D3D9 RenderSystem is active.
Cheers
Re: Ogre ImGui binding
Posted: Thu May 25, 2017 12:11 am
by Crashy
I'm gonna take a look as soon as I have some time left. I haven't tested the dx9 version that much.
ImGUi doesn't use any texture to render, so at least it's not a filtering issue, Dark Sylink is surely right about the texel offset.
I'm also going to fix that glsl little bug, it works fine on my nVidia card but I know in/out variable naming is important on some hardware.
Re: Ogre ImGui binding
Posted: Fri May 26, 2017 11:53 am
by devxkh
I've tried to implement imgui with a movable object without luck. Seems to be a projectionmatrix problem, that i don't understand.
Maybe someone else is interrested and is able to solve this.
http://www.ogre3d.org/forums/viewtopic. ... 05#p536905
Re: Ogre ImGui binding
Posted: Mon May 29, 2017 1:37 pm
by only_a_ptr
@dark_sylinc: Thanks for the pointer -
problem solved, code published in my test repo
Once I learned what to look for, it wasn't hard to find it in ImGui's DirectX9 sample:
header comment and
the projection matrix
@Crashy: Feel free to grab anything from my test repo!
Re: Ogre ImGui binding
Posted: Fri Jun 02, 2017 4:34 pm
by only_a_ptr
BUMP!
Another issue: Font rendering. Only the built-in bitmap font "ProggyClean" works OK, any TTF font will come out distorted.
DirectX9 looks worst. OpenGL is better, but also broken.
Re: Ogre ImGui binding
Posted: Sat Jun 03, 2017 12:42 pm
by Crashy
Hi,
thanks, i've merged your changes into my repo, and also fixed the glsl shader.
I'll try to use another font and tell you my results.
Re: Ogre ImGui binding
Posted: Sat Jun 03, 2017 7:29 pm
by Crashy
BTW, how are you adding the extra-fonts ?
Could you please also output & post it the generated atlas ?
Just add this at the end of ImguiManager::createFontTexture
Code: Select all
Ogre::Image dst;
mFontTex->convertToImage(dst,false);
dst.save("f:/font.tga");
Re: Ogre ImGui binding
Posted: Mon Jun 05, 2017 9:09 am
by only_a_ptr
@crashy
- For the DirectX9 sample, I uncommented
this line (plus the `GetIO()` one) and changed font filename.
- For my testbed, I added the same line
at the top of `createFontTexture()` function.
I have image-dump code
in there already, but I don't think the image atlas is the problem. Here's a side-by-side comparsion screenshot with ImGui's Dx9 demo - the textures look perfectly equivalent:
Here's the dumped texture anyway (white font on transparent BG, so it's OK to appear blank
):
- dumped image atlas texture
Re: Ogre ImGui binding
Posted: Mon Jun 05, 2017 9:13 pm
by Crashy
Okay. At least my atlas is the same as yours.
But I don't have any glyph visible here using GL3+ RS. I'm looking for a fix.
Re: Ogre ImGui binding
Posted: Fri Jun 16, 2017 6:59 am
by Crashy
Ok, I think I've found the issue, at least on GL*
It was just a filtering issue, just as I expected, see this changeset:
https://bitbucket.org/LMCrashy/ogreimgu ... fd8f0ce036
Please tell me if that fixed your bug.