From 4eea2c7a86dfa5df0607066e38e212cd1017a1d4 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 27 Feb 2014 15:42:59 +0100 Subject: [PATCH] added free navigation mode --- apps/opencs/CMakeLists.txt | 2 +- apps/opencs/view/render/navigationfree.cpp | 60 ++++++++++++++++++++++ apps/opencs/view/render/navigationfree.hpp | 32 ++++++++++++ apps/opencs/view/world/scenesubview.cpp | 2 +- apps/opencs/view/world/scenesubview.hpp | 2 + 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 apps/opencs/view/render/navigationfree.cpp create mode 100644 apps/opencs/view/render/navigationfree.hpp diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index bb4a9d329..eba7a7acb 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -68,7 +68,7 @@ opencs_units (view/render ) opencs_units_noqt (view/render - navigation navigation1st + navigation navigation1st navigationfree ) opencs_units_noqt (view/world diff --git a/apps/opencs/view/render/navigationfree.cpp b/apps/opencs/view/render/navigationfree.cpp new file mode 100644 index 000000000..d470722bb --- /dev/null +++ b/apps/opencs/view/render/navigationfree.cpp @@ -0,0 +1,60 @@ + +#include "navigationfree.hpp" + +#include + +#include + +CSVRender::NavigationFree::NavigationFree() : mCamera (0) {} + +bool CSVRender::NavigationFree::activate (Ogre::Camera *camera) +{ + mCamera = camera; + mCamera->setFixedYawAxis (false); + return false; +} + +bool CSVRender::NavigationFree::wheelMoved (int delta) +{ + mCamera->move (getFactor (true) * mCamera->getDirection() * delta); + return true; +} + +bool CSVRender::NavigationFree::mouseMoved (const QPoint& delta, int mode) +{ + if (mode==0) + { + // turn camera + if (delta.x()) + mCamera->yaw (Ogre::Degree (getFactor (true) * delta.x())); + + if (delta.y()) + mCamera->pitch (Ogre::Degree (getFactor (true) * delta.y())); + + return true; + } + else if (mode==1) + { + // pan camera + if (delta.x()) + mCamera->move (getFactor (true) * mCamera->getDerivedRight() * delta.x()); + + if (delta.y()) + mCamera->move (getFactor (true) * -mCamera->getDerivedUp() * delta.y()); + + return true; + } + + return false; +} + +bool CSVRender::NavigationFree::handleMovementKeys (int vertical, int horizontal) +{ + if (vertical) + mCamera->move (getFactor (false) * mCamera->getDerivedUp() * vertical); + + if (horizontal) + mCamera->move (getFactor (true) * mCamera->getDerivedRight() * horizontal); + + return true; +} diff --git a/apps/opencs/view/render/navigationfree.hpp b/apps/opencs/view/render/navigationfree.hpp new file mode 100644 index 000000000..fa6fdad11 --- /dev/null +++ b/apps/opencs/view/render/navigationfree.hpp @@ -0,0 +1,32 @@ +#ifndef OPENCS_VIEW_NAVIGATIONFREE_H +#define OPENCS_VIEW_NAVIGATIONFREE_H + +#include "navigation.hpp" + +namespace CSVRender +{ + /// \brief Free camera controls + class NavigationFree : public Navigation + { + Ogre::Camera *mCamera; + + public: + + NavigationFree(); + + virtual bool activate (Ogre::Camera *camera); + ///< \return Update required? + + virtual bool wheelMoved (int delta); + ///< \return Update required? + + virtual bool mouseMoved (const QPoint& delta, int mode); + ///< \param mode: 0: default mouse key, 1: default mouse key and modifier key 1 + /// \return Update required? + + virtual bool handleMovementKeys (int vertical, int horizontal); + ///< \return Update required? + }; +} + +#endif diff --git a/apps/opencs/view/world/scenesubview.cpp b/apps/opencs/view/world/scenesubview.cpp index 5b7b6a587..fd327b4d1 100644 --- a/apps/opencs/view/world/scenesubview.cpp +++ b/apps/opencs/view/world/scenesubview.cpp @@ -86,7 +86,7 @@ void CSVWorld::SceneSubView::selectNavigationMode (const std::string& mode) mScene->setNavigation (&m1st); else if (mode=="free") { - + mScene->setNavigation (&mFree); } else if (mode=="orbit") { diff --git a/apps/opencs/view/world/scenesubview.hpp b/apps/opencs/view/world/scenesubview.hpp index f948ecefb..8e42540e1 100644 --- a/apps/opencs/view/world/scenesubview.hpp +++ b/apps/opencs/view/world/scenesubview.hpp @@ -4,6 +4,7 @@ #include "../doc/subview.hpp" #include "../render/navigation1st.hpp" +#include "../render/navigationfree.hpp" class QModelIndex; @@ -30,6 +31,7 @@ namespace CSVWorld TableBottomBox *mBottom; CSVRender::SceneWidget *mScene; CSVRender::Navigation1st m1st; + CSVRender::NavigationFree mFree; public: