From 0fcd71be71153ca50618459f26a2187bb02168f4 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 27 Apr 2020 15:08:01 +0200 Subject: [PATCH] Add the ability to invert mouse buttons for OrbitalNavigator (closes #697) --- .../openspace/interaction/mousecamerastates.h | 5 +++++ .../openspace/interaction/orbitalnavigator.h | 2 ++ src/interaction/mousecamerastates.cpp | 19 ++++++++++++++----- src/interaction/orbitalnavigator.cpp | 13 +++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/include/openspace/interaction/mousecamerastates.h b/include/openspace/interaction/mousecamerastates.h index f592dc0ed1..719dcd6926 100644 --- a/include/openspace/interaction/mousecamerastates.h +++ b/include/openspace/interaction/mousecamerastates.h @@ -34,6 +34,11 @@ public: MouseCameraStates(double sensitivity, double velocityScaleFactor); void updateStateFromInput(const InputState& inputState, double deltaTime) override; + + void setInvertMouseButton(bool value); + +private: + bool _isMouseButtonInverted = false; }; } // namespace openspace::interaction diff --git a/include/openspace/interaction/orbitalnavigator.h b/include/openspace/interaction/orbitalnavigator.h index f2ad409223..c453691809 100644 --- a/include/openspace/interaction/orbitalnavigator.h +++ b/include/openspace/interaction/orbitalnavigator.h @@ -160,6 +160,8 @@ private: properties::FloatProperty _stereoInterpolationTime; properties::FloatProperty _followRotationInterpolationTime; + properties::BoolProperty _invertMouseButtons; + MouseCameraStates _mouseStates; JoystickCameraStates _joystickStates; WebsocketCameraStates _websocketStates; diff --git a/src/interaction/mousecamerastates.cpp b/src/interaction/mousecamerastates.cpp index ba897bd1d3..36cc688170 100644 --- a/src/interaction/mousecamerastates.cpp +++ b/src/interaction/mousecamerastates.cpp @@ -40,10 +40,15 @@ MouseCameraStates::MouseCameraStates(double sensitivity, double velocityScaleFac void MouseCameraStates::updateStateFromInput(const InputState& inputState, double deltaTime) { + MouseButton primary = + _isMouseButtonInverted ? MouseButton::Button2 : MouseButton::Button1; + MouseButton secondary = + _isMouseButtonInverted ? MouseButton::Button1 : MouseButton::Button2; + glm::dvec2 mousePosition = inputState.mousePosition(); - bool button1Pressed = inputState.isMouseButtonPressed(MouseButton::Button1); - bool button2Pressed = inputState.isMouseButtonPressed(MouseButton::Button2); + bool primaryPressed = inputState.isMouseButtonPressed(primary); + bool secondaryPressed = inputState.isMouseButtonPressed(secondary); bool button3Pressed = inputState.isMouseButtonPressed(MouseButton::Button3); bool keyCtrlPressed = inputState.isKeyPressed(Key::LeftControl) | inputState.isKeyPressed(Key::RightControl); @@ -53,7 +58,7 @@ void MouseCameraStates::updateStateFromInput(const InputState& inputState, inputState.isKeyPressed(Key::RightAlt); // Update the mouse states - if (button1Pressed && !keyShiftPressed && !keyAltPressed) { + if (primaryPressed && !keyShiftPressed && !keyAltPressed) { if (keyCtrlPressed) { glm::dvec2 mousePositionDelta = _localRotationState.previousPosition - mousePosition; @@ -84,7 +89,7 @@ void MouseCameraStates::updateStateFromInput(const InputState& inputState, _globalRotationState.previousPosition = mousePosition; _globalRotationState.velocity.decelerate(deltaTime); } - if (button2Pressed || (keyAltPressed && button1Pressed)) { + if (secondaryPressed || (keyAltPressed && primaryPressed)) { glm::dvec2 mousePositionDelta = _truckMovementState.previousPosition - mousePosition; @@ -105,7 +110,7 @@ void MouseCameraStates::updateStateFromInput(const InputState& inputState, _truckMovementState.previousPosition = mousePosition; _truckMovementState.velocity.decelerate(deltaTime); } - if (button3Pressed || (keyShiftPressed && button1Pressed)) { + if (button3Pressed || (keyShiftPressed && primaryPressed)) { if (keyCtrlPressed) { glm::dvec2 mousePositionDelta = _localRollState.previousPosition - mousePosition; @@ -138,4 +143,8 @@ void MouseCameraStates::updateStateFromInput(const InputState& inputState, } } +void MouseCameraStates::setInvertMouseButton(bool value) { + _isMouseButtonInverted = value; +} + } // namespace openspace::interaction diff --git a/src/interaction/orbitalnavigator.cpp b/src/interaction/orbitalnavigator.cpp index 9f5e005b6e..2a49c21a82 100644 --- a/src/interaction/orbitalnavigator.cpp +++ b/src/interaction/orbitalnavigator.cpp @@ -185,6 +185,14 @@ namespace { "The interpolation time when toggling following focus node rotation." }; + constexpr openspace::properties::Property::PropertyInfo InvertMouseButtons = { + "InvertMouseButtons", + "Invert left and right mouse buttons", + "If this value is 'false', the left mouse button causes the camera to rotate " + "around the object and the right mouse button causes the zooming motion. If this " + "value is 'true', these two functionalities are reversed." + }; + constexpr openspace::properties::Property::PropertyInfo UseAdaptiveStereoscopicDepthInfo = { "UseAdaptiveStereoscopicDepth", @@ -249,6 +257,7 @@ OrbitalNavigator::OrbitalNavigator() , _retargetInterpolationTime(RetargetInterpolationTimeInfo, 2.0, 0.0, 10.0) , _stereoInterpolationTime(StereoInterpolationTimeInfo, 8.0, 0.0, 10.0) , _followRotationInterpolationTime(FollowRotationInterpTimeInfo, 1.0, 0.0, 10.0) + , _invertMouseButtons(InvertMouseButtons, false) , _mouseStates(_mouseSensitivity * 0.0001, 1 / (_friction.friction + 0.0000001)) , _joystickStates(_joystickSensitivity * 0.1, 1 / (_friction.friction + 0.0000001)) , _websocketStates(_websocketSensitivity, 1 / (_friction.friction + 0.0000001)) @@ -380,6 +389,10 @@ OrbitalNavigator::OrbitalNavigator() addProperty(_retargetInterpolationTime); addProperty(_stereoInterpolationTime); addProperty(_followRotationInterpolationTime); + _invertMouseButtons.onChange( + [this]() { _mouseStates.setInvertMouseButton(_invertMouseButtons); } + ); + addProperty(_invertMouseButtons); addProperty(_mouseSensitivity); addProperty(_joystickSensitivity);