diff --git a/include/openspace/interaction/interactionhandler.h b/include/openspace/interaction/interactionhandler.h index 9df40cead8..2e1db59d5e 100644 --- a/include/openspace/interaction/interactionhandler.h +++ b/include/openspace/interaction/interactionhandler.h @@ -164,14 +164,14 @@ public: void clearKeyframes(); // Accessors - const std::list >& getPressedKeys(); - const std::list& getPressedMouseButtons(); - glm::dvec2 getMousePosition(); - double getMouseScrollDelta(); - std::vector& getKeyFrames(); + const std::list >& getPressedKeys() const; + const std::list& getPressedMouseButtons() const; + glm::dvec2 getMousePosition() const; + double getMouseScrollDelta() const; + std::vector& getKeyFrames() const; - bool isKeyPressed(std::pair keyModPair); - bool isMouseButtonPressed(MouseButton mouseButton); + bool isKeyPressed(std::pair keyModPair) const; + bool isMouseButtonPressed(MouseButton mouseButton) const; private: // Input from keyboard and mouse std::list > _keysDown; @@ -187,7 +187,7 @@ private: class InteractionMode { public: - InteractionMode(std::shared_ptr inputState); + InteractionMode(); ~InteractionMode(); // Mutators @@ -198,7 +198,7 @@ public: SceneGraphNode* focusNode(); Camera* camera(); - virtual void update(double deltaTime) = 0; + virtual void update(const InputState& inputState, double deltaTime) = 0; protected: /** Inner class that acts as a smoothing filter to a variable. The filter has a step @@ -233,15 +233,14 @@ protected: DelayedVariable velocity; }; - std::shared_ptr _inputState; - SceneGraphNode* _focusNode; - Camera* _camera; + SceneGraphNode* _focusNode = nullptr; + Camera* _camera = nullptr; }; class KeyframeInteractionMode : public InteractionMode { public: - KeyframeInteractionMode(std::shared_ptr inputState); + KeyframeInteractionMode(); ~KeyframeInteractionMode(); virtual void update(double deltaTime); @@ -258,15 +257,12 @@ public: \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, - double velocityScaleFactor); + OrbitalInteractionMode(double sensitivity, double velocityScaleFactor); ~OrbitalInteractionMode(); - virtual void update(double deltaTime); + virtual void update(const InputState& inputState, double deltaTime); protected: - void updateMouseStatesFromInput(double deltaTime); + void updateMouseStatesFromInput(const InputState& inputState, double deltaTime); void updateCameraStateFromMouseStates(); double _sensitivity; @@ -283,14 +279,11 @@ protected: class GlobeBrowsingInteractionMode : public OrbitalInteractionMode { public: - GlobeBrowsingInteractionMode( - std::shared_ptr inputState, - double sensitivity, - double velocityScaleFactor); + GlobeBrowsingInteractionMode(double sensitivity, double velocityScaleFactor); ~GlobeBrowsingInteractionMode(); virtual void setFocusNode(SceneGraphNode* focusNode); - virtual void update(double deltaTime); + virtual void update(const InputState& inputState, double deltaTime); private: void updateCameraStateFromMouseStates(); RenderableGlobe* _globe; @@ -325,7 +318,7 @@ public: // Accessors SceneGraphNode* const focusNode() const; Camera* const camera() const; - std::shared_ptr inputState() const; + const InputState& inputState() const; /** * Returns the Lua library that contains all Lua functions available to affect the @@ -347,7 +340,7 @@ private: std::multimap _keyLua; - std::shared_ptr _inputState; + std::unique_ptr _inputState; std::shared_ptr _currentInteractionMode; diff --git a/src/interaction/interactionhandler.cpp b/src/interaction/interactionhandler.cpp index 700375f524..973a642699 100644 --- a/src/interaction/interactionhandler.cpp +++ b/src/interaction/interactionhandler.cpp @@ -269,43 +269,43 @@ void InteractionHandler::orbit(const float &dx, const float &dy, const float &dz float rollSpeed = 100.0f; - glm::mat4 transform; - transform = glm::rotate(glm::radians(dx * rotationSpeed), cameraUp) * transform; - transform = glm::rotate(glm::radians(dy * rotationSpeed), cameraRight) * transform; - transform = glm::rotate(glm::radians(dz * rollSpeed), _camera->viewDirection()) * transform; + glm::mat4 transform; + transform = glm::rotate(glm::radians(dx * rotationSpeed), cameraUp) * transform; + transform = glm::rotate(glm::radians(dy * rotationSpeed), cameraRight) * transform; + transform = glm::rotate(glm::radians(dz * rollSpeed), _camera->viewDirection()) * transform; - - - - //// get camera position - //psc relative = _camera->position(); + + + + //// get camera position + //psc relative = _camera->position(); - // get camera position (UNSYNCHRONIZED) - psc relative = _camera->unsynchedPosition(); + // get camera position (UNSYNCHRONIZED) + psc relative = _camera->unsynchedPosition(); - //get relative vector - psc relative_focus_coordinate = relative - focusPos; - //rotate relative vector - relative_focus_coordinate = glm::inverse(transform) * relative_focus_coordinate.vec4(); - - //get new new position of focus node - psc origin; - if (_focusNode) { - origin = _focusNode->worldPosition(); - } + //get relative vector + psc relative_focus_coordinate = relative - focusPos; + //rotate relative vector + relative_focus_coordinate = glm::inverse(transform) * relative_focus_coordinate.vec4(); + + //get new new position of focus node + psc origin; + if (_focusNode) { + origin = _focusNode->worldPosition(); + } - //new camera position - relative = origin + relative_focus_coordinate; + //new camera position + relative = origin + relative_focus_coordinate; - psc target = relative + relative_focus_coordinate * dist * zoomSpeed; + psc target = relative + relative_focus_coordinate * dist * zoomSpeed; - //don't fly into objects - if ((target - origin).length() < focusNodeBounds){ - //target = relative; - } + //don't fly into objects + if ((target - origin).length() < focusNodeBounds){ + //target = relative; + } - unlockControls(); + unlockControls(); _camera->setFocusPosition(origin); @@ -670,23 +670,23 @@ void InputState::mouseScrollWheelCallback(double mouseScrollDelta) { _mouseScrollDelta = mouseScrollDelta; } -const std::list >& InputState::getPressedKeys() { +const std::list >& InputState::getPressedKeys() const { return _keysDown; } -const std::list& InputState::getPressedMouseButtons() { +const std::list& InputState::getPressedMouseButtons() const { return _mouseButtonsDown; } -glm::dvec2 InputState::getMousePosition() { +glm::dvec2 InputState::getMousePosition() const{ return _mousePosition; } -double InputState::getMouseScrollDelta() { +double InputState::getMouseScrollDelta() const{ return _mouseScrollDelta; } -bool InputState::isKeyPressed(std::pair keyModPair) { +bool InputState::isKeyPressed(std::pair keyModPair) const{ for (auto it = _keysDown.begin(); it != _keysDown.end(); it++) { if (*it == keyModPair) { return true; @@ -695,7 +695,7 @@ bool InputState::isKeyPressed(std::pair keyModPair) { return false; } -bool InputState::isMouseButtonPressed(MouseButton mouseButton) { +bool InputState::isMouseButtonPressed(MouseButton mouseButton) const { for (auto it = _mouseButtonsDown.begin(); it != _mouseButtonsDown.end(); it++) { if (*it == mouseButton) { return true; @@ -704,14 +704,11 @@ bool InputState::isMouseButtonPressed(MouseButton mouseButton) { return false; } -// InteractionMode -InteractionMode::InteractionMode(std::shared_ptr inputState) - : _inputState(inputState) - , _focusNode(nullptr) - , _camera(nullptr) { +InteractionMode::InteractionMode() { } + InteractionMode::~InteractionMode() { } @@ -733,8 +730,7 @@ Camera* InteractionMode::camera() { } // KeyframeInteractionMode -KeyframeInteractionMode::KeyframeInteractionMode(std::shared_ptr inputState) - : InteractionMode(inputState) { +KeyframeInteractionMode::KeyframeInteractionMode(){ } @@ -747,12 +743,8 @@ void KeyframeInteractionMode::update(double deltaTime) { } // OrbitalInteractionMode -OrbitalInteractionMode::OrbitalInteractionMode( - std::shared_ptr inputState, - double sensitivity, - double velocityScaleFactor) - : InteractionMode(inputState) - , _sensitivity(sensitivity) +OrbitalInteractionMode::OrbitalInteractionMode(double sensitivity, double velocityScaleFactor) + : _sensitivity(sensitivity) , _globalRotationMouseState(velocityScaleFactor) , _localRotationMouseState(velocityScaleFactor) , _truckMovementMouseState(velocityScaleFactor) @@ -764,13 +756,13 @@ OrbitalInteractionMode::~OrbitalInteractionMode() { } -void OrbitalInteractionMode::updateMouseStatesFromInput(double deltaTime) { - glm::dvec2 mousePosition = _inputState->getMousePosition(); +void OrbitalInteractionMode::updateMouseStatesFromInput(const InputState& inputState, double deltaTime) { + glm::dvec2 mousePosition = inputState.getMousePosition(); - bool button1Pressed = _inputState->isMouseButtonPressed(MouseButton::Button1); - bool button2Pressed = _inputState->isMouseButtonPressed(MouseButton::Button2); - bool button3Pressed = _inputState->isMouseButtonPressed(MouseButton::Button3); - bool keyCtrlPressed = _inputState->isKeyPressed( + bool button1Pressed = inputState.isMouseButtonPressed(MouseButton::Button1); + bool button2Pressed = inputState.isMouseButtonPressed(MouseButton::Button2); + bool button3Pressed = inputState.isMouseButtonPressed(MouseButton::Button3); + bool keyCtrlPressed = inputState.isKeyPressed( std::pair(Key::LeftControl, KeyModifier::Control)); // Update the mouse states @@ -880,16 +872,14 @@ void OrbitalInteractionMode::updateCameraStateFromMouseStates() { } } -void OrbitalInteractionMode::update(double deltaTime) { - updateMouseStatesFromInput(deltaTime); +void OrbitalInteractionMode::update(const InputState& inputState, double deltaTime) { + updateMouseStatesFromInput(inputState, deltaTime); updateCameraStateFromMouseStates(); } -GlobeBrowsingInteractionMode::GlobeBrowsingInteractionMode( - std::shared_ptr inputState, - double sensitivity, - double velocityScaleFactor) - : OrbitalInteractionMode(inputState, sensitivity, velocityScaleFactor) { +GlobeBrowsingInteractionMode::GlobeBrowsingInteractionMode(double sensitivity, double velocityScaleFactor) + : OrbitalInteractionMode(sensitivity, velocityScaleFactor) +{ } @@ -984,8 +974,8 @@ void GlobeBrowsingInteractionMode::updateCameraStateFromMouseStates() { } } -void GlobeBrowsingInteractionMode::update(double deltaTime) { - updateMouseStatesFromInput(deltaTime); +void GlobeBrowsingInteractionMode::update(const InputState& inputState, double deltaTime) { + updateMouseStatesFromInput(inputState, deltaTime); updateCameraStateFromMouseStates(); } @@ -1011,11 +1001,9 @@ InteractionHandler::InteractionHandler() addProperty(_coordinateSystem); // Create the interactionModes - _inputState = std::shared_ptr(new InputState()); - _orbitalInteractionMode = std::shared_ptr( - new OrbitalInteractionMode(_inputState, 0.002, 1)); - _globebrowsingInteractionMode = std::shared_ptr( - new GlobeBrowsingInteractionMode(_inputState, 0.002, 1)); + _inputState = std::make_unique(); + _orbitalInteractionMode = std::make_shared(0.002, 1); + _globebrowsingInteractionMode = std::make_shared(0.002, 1); // Set the interactionMode _currentInteractionMode = _orbitalInteractionMode; @@ -1062,8 +1050,9 @@ void InteractionHandler::unlockControls() { } -void InteractionHandler::update(double deltaTime) { - _currentInteractionMode->update(deltaTime); +void InteractionHandler::update(double deltaTime) { + ghoul_assert(_inputState != nullptr, "InputState cannot is null!"); + _currentInteractionMode->update(*_inputState, deltaTime); } SceneGraphNode* const InteractionHandler::focusNode() const { @@ -1074,8 +1063,8 @@ Camera* const InteractionHandler::camera() const { return _currentInteractionMode->camera(); } -std::shared_ptr InteractionHandler::inputState() const { - return _inputState; +const InputState& InteractionHandler::inputState() const { + return *_inputState; }