From a21958d0075e2013c5fdf335b181850f2455db1a Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sun, 2 Nov 2014 10:30:44 +1100 Subject: [PATCH] Add option to move the mouse against the screen frame of reference. --- apps/opencs/model/settings/usersettings.cpp | 8 +++ apps/opencs/view/render/mousestate.cpp | 57 ++++++++++++--------- apps/opencs/view/render/mousestate.hpp | 1 + 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/apps/opencs/model/settings/usersettings.cpp b/apps/opencs/model/settings/usersettings.cpp index 1ecd39db0..26c6aa5d6 100644 --- a/apps/opencs/model/settings/usersettings.cpp +++ b/apps/opencs/model/settings/usersettings.cpp @@ -175,6 +175,14 @@ void CSMSettings::UserSettings::buildSettingModelDefaults() "For testing mouse movement directions."); mouseWheel->setDefaultValue (defaultValue); mouseWheel->setDeclaredValues (values); + + defaultValue = "screen"; + values = QStringList() << defaultValue << "world"; + + Setting *mouseCoord = createSetting (Type_RadioButton, "mouse-reference", + "For testing mouse movement frame of reference."); + mouseCoord->setDefaultValue (defaultValue); + mouseCoord->setDeclaredValues (values); } declareSection ("table-input", "Table Input"); diff --git a/apps/opencs/view/render/mousestate.cpp b/apps/opencs/view/render/mousestate.cpp index 9c087fd59..5c5279b7a 100644 --- a/apps/opencs/view/render/mousestate.cpp +++ b/apps/opencs/view/render/mousestate.cpp @@ -3,11 +3,7 @@ #include #include #include - #include -#include // FIXME: for debugging -#include // FIXME: for debugging -#include // FIXME: for debugging #include #include @@ -15,27 +11,9 @@ #include "../../model/settings/usersettings.hpp" #include "../world/physicssystem.hpp" -#include "elements.hpp" // FIXME: for debugging +#include "elements.hpp" #include "worldspacewidget.hpp" -namespace -{ - //plane Z, upvector Y, mOffset z : x-y plane, wheel up/down - //plane Y, upvector X, mOffset y : y-z plane, wheel left/right - //plane X, upvector Y, mOffset x : x-z plane, wheel closer/further - std::pair planeAxis() - { - CSMSettings::UserSettings &userSettings = CSMSettings::UserSettings::instance(); - QString wheelDir = userSettings.setting("debug/mouse-wheel", QString("Closer/Further")); - if(wheelDir == "Up/Down") - return std::make_pair(Ogre::Vector3::UNIT_Z, Ogre::Vector3::UNIT_Y); - else if(wheelDir == "Left/Right") - return std::make_pair(Ogre::Vector3::UNIT_Y, Ogre::Vector3::UNIT_X); - else - return std::make_pair(Ogre::Vector3::UNIT_X, Ogre::Vector3::UNIT_Y); - } -} - namespace CSVRender { // mouse picking @@ -187,7 +165,6 @@ namespace CSVRender mGrabbedSceneNode = result.first; // ray test agaist the plane to get a starting position of the // mouse in relation to the object position - //mPlane->redefine(Ogre::Vector3::UNIT_Z, result.second); std::pair planeRes = planeAxis(); mPlane->redefine(planeRes.first, result.second); std::pair planeResult = mousePositionOnPlane(event->pos(), *mPlane); @@ -351,6 +328,38 @@ namespace CSVRender return true; } + //plane Z, upvector Y, mOffset z : x-y plane, wheel up/down + //plane Y, upvector X, mOffset y : y-z plane, wheel left/right + //plane X, upvector Y, mOffset x : x-z plane, wheel closer/further + std::pair MouseState::planeAxis() + { + CSMSettings::UserSettings &userSettings = CSMSettings::UserSettings::instance(); + QString coord = userSettings.setting("debug/mouse-reference", QString("screen")); + + QString wheelDir = userSettings.setting("debug/mouse-wheel", QString("Closer/Further")); + if(wheelDir == "Left/Right") + { + if(coord == "world") + return std::make_pair(Ogre::Vector3::UNIT_Y, Ogre::Vector3::UNIT_X); + else + return std::make_pair(getCamera()->getDerivedRight(), getCamera()->getDerivedDirection()); + } + else if(wheelDir == "Up/Down") + { + if(coord == "world") + return std::make_pair(Ogre::Vector3::UNIT_Z, Ogre::Vector3::UNIT_Y); + else + return std::make_pair(getCamera()->getDerivedUp(), getCamera()->getDerivedRight()); + } + else + { + if(coord == "world") + return std::make_pair(Ogre::Vector3::UNIT_X, Ogre::Vector3::UNIT_Y); + else + return std::make_pair(getCamera()->getDerivedDirection(), getCamera()->getDerivedRight()); + } + } + std::pair MouseState::mousePositionOnPlane(const QPoint &pos, const Ogre::Plane &plane) { // using a really small value seems to mess up with the projections diff --git a/apps/opencs/view/render/mousestate.hpp b/apps/opencs/view/render/mousestate.hpp index e7eedf1d4..498752db0 100644 --- a/apps/opencs/view/render/mousestate.hpp +++ b/apps/opencs/view/render/mousestate.hpp @@ -71,6 +71,7 @@ namespace CSVRender std::pair terrainUnderCursor(const int mouseX, const int mouseY); std::pair objectUnderCursor(const int mouseX, const int mouseY); void updateSelectionHighlight(const std::string sceneNode, const Ogre::Vector3 &position); + std::pair planeAxis(); void updateSceneWidgets(); bool isDebug();