1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-04-01 10:36:42 +00:00

moving the camera with W and S keys

This commit is contained in:
Marc Zinnschlag 2014-02-25 13:09:37 +01:00
parent 4ec4599be3
commit 8081c067a6
2 changed files with 71 additions and 4 deletions

View file

@ -2,6 +2,7 @@
#include <QEvent> #include <QEvent>
#include <QResizeEvent> #include <QResizeEvent>
#include <QTimer>
#include <OgreRoot.h> #include <OgreRoot.h>
#include <OgreRenderWindow.h> #include <OgreRenderWindow.h>
@ -10,16 +11,18 @@
namespace CSVRender namespace CSVRender
{ {
SceneWidget::SceneWidget(QWidget *parent) SceneWidget::SceneWidget(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, mWindow(NULL) , mWindow(NULL)
, mCamera(NULL) , mCamera(NULL)
, mSceneMgr(NULL), mNavigationMode (NavigationMode_Free) , mSceneMgr(NULL), mNavigationMode (NavigationMode_Free), mUpdate (false)
, mKeyForward (false), mKeyBackward (false)
{ {
setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_NoSystemBackground);
setFocusPolicy (Qt::StrongFocus);
mSceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC); mSceneMgr = Ogre::Root::getSingleton().createSceneManager(Ogre::ST_GENERIC);
// Throw in a random color just to make sure multiple scenes work // Throw in a random color just to make sure multiple scenes work
@ -44,6 +47,11 @@ namespace CSVRender
mCamera->lookAt(0,0,0); mCamera->lookAt(0,0,0);
mCamera->setNearClipDistance(0.1); mCamera->setNearClipDistance(0.1);
mCamera->setFarClipDistance(3000); mCamera->setFarClipDistance(3000);
QTimer *timer = new QTimer (this);
connect (timer, SIGNAL (timeout()), this, SLOT (update()));
timer->start (20); /// \todo make this configurable
} }
void SceneWidget::updateOgreWindow() void SceneWidget::updateOgreWindow()
@ -93,7 +101,6 @@ namespace CSVRender
e->accept(); e->accept();
} }
QPaintEngine* SceneWidget::paintEngine() const QPaintEngine* SceneWidget::paintEngine() const
{ {
// We don't want another paint engine to get in the way. // We don't want another paint engine to get in the way.
@ -130,4 +137,52 @@ namespace CSVRender
return QWidget::event(e); return QWidget::event(e);
} }
void SceneWidget::keyPressEvent (QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_W: mKeyForward = true; break;
case Qt::Key_S: mKeyBackward = true; break;
default: QWidget::keyPressEvent (event);
}
}
void SceneWidget::keyReleaseEvent (QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_W: mKeyForward = false; break;
case Qt::Key_S: mKeyBackward = false; break;
default: QWidget::keyReleaseEvent (event);
}
}
void SceneWidget::focusOutEvent (QFocusEvent *event)
{
mKeyForward = false;
mKeyBackward = false;
QWidget::focusOutEvent (event);
}
void SceneWidget::update()
{
if (mKeyForward && !mKeyBackward)
{
mCamera->move (mCamera->getDirection());
mUpdate = true;
}
if (!mKeyForward && mKeyBackward)
{
mCamera->move (-mCamera->getDirection());
mUpdate = true;
}
if (mUpdate)
{
mUpdate = false;
mWindow->update();
}
}
} }

View file

@ -12,7 +12,6 @@ namespace Ogre
namespace CSVRender namespace CSVRender
{ {
class SceneWidget : public QWidget class SceneWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -34,6 +33,12 @@ namespace CSVRender
void resizeEvent(QResizeEvent* e); void resizeEvent(QResizeEvent* e);
bool event(QEvent* e); bool event(QEvent* e);
void keyPressEvent (QKeyEvent *event);
void keyReleaseEvent (QKeyEvent *event);
void focusOutEvent (QFocusEvent *event);
void updateOgreWindow(); void updateOgreWindow();
Ogre::Camera* mCamera; Ogre::Camera* mCamera;
@ -41,6 +46,13 @@ namespace CSVRender
Ogre::RenderWindow* mWindow; Ogre::RenderWindow* mWindow;
NavigationMode mNavigationMode; NavigationMode mNavigationMode;
bool mUpdate;
int mKeyForward;
int mKeyBackward;
private slots:
void update();
}; };
} }