]> git.lizzy.rs Git - dragonfireclient.git/blob - src/client/joystick_controller.h
Fix various copy instead of const ref reported by cppcheck (part 3) (#5616)
[dragonfireclient.git] / src / client / joystick_controller.h
1 /*
2 Minetest
3 Copyright (C) 2016 est31, <MTest31@outlook.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef JOYSTICK_HEADER
21 #define JOYSTICK_HEADER
22
23 #include "irrlichttypes_extrabloated.h"
24 #include "keys.h"
25 #include <bitset>
26 #include <vector>
27
28 enum JoystickAxis {
29         JA_SIDEWARD_MOVE,
30         JA_FORWARD_MOVE,
31
32         JA_FRUSTUM_HORIZONTAL,
33         JA_FRUSTUM_VERTICAL,
34
35         // To know the count of enum values
36         JA_COUNT,
37 };
38
39 struct JoystickAxisLayout {
40         u16 axis_id;
41         // -1 if to invert, 1 if to keep it.
42         int invert;
43 };
44
45
46 struct JoystickCombination {
47
48         virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const=0;
49
50         GameKeyType key;
51 };
52
53 struct JoystickButtonCmb : public JoystickCombination {
54
55         JoystickButtonCmb() {}
56         JoystickButtonCmb(GameKeyType key, u32 filter_mask, u32 compare_mask) :
57                 filter_mask(filter_mask),
58                 compare_mask(compare_mask)
59         {
60                 this->key = key;
61         }
62
63         virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
64
65         u32 filter_mask;
66         u32 compare_mask;
67 };
68
69 struct JoystickAxisCmb : public JoystickCombination {
70
71         JoystickAxisCmb() {}
72         JoystickAxisCmb(GameKeyType key, u16 axis_to_compare, int direction, s16 thresh) :
73                 axis_to_compare(axis_to_compare),
74                 direction(direction),
75                 thresh(thresh)
76         {
77                 this->key = key;
78         }
79
80         virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
81
82         u16 axis_to_compare;
83
84         // if -1, thresh must be smaller than the axis value in order to trigger
85         // if  1, thresh must be bigger  than the axis value in order to trigger
86         int direction;
87         s16 thresh;
88 };
89
90 struct JoystickLayout {
91         std::vector<JoystickButtonCmb> button_keys;
92         std::vector<JoystickAxisCmb> axis_keys;
93         JoystickAxisLayout axes[JA_COUNT];
94         s16 axes_dead_border;
95 };
96
97 class JoystickController {
98
99 public:
100         JoystickController();
101
102         void onJoystickConnect(const std::vector<irr::SJoystickInfo> &joystick_infos);
103
104         bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
105         void clear();
106
107         bool wasKeyDown(GameKeyType b)
108         {
109                 bool r = m_past_pressed_keys[b];
110                 m_past_pressed_keys[b] = false;
111                 return r;
112         }
113         bool getWasKeyDown(GameKeyType b)
114         {
115                 return m_past_pressed_keys[b];
116         }
117         void clearWasKeyDown(GameKeyType b)
118         {
119                 m_past_pressed_keys[b] = false;
120         }
121
122         bool wasKeyReleased(GameKeyType b)
123         {
124                 bool r = m_past_released_keys[b];
125                 m_past_released_keys[b] = false;
126                 return r;
127         }
128         bool getWasKeyReleased(GameKeyType b)
129         {
130                 return m_past_pressed_keys[b];
131         }
132         void clearWasKeyReleased(GameKeyType b)
133         {
134                 m_past_pressed_keys[b] = false;
135         }
136
137         bool isKeyDown(GameKeyType b)
138         {
139                 return m_pressed_keys[b];
140         }
141
142         s16 getAxis(JoystickAxis axis)
143         {
144                 return m_axes_vals[axis];
145         }
146
147         s16 getAxisWithoutDead(JoystickAxis axis);
148
149         f32 doubling_dtime;
150
151 private:
152         void setLayoutFromControllerName(const std::string &name);
153
154         JoystickLayout m_layout;
155
156         s16 m_axes_vals[JA_COUNT];
157
158         u8 m_joystick_id;
159
160         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
161
162         f32 m_internal_time;
163
164         f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
165
166         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
167         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
168 };
169
170 #endif