diff options
author | Yoann Lopes <yoann.lopes@nokia.com> | 2010-07-14 15:30:13 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@nokia.com> | 2010-07-14 15:30:13 +0200 |
commit | 295bd2bf44858df39557b0ed63e729d7d88763be (patch) | |
tree | f388a06a904e890334818b21690efc9322f7ad93 | |
parent | 839622029d5f4d013561a8db8816fc74be45a4bd (diff) |
Added an OgreWidget showing a basic Ogre scene.
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | data.zip | bin | 0 -> 885163 bytes | |||
-rw-r--r-- | main.cpp | 4 | ||||
-rw-r--r-- | ogrewidget.cpp | 148 | ||||
-rw-r--r-- | ogrewidget.h | 51 | ||||
-rw-r--r-- | qmlogre.pro | 12 |
6 files changed, 215 insertions, 1 deletions
@@ -6,3 +6,4 @@ Makefile *~ *.app .directory +*.log diff --git a/data.zip b/data.zip Binary files differnew file mode 100644 index 0000000..02ef61f --- /dev/null +++ b/data.zip @@ -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, ¶ms); + 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 |