Skip to main content

History: QtOgre

Preview of version: 19

Note: There is a recent QOgreWidget written by djbe that is tested on Mac and Linux: http://www.ogre3d.org/phpBB2/viewtopic.php?p=258064 Alanic
However the links pointing to this version are not valid anymore. A code snippet working on Mac OSX 10.6 with Cocoa, Qt 4.7.4 and Ogre 1.7.3 was inserted below.
For a similar thread specific to Mac see http://www.ogre3d.org/forums/viewtopic.php?f=2&t=62967.

I found this documentation: Lakin's Ogre-Qt.

It is for Linux.. I prefer to do my development on my Windows machine (it has more ram / better video) and when I develop on Windows I use Visual Studio. As such, these instructions are priceless.

Once you have Qt built and you've set up your environment variables, you can run qmake on Ogre-Qt to get a vcproj. Open that up in visual studio and the first thing you'll have to do is add the OGRE include directory to the C++ Additional Include Directories. If you try to build now you will see some errors like this:

Copy to clipboard
1>c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/tools/qhash.h(175) : error C2872: 'uint' : ambiguous symbol 1> could be 'c:\qt-4.2.3-msvc2005\include\qtcore\../../src/corelib/global/qglobal.h(632) : unsigned int uint' 1> or 'c:\ogresdk\include\OgrePrerequisites.h(134) : Ogre::uint'


There's a whole bunch of these, you need to add :: to the front of any reference to uint in the Qt code. You shouldn't need to recompile Qt after you do this.

Then you need to add the OGRE lib directory to the Linker Additional Library Directories and add OgreMain.lib to Linker Inputs.

For the debug configuration you will want to do the same but use OgreMain_d.lib.

Of course, so far my success rate hasn't been too high.

An Example using QT4 and Ogre Eihort

This is a standard QT Widget with an Ogre instance in it. You can create one on QT's designer by elevating a regular widget to an "OgreWidget" and including ogrewidget.h in your project. You'll probably want to do something about the chooseRenderer() function, since it doesn't really do much right now. I generally derive another class from this one and reimplement chooseRenderer(), and build my world in that class. Good Luck with it!

ogrewidget.h:

Copy to clipboard
#ifndef __OGREWIDGET_H__ #define __OGREWIDGET_H__ #include <OGRE/Ogre.h> #include <QGLWidget> #include <QX11Info> class OgreWidget : public QGLWidget { //Q_OBJECT; public: OgreWidget( QWidget *parent=0 ): QGLWidget( parent ), mOgreWindow(NULL) { init( "../bin/plugins.cfg", "../bin/ogre.cfg", "../bin/ogre.log" ); } virtual ~OgreWidget() { mOgreRoot->shutdown(); delete mOgreRoot; destroy(); } protected: virtual void initializeGL(); virtual void resizeGL( int, int ); virtual void paintGL(); void init( std::string, std::string, std::string ); virtual Ogre::RenderSystem* chooseRenderer( Ogre::RenderSystemList* ); Ogre::Root *mOgreRoot; Ogre::RenderWindow *mOgreWindow; Ogre::Camera *mCamera; Ogre::Viewport *mViewport; Ogre::SceneManager *mSceneMgr; }; #endif

ogrewidget.cpp:

Copy to clipboard
#include "ogrewidget.h" #define THIS OgreWidget /** * @brief init the object * @author kito berg-taylor */ void THIS::init( std::string plugins_file, std::string ogre_cfg_file, std::string ogre_log ) { // create the main ogre object mOgreRoot = new Ogre::Root( plugins_file, ogre_cfg_file, ogre_log ); // setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad! mOgreRoot->setRenderSystem( renderSystem ); QString dimensions = QString( "%1x%2" ) .arg(this->width()) .arg(this->height()); renderSystem->setConfigOption( "Video Mode", dimensions.toStdString() ); // initialize without creating window mOgreRoot->getRenderSystem()->setConfigOption( "Full Screen", "No" ); mOgreRoot->saveConfig(); mOgreRoot->initialise(false); // don't create a window } /** * @brief setup the rendering context * @author Kito Berg-Taylor */ void THIS::initializeGL() { //== Creating and Acquiring Ogre Window ==// // Get the parameters of the window QT created Ogre::String winHandle; #ifdef WIN32 // Windows code winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId())); #elif MACOS // Mac code, tested on Mac OSX 10.6 using Qt 4.7.4 and Ogre 1.7.3 Ogre::String winHandle = Ogre::StringConverter::toString(winId()); #else // Unix code QX11Info info = x11Info(); winHandle = Ogre::StringConverter::toString((unsigned long)(info.display())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned int)(info.screen())); winHandle += ":"; winHandle += Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId())); #endif Ogre::NameValuePairList params; #ifndef MACOS // code for Windows and Linux params["parentWindowHandle"] = winHandle; mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow", this->width(), this->height(), false, &params ); mOgreWindow->setActive(true); WId ogreWinId = 0x0; mOgreWindow->getCustomAttribute( "WINDOW", &ogreWinId ); assert( ogreWinId ); // bug fix, extract geometry QRect geo = this->frameGeometry ( ); // create new window this->create( ogreWinId ); // set geometrie infos to new window this->setGeometry (geo); #else // code for Mac params["externalWindowHandle"] = winHandle; params["macAPI"] = "cocoa"; params["macAPICocoaUseNSView"] = "true"; mOgreWindow = mOgreRoot->createRenderWindow("QOgreWidget_RenderWindow", width(), height(), false, &params); mOgreWindow->setActive(true); makeCurrent(); #endif setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); //== Ogre Initialization ==// Ogre::SceneType scene_manager_type = Ogre::ST_EXTERIOR_CLOSE; mSceneMgr = mOgreRoot->createSceneManager( scene_manager_type ); mSceneMgr->setAmbientLight( Ogre::ColourValue(1,1,1) ); mCamera = mSceneMgr->createCamera( "QOgreWidget_Cam" ); mCamera->setPosition( Ogre::Vector3(0,1,0) ); mCamera->lookAt( Ogre::Vector3(0,0,0) ); mCamera->setNearClipDistance( 1.0 ); Ogre::Viewport *mViewport = mOgreWindow->addViewport( mCamera ); mViewport->setBackgroundColour( Ogre::ColourValue( 0.8,0.8,1 ) ); } /** * @brief render a frame * @author Kito Berg-Taylor */ void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL assert( mOgreWindow ); mOgreRoot->renderOneFrame(); } /** * @brief resize the GL window * @author Kito Berg-Taylor */ void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->windowMovedOrResized(); } /** * @brief choose the right renderer * @author Kito Berg-Taylor */ Ogre::RenderSystem* THIS::chooseRenderer( Ogre::RenderSystemList *renderers ) { // It would probably be wise to do something more friendly // that just use the first available renderer return *renderers->begin(); }


