1 /* 2 Copyright (C) 2010-2014 Kristian Duske 3 4 This file is part of TrenchBroom. 5 6 TrenchBroom is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 TrenchBroom is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include "InputState.h" 21 22 #include "Macros.h" 23 #include "Renderer/Camera.h" 24 25 #include <wx/utils.h> 26 27 namespace TrenchBroom { 28 namespace View { InputState()29 InputState::InputState() : 30 m_modifierKeys(ModifierKeys::MKNone), 31 m_mouseButtons(MouseButtons::MBNone), 32 m_mouseX(0), 33 m_mouseY(0), 34 m_mouseDX(0), 35 m_mouseDY(0), 36 m_scrollX(0.0f), 37 m_scrollY(0.0f), 38 m_anyToolDragging(false) { 39 const wxMouseState mouseState = wxGetMouseState(); 40 m_mouseX = mouseState.GetX(); 41 m_mouseY = mouseState.GetY(); 42 } 43 InputState(const int mouseX,const int mouseY)44 InputState::InputState(const int mouseX, const int mouseY) : 45 m_modifierKeys(ModifierKeys::MKNone), 46 m_mouseButtons(MouseButtons::MBNone), 47 m_mouseX(mouseX), 48 m_mouseY(mouseY), 49 m_mouseDX(0), 50 m_mouseDY(0), 51 m_scrollX(0.0f), 52 m_scrollY(0.0f), 53 m_anyToolDragging(false) {} 54 ~InputState()55 InputState::~InputState() {} 56 modifierKeys() const57 ModifierKeyState InputState::modifierKeys() const { 58 return m_modifierKeys; 59 } 60 modifierKeysDown(const ModifierKeyState keys) const61 bool InputState::modifierKeysDown(const ModifierKeyState keys) const { 62 return (modifierKeys() & keys) != 0; 63 } 64 modifierKeysPressed(const ModifierKeyState keys) const65 bool InputState::modifierKeysPressed(const ModifierKeyState keys) const { 66 return modifierKeys() == keys; 67 } 68 checkModifierKeys(const ModifierKeyState key1,const ModifierKeyState key2,const ModifierKeyState key3,const ModifierKeyState key4) const69 bool InputState::checkModifierKeys(const ModifierKeyState key1, const ModifierKeyState key2, const ModifierKeyState key3, const ModifierKeyState key4) const { 70 assert(key1 != ModifierKeys::MKDontCare); 71 if (modifierKeysPressed(key1)) 72 return true; 73 if (key2 != ModifierKeys::MKDontCare && modifierKeysPressed(key2)) 74 return true; 75 if (key3 != ModifierKeys::MKDontCare && modifierKeysPressed(key3)) 76 return true; 77 if (key3 != ModifierKeys::MKDontCare && modifierKeysPressed(key3)) 78 return true; 79 return false; 80 } 81 checkModifierKeys(const ModifierKeyPressed ctrl,const ModifierKeyPressed alt,const ModifierKeyPressed shift) const82 bool InputState::checkModifierKeys(const ModifierKeyPressed ctrl, const ModifierKeyPressed alt, const ModifierKeyPressed shift) const { 83 return (checkModifierKey(ctrl, ModifierKeys::MKCtrlCmd) && 84 checkModifierKey(alt, ModifierKeys::MKAlt) && 85 checkModifierKey(shift, ModifierKeys::MKShift)); 86 } 87 checkModifierKey(ModifierKeyPressed state,ModifierKeyState key) const88 bool InputState::checkModifierKey(ModifierKeyPressed state, ModifierKeyState key) const { 89 switch (state) { 90 case MK_Yes: 91 return modifierKeysDown(key); 92 case MK_No: 93 return !modifierKeysDown(key); 94 case MK_DontCare: 95 return true; 96 switchDefault() 97 } 98 } 99 mouseButtons() const100 MouseButtonState InputState::mouseButtons() const { 101 return m_mouseButtons; 102 } 103 mouseButtonsDown(const MouseButtonState buttons) const104 bool InputState::mouseButtonsDown(const MouseButtonState buttons) const { 105 return (mouseButtons() & buttons) != 0; 106 } 107 mouseButtonsPressed(const MouseButtonState buttons) const108 bool InputState::mouseButtonsPressed(const MouseButtonState buttons) const { 109 return mouseButtons() == buttons; 110 } 111 mouseX() const112 int InputState::mouseX() const { 113 return m_mouseX; 114 } 115 mouseY() const116 int InputState::mouseY() const { 117 return m_mouseY; 118 } 119 mouseDX() const120 int InputState::mouseDX() const { 121 return m_mouseDX; 122 } 123 mouseDY() const124 int InputState::mouseDY() const { 125 return m_mouseDY; 126 } 127 scrollX() const128 float InputState::scrollX() const { 129 return m_scrollX; 130 } 131 scrollY() const132 float InputState::scrollY() const { 133 return m_scrollY; 134 } 135 setModifierKeys(const ModifierKeyState keys)136 void InputState::setModifierKeys(const ModifierKeyState keys) { 137 m_modifierKeys = keys; 138 } 139 clearModifierKeys()140 void InputState::clearModifierKeys() { 141 m_modifierKeys = ModifierKeys::MKNone; 142 } 143 mouseDown(const MouseButtonState button)144 void InputState::mouseDown(const MouseButtonState button) { 145 m_mouseButtons |= button; 146 } 147 mouseUp(const MouseButtonState button)148 void InputState::mouseUp(const MouseButtonState button) { 149 m_mouseButtons &= ~button; 150 } 151 clearMouseButtons()152 void InputState::clearMouseButtons() { 153 m_mouseButtons = MouseButtons::MBNone; 154 } 155 mouseMove(const int mouseX,const int mouseY,const int mouseDX,const int mouseDY)156 void InputState::mouseMove(const int mouseX, const int mouseY, const int mouseDX, const int mouseDY) { 157 m_mouseX = mouseX; 158 m_mouseY = mouseY; 159 m_mouseDX = mouseDX; 160 m_mouseDY = mouseDY; 161 } 162 scroll(const float scrollX,const float scrollY)163 void InputState::scroll(const float scrollX, const float scrollY) { 164 m_scrollX = scrollX; 165 m_scrollY = scrollY; 166 } 167 anyToolDragging() const168 bool InputState::anyToolDragging() const { 169 return m_anyToolDragging; 170 } 171 setAnyToolDragging(const bool anyToolDragging)172 void InputState::setAnyToolDragging(const bool anyToolDragging) { 173 m_anyToolDragging = anyToolDragging; 174 } 175 pickRay() const176 const Ray3& InputState::pickRay() const { 177 return m_pickRequest.pickRay(); 178 } 179 defaultPoint() const180 const Vec3 InputState::defaultPoint() const { 181 return camera().defaultPoint(); 182 } 183 defaultPointUnderMouse() const184 const Vec3 InputState::defaultPointUnderMouse() const { 185 return camera().defaultPoint(pickRay()); 186 } 187 camera() const188 const Renderer::Camera& InputState::camera() const { 189 return m_pickRequest.camera(); 190 } 191 setPickRequest(const PickRequest & pickRequest)192 void InputState::setPickRequest(const PickRequest& pickRequest) { 193 m_pickRequest = pickRequest; 194 } 195 pickResult() const196 const Model::PickResult& InputState::pickResult() const { 197 return m_pickResult; 198 } 199 setPickResult(Model::PickResult & pickResult)200 void InputState::setPickResult(Model::PickResult& pickResult) { 201 using std::swap; 202 swap(m_pickResult, pickResult); 203 } 204 } 205 } 206