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