For OGRE Cthugha (v1.7.3)

In ogrewidget.cpp just replace....

Copy to clipboard
// setup a renderer Ogre::RenderSystemList *renderers = mOgreRoot->getAvailableRenderers(); assert( !renderers->empty() ); // we need at least one renderer to do anything useful Ogre::RenderSystem *renderSystem; renderSystem = chooseRenderer( renderers ); assert( renderSystem ); // user might pass back a null renderer, which would be bad!


with

Copy to clipboard
// setup a renderer Ogre::RenderSystemList::const_iterator renderers = mOgreRoot->getAvailableRenderers().begin(); while(renderers != mOgreRoot->getAvailableRenderers().end()) { Ogre::String rName = (*renderers)->getName(); if (rName == "OpenGL Rendering Subsystem") break; renderers++; } Ogre::RenderSystem *renderSystem = *renderers;

For Qt 5.x.x

In Qt 5.x.x something is wrong with the resizing. The viewport ist positioned outside the visible area, so that
you only see a black widget. To solve this problem you have to replace the following code in ogrewidget.cpp:

Copy to clipboard
void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->windowMovedOrResized(); }


with

Copy to clipboard
void THIS::resizeGL( int width, int height ) { assert( mOgreWindow ); mOgreWindow->reposition( this->pos().x(), this->pos().y() ); mOgreWindow->resize( width, height ); paintGL(); }


this

Copy to clipboard
void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL assert( mOgreWindow ); mOgreRoot->renderOneFrame(); }


with

Copy to clipboard
void THIS::paintGL() { // Be sure to call "OgreWidget->repaint();" to call paintGL swapBuffers(); assert( mOgreWindow ); mOgreRoot->renderOneFrame(); }


and this

Copy to clipboard
{ ... setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); ... }


with

Copy to clipboard
{ ... setAutoBufferSwap(false); setAttribute( Qt::WA_PaintOnScreen, true ); setAttribute( Qt::WA_NoBackground ); ... }


To use...

Copy to clipboard
#include <QApplication> #include <QWidget> #include "ogrewidget.h" #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(800, 600); window.setWindowTitle("Simple example"); OgreWidget* ogreWidget = new OgreWidget; QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(ogreWidget); window.setLayout(layout); window.show(); return app.exec(); }

History

Information Version
Sun 19 of Apr, 2020 20:52 GMT-0000 paroj 23
Thu 12 of Jan, 2017 17:50 GMT-0000 Donald Duck 22
Thu 12 of Jan, 2017 17:49 GMT-0000 Donald Duck 21
Thu 12 of Jan, 2017 15:19 GMT-0000 Donald Duck added useful information 20
Tue 11 of Feb, 2014 17:42 GMT-0000 fernandot Included the swapBuffer method and the setAutoBufferSwap(false); to fix the update on Qt 5.2.x 19
Wed 27 of Mar, 2013 20:05 GMT-0000 saftschachtel 18
Wed 23 of May, 2012 19:49 GMT-0000 Brit 17
Wed 23 of May, 2012 19:48 GMT-0000 Brit 16
Wed 23 of May, 2012 19:48 GMT-0000 Brit 15
Wed 23 of May, 2012 19:48 GMT-0000 Brit 14
Wed 09 of May, 2012 00:05 GMT-0000 Brit 13
Wed 09 of May, 2012 00:03 GMT-0000 Brit 12
Tue 21 of Feb, 2012 14:03 GMT-0000 Siassei remove last lines, see fix bevor 11
Tue 21 of Feb, 2012 14:01 GMT-0000 Siassei add fix 'window position' 10
Wed 07 of Dec, 2011 09:27 GMT-0000 cypherluc 9
Wed 07 of Dec, 2011 09:22 GMT-0000 cypherluc 8
Tue 06 of Dec, 2011 16:17 GMT-0000 cypherluc 7
Sat 19 of Nov, 2011 15:00 GMT-0000 rhaith 6
Sun 31 of Jul, 2011 23:07 GMT-0000 jacmoe 5
Tue 22 of Feb, 2011 22:19 GMT-0000 Brit 4
Sat 02 of Jan, 2010 21:08 GMT-0000 jacmoe 3
Fri 25 of Dec, 2009 13:27 GMT-0000 jacmoe 2
Sun 15 of Feb, 2009 18:56 GMT-0000 Boost added categories 1