Operating System: Windows 10
Render System: OpenGL 3+ Rendering Subsystem
Hi all
I'm rather new to Ogre3D and I want to get Dear ImGui working in my test app. So I used the Ogre's ImGuiDemo sample code as reference. Curiously, everything else seems to be working except that I can't type any characters into any of the textfield inputs.. ImGui appears to be receiving keypress events properly as "Keyboard, Mouse & Navigation" section in the DemoApp indicates.
Heck I can even select and clear (Backspace) already filled-in text in the DemoApp's "Focus from code" section, just not type in new characters
ImGui sample within SampleBrowser.exe seems to be working okay. Something must be done differently there. I have been scouring through the sources and tried everything but to no avail. Unfortunately, I can't use the SampleBrowser framework for my own app.
Has anyone managed to get ImGui working outside of the sample framework? I'd appreciate any help. Here's all the source code (Bootstrap.cpp) of my test app:
Code: Select all
#include "Ogre.h"
#include "OgreApplicationContext.h"
#include "OgreImGuiOverlay.h"
#include "OgreImGuiInputListener.h"
#include "OgreOverlaySystem.h"
#include "OgreTrays.h"
#include <iostream>
using namespace Ogre;
class MyTestApp :
public OgreBites::ApplicationContext,
public OgreBites::InputListener,
public OgreBites::TrayListener
{
std::unique_ptr<OgreBites::ImGuiInputListener> mImguiListener;
OgreBites::InputListenerChain mListenerChain;
public:
MyTestApp();
void setup();
bool keyPressed(const OgreBites::KeyboardEvent& evt);
bool keyReleased(const OgreBites::KeyboardEvent& evt) { return mListenerChain.keyReleased(evt); }
bool mouseMoved(const OgreBites::MouseMotionEvent& evt) { return mListenerChain.mouseMoved(evt); }
bool mouseWheelRolled(const OgreBites::MouseWheelEvent& evt) { return mListenerChain.mouseWheelRolled(evt); }
bool mousePressed(const OgreBites::MouseButtonEvent& evt) { return mListenerChain.mousePressed(evt); }
bool mouseReleased(const OgreBites::MouseButtonEvent& evt) { return mListenerChain.mouseReleased(evt); }
bool frameStarted(const Ogre::FrameEvent& evt);
bool frameRenderingQueued(const Ogre::FrameEvent& evt);
private:
LogManager *log;
OgreBites::TrayManager *mTrayManager;
};
MyTestApp::MyTestApp() : OgreBites::ApplicationContext("MyTestApp")
{
log = 0;
}
bool MyTestApp::keyPressed(const OgreBites::KeyboardEvent& evt)
{
if (mListenerChain.keyPressed(evt))
return true;
//mImguiListener.get()->keyPressed(evt);
if (evt.keysym.sym == OgreBites::SDLK_ESCAPE)
getRoot()->queueEndRendering();
return true;
}
bool MyTestApp::frameStarted(const Ogre::FrameEvent & evt)
{
ImGuiOverlay::NewFrame(evt);
ImGui::ShowDemoWindow();
// Pass to superclass
return OgreBites::ApplicationContext::frameStarted(evt);
}
bool MyTestApp::frameRenderingQueued(const Ogre::FrameEvent & evt)
{
mTrayManager->frameRendered(evt);
return OgreBites::ApplicationContext::frameRenderingQueued(evt);
}
void MyTestApp::setup(void)
{
OgreBites::ApplicationContext::setup();
log = LogManager::getSingletonPtr();
// get a pointer to the already created root
Ogre::Root* root = getRoot();
Ogre::SceneManager* scnMgr = root->createSceneManager();
// register our scene with the RTSS
Ogre::RTShader::ShaderGenerator* shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr();
shadergen->addSceneManager(scnMgr);
// also need to tell where we are
Ogre::SceneNode* camNode = scnMgr->getRootSceneNode()->createChildSceneNode();
Ogre::Camera* cam = scnMgr->createCamera("myCam");
cam->setNearClipDistance(2); // specific to this sample
cam->setAutoAspectRatio(true);
camNode->attachObject(cam);
getRenderWindow()->addViewport(cam);
// register our class for input events
addInputListener(this);
// Overlays
mTrayManager = new OgreBites::TrayManager("InterfaceName", getRenderWindow(), this);
scnMgr->addRenderQueueListener(getOverlaySystem()); // Enable drawing of Overlays
mTrayManager->showFrameStats(OgreBites::TrayLocation::TL_BOTTOMLEFT);
//
// ImGui
//
ImGuiOverlay *imguiOverlay = new ImGuiOverlay();
imguiOverlay->setZOrder(300);
imguiOverlay->show();
Ogre::OverlayManager::getSingleton().addOverlay(imguiOverlay); // now owned by overlaymgr
mImguiListener.reset(new OgreBites::ImGuiInputListener());
mListenerChain = OgreBites::InputListenerChain({ mTrayManager, mImguiListener.get() });
}
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst, LPSTR lpCmdLine, int nShowCmd)
{
MyTestApp app;
app.initApp();
app.getRoot()->startRendering();
app.closeApp();
return 0;
}