From 69aef205af90ed241e3c3593675cd27f81ae16ef Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Tue, 21 Jun 2016 13:42:56 -0400 Subject: [PATCH] Interaction mode inertia is no longer dependent on the framerate. --- .../interaction/interactionhandler.h | 17 +++++++++---- src/interaction/interactionhandler.cpp | 24 +++++++++---------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/include/openspace/interaction/interactionhandler.h b/include/openspace/interaction/interactionhandler.h index ba3d8a022a..9df40cead8 100644 --- a/include/openspace/interaction/interactionhandler.h +++ b/include/openspace/interaction/interactionhandler.h @@ -206,14 +206,15 @@ protected: will be updates as soon as it is set to a value (calling the set() function). */ template - class delayedVariable { + class DelayedVariable { public: - delayedVariable(ScaleType scale) { + DelayedVariable(ScaleType scale) { _scale = scale; } - void set(T value) { + void set(T value, double dt) { _targetValue = value; - _currentValue = _currentValue + (_targetValue - _currentValue) * _scale; + _currentValue = _currentValue + (_targetValue - _currentValue) * + min(_scale * dt, 1.0); // less or equal to 1.0 keeps it stable } T get() { return _currentValue; @@ -229,7 +230,7 @@ protected: : velocity(scale) , previousPosition(0.0, 0.0) {} glm::dvec2 previousPosition; - delayedVariable velocity; + DelayedVariable velocity; }; std::shared_ptr _inputState; @@ -251,6 +252,12 @@ private: class OrbitalInteractionMode : public InteractionMode { public: + /*! + \param inputState + \param sensitivity + \param velocityScalefactor can be set to 60 to remove the inertia of the + interaction. Lower value will make it harder to move the camera. + */ OrbitalInteractionMode( std::shared_ptr inputState, double sensitivity, diff --git a/src/interaction/interactionhandler.cpp b/src/interaction/interactionhandler.cpp index d0c7dfa78a..700375f524 100644 --- a/src/interaction/interactionhandler.cpp +++ b/src/interaction/interactionhandler.cpp @@ -778,44 +778,44 @@ void OrbitalInteractionMode::updateMouseStatesFromInput(double deltaTime) { if (keyCtrlPressed) { glm::dvec2 mousePositionDelta = _localRotationMouseState.previousPosition - mousePosition; - _localRotationMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity); + _localRotationMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity, deltaTime); _globalRotationMouseState.previousPosition = mousePosition; - _globalRotationMouseState.velocity.set(glm::dvec2(0, 0)); + _globalRotationMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); } else { glm::dvec2 mousePositionDelta = _globalRotationMouseState.previousPosition - mousePosition; - _globalRotationMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity); + _globalRotationMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity, deltaTime); _localRotationMouseState.previousPosition = mousePosition; - _localRotationMouseState.velocity.set(glm::dvec2(0, 0)); + _localRotationMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); } } else { // !button1Pressed _localRotationMouseState.previousPosition = mousePosition; - _localRotationMouseState.velocity.set(glm::dvec2(0, 0)); + _localRotationMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); _globalRotationMouseState.previousPosition = mousePosition; - _globalRotationMouseState.velocity.set(glm::dvec2(0, 0)); + _globalRotationMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); } if (button2Pressed) { glm::dvec2 mousePositionDelta = _truckMovementMouseState.previousPosition - mousePosition; - _truckMovementMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity); + _truckMovementMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity, deltaTime); } else { // !button2Pressed _truckMovementMouseState.previousPosition = mousePosition; - _truckMovementMouseState.velocity.set(glm::dvec2(0, 0)); + _truckMovementMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); } if (button3Pressed) { glm::dvec2 mousePositionDelta = _rollMouseState.previousPosition - mousePosition; - _rollMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity); + _rollMouseState.velocity.set(mousePositionDelta * deltaTime * _sensitivity, deltaTime); } else { // !button3Pressed _rollMouseState.previousPosition = mousePosition; - _rollMouseState.velocity.set(glm::dvec2(0, 0)); + _rollMouseState.velocity.set(glm::dvec2(0, 0), deltaTime); } } @@ -1013,9 +1013,9 @@ InteractionHandler::InteractionHandler() // Create the interactionModes _inputState = std::shared_ptr(new InputState()); _orbitalInteractionMode = std::shared_ptr( - new OrbitalInteractionMode(_inputState, 0.002, 0.02)); + new OrbitalInteractionMode(_inputState, 0.002, 1)); _globebrowsingInteractionMode = std::shared_ptr( - new GlobeBrowsingInteractionMode(_inputState, 0.002, 0.02)); + new GlobeBrowsingInteractionMode(_inputState, 0.002, 1)); // Set the interactionMode _currentInteractionMode = _orbitalInteractionMode;