summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@nokia.com>2010-07-14 15:30:13 +0200
committerYoann Lopes <yoann.lopes@nokia.com>2010-07-14 15:30:13 +0200
commit295bd2bf44858df39557b0ed63e729d7d88763be (patch)
treef388a06a904e890334818b21690efc9322f7ad93
parent839622029d5f4d013561a8db8816fc74be45a4bd (diff)
Added an OgreWidget showing a basic Ogre scene.
-rw-r--r--.gitignore1
-rw-r--r--data.zipbin0 -> 885163 bytes
-rw-r--r--main.cpp4
-rw-r--r--ogrewidget.cpp148
-rw-r--r--ogrewidget.h51
-rw-r--r--qmlogre.pro12
6 files changed, 215 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 0f3bf6d..f2254d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ Makefile
*~
*.app
.directory
+*.log
diff --git a/data.zip b/data.zip
new file mode 100644
index 0000000..02ef61f
--- /dev/null
+++ b/data.zip
Binary files differ
diff --git a/main.cpp b/main.cpp
index fc7cf9d..22e9fca 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,8 +1,12 @@
+#include "ogrewidget.h"
#include <QtGui/QApplication>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
+ OgreWidget w;
+ w.show();
+
return app.exec();
}
diff --git a/ogrewidget.cpp b/ogrewidget.cpp
new file mode 100644
index 0000000..7b5d0e5
--- /dev/null
+++ b/ogrewidget.cpp
@@ -0,0 +1,148 @@
+#include "ogrewidget.h"
+
+#include <OgreRoot.h>
+#include <OgreRenderWindow.h>
+#include <OgreColourValue.h>
+#include <OgreWindowEventUtilities.h>
+#include <OgreSceneNode.h>
+#include <OgreEntity.h>
+#include <OgreResourceGroupManager.h>
+#include <QtGui/QResizeEvent>
+#include <QtCore/QDebug>
+
+#if defined(Q_WS_X11)
+#include <QX11Info>
+#endif
+
+OgreWidget::OgreWidget(QWidget *parent) :
+ QWidget(parent),
+ m_root(0),
+ m_camera(0),
+ m_sceneManager(0),
+ m_renderWindow(0),
+ m_viewport(0)
+{
+ setAttribute(Qt::WA_PaintOnScreen);
+ setAttribute(Qt::WA_NoSystemBackground);
+ resize(1024, 768);
+
+ initOgre();
+
+ startTimer(16);
+}
+
+OgreWidget::~OgreWidget()
+{
+ if (m_renderWindow) {
+ m_renderWindow->removeAllViewports();
+ }
+
+ if (m_root) {
+ m_root->detachRenderTarget(m_renderWindow);
+
+ if (m_sceneManager) {
+ m_root->destroySceneManager(m_sceneManager);
+ }
+ }
+
+ delete m_root;
+}
+
+void OgreWidget::initOgre()
+{
+ m_root = new Ogre::Root;
+ m_root->loadPlugin(Ogre::String(OGRE_PLUGIN_DIR) + "/RenderSystem_GL");
+
+ Ogre::RenderSystem *renderSystem = m_root->getRenderSystemByName("OpenGL Rendering Subsystem");
+ m_root->setRenderSystem(renderSystem);
+ m_root->initialise(false);
+
+ Ogre::NameValuePairList params;
+ Ogre::String externalWindowHandleParams;
+
+ //Accept input focus
+ //setFocusPolicy(Qt::StrongFocus);
+
+#if defined(Q_WS_WIN)
+ //positive integer for W32 (HWND handle) - According to Ogre Docs
+ externalWindowHandleParams = Ogre::StringConverter::toString((unsigned int)(winId()));
+#endif
+
+#if defined(Q_WS_X11)
+ QX11Info info = x11Info();
+ externalWindowHandleParams = Ogre::StringConverter::toString((unsigned long)(info.display()));
+ externalWindowHandleParams += ":";
+ externalWindowHandleParams += Ogre::StringConverter::toString((unsigned int)(info.screen()));
+ externalWindowHandleParams += ":";
+ externalWindowHandleParams += Ogre::StringConverter::toString((unsigned long)(winId()));
+#endif
+
+ //Add the external window handle parameters to the existing params set.
+#if defined(Q_WS_WIN)
+ params["externalWindowHandle"] = externalWindowHandleParams;
+#endif
+
+#if defined(Q_WS_X11)
+ params["parentWindowHandle"] = externalWindowHandleParams;
+#endif
+
+ //Finally create our window.
+ m_renderWindow = m_root->createRenderWindow("OgreWindow", width(), height(), false, &params);
+ m_renderWindow->setVisible(true);
+
+ // Load resources
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("data.zip", "Zip");
+ Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
+
+ // Setup scene
+ m_sceneManager = m_root->createSceneManager(Ogre::ST_GENERIC, "mySceneManager");
+ m_camera = m_sceneManager->createCamera("myCamera");
+ m_camera->setNearClipDistance(200);
+ m_camera->setFarClipDistance(99999);
+ m_viewport = m_renderWindow->addViewport(m_camera);
+ m_viewport->setBackgroundColour(Ogre::ColourValue(1, 1, 1));
+ m_viewport->setClearEveryFrame(true);
+ m_camera->setAspectRatio(Ogre::Real(width()) / Ogre::Real(height()));
+ //m_camera->setFOVy(Ogre::Radian(Ogre::Degree(20)));
+
+ // Setup content...
+
+ // Set a sky dome
+ m_sceneManager->setSkyBox(true, "SpaceSkyBox", 10000);
+
+ // setup some basic lighting for our scene
+ m_sceneManager->setAmbientLight(Ogre::ColourValue(0.3, 0.3, 0.3));
+ m_sceneManager->createLight()->setPosition(20, 80, 50);
+
+ // create an ogre head entity and place it at the origin
+ m_sceneManager->getRootSceneNode()->attachObject(m_sceneManager->createEntity("Head", "ogrehead.mesh"));
+ m_camera->move(Ogre::Vector3(0, 0, 300));
+ m_camera->lookAt(0, 0, 0);
+}
+
+void OgreWidget::render()
+{
+ Ogre::WindowEventUtilities::messagePump();
+ m_root->renderOneFrame();
+}
+
+void OgreWidget::timerEvent(QTimerEvent *e)
+{
+ Q_UNUSED(e)
+ render();
+}
+
+void OgreWidget::resizeEvent(QResizeEvent *e)
+{
+ const QSize &newSize = e->size();
+ if (m_renderWindow) {
+ m_renderWindow->resize(newSize.width(), newSize.height());
+ m_renderWindow->windowMovedOrResized();
+ }
+ if (m_camera) {
+ Ogre::Real aspectRatio = Ogre::Real(newSize.width()) / Ogre::Real(newSize.height());
+ m_camera->setAspectRatio(aspectRatio);
+ }
+
+ QWidget::resizeEvent(e);
+}
diff --git a/ogrewidget.h b/ogrewidget.h
new file mode 100644
index 0000000..6b940a3
--- /dev/null
+++ b/ogrewidget.h
@@ -0,0 +1,51 @@
+#ifndef OGREWIDGET_H
+#define OGREWIDGET_H
+
+#include <QWidget>
+
+#define STRINGIFY_(x) #x
+#define STRINGIFY(x) STRINGIFY_(x)
+#define OGRE_PLUGIN_DIR STRINGIFY(OGRE_PLUGIN_VAR)
+
+namespace Ogre {
+class Root;
+class Camera;
+class SceneManager;
+class RenderWindow;
+class Viewport;
+class RenderTarget;
+}
+
+class OgreWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit OgreWidget(QWidget *parent = 0);
+ virtual ~OgreWidget();
+
+ Ogre::Root *ogreRoot() const
+ { return m_root; }
+ Ogre::Camera *ogreCamera() const
+ { return m_camera; }
+ Ogre::SceneManager *ogreSceneManager() const
+ { return m_sceneManager; }
+ Ogre::RenderWindow *ogreRenderWindow() const
+ { return m_renderWindow; }
+ Ogre::Viewport *ogreViewport() const
+ { return m_viewport; }
+
+protected:
+ void initOgre();
+ void render();
+ void timerEvent(QTimerEvent *);
+ void resizeEvent(QResizeEvent *);
+
+private:
+ Ogre::Root *m_root;
+ Ogre::Camera *m_camera;
+ Ogre::SceneManager *m_sceneManager;
+ Ogre::RenderWindow *m_renderWindow;
+ Ogre::Viewport *m_viewport;
+};
+
+#endif // OGREWIDGET_H
diff --git a/qmlogre.pro b/qmlogre.pro
index e167bf7..ac72c56 100644
--- a/qmlogre.pro
+++ b/qmlogre.pro
@@ -6,6 +6,10 @@ TARGET = qmlogre
unix {
CONFIG += link_pkgconfig
PKGCONFIG += OGRE
+ OGRELIBDIR = $$system(pkg-config --libs-only-L OGRE)
+ OGRELIBDIR = $$replace(OGRELIBDIR, -L,)
+ OGREPLUGINDIR = $$OGRELIBDIR/OGRE
+ DEFINES += OGRE_PLUGIN_VAR=\"$$OGREPLUGINDIR\"
} else {
OGREDIR = $$(OGRE_HOME)
isEmpty(OGREDIR) {
@@ -26,6 +30,8 @@ unix {
INCLUDEPATH += $$BOOSTDIR
LIBS += -L$$BOOSTDIR/lib -lboost_date_time-xgcc40-mt-1_42 -lboost_thread-xgcc40-mt-1_42
}
+
+ DEFINES += OGRE_PLUGIN_VAR=$$OGREDIR/lib
}
UI_DIR = ./.ui
@@ -33,4 +39,8 @@ OBJECTS_DIR = ./.obj
MOC_DIR = ./.moc
-SOURCES += main.cpp
+SOURCES += main.cpp \
+ ogrewidget.cpp
+
+HEADERS += \
+ ogrewidget.h