]> git.lizzy.rs Git - minetest.git/blob - src/client/joystick_controller.h
Prevent SIGFPE on entity tile loading issue. (#5178)
[minetest.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         bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
102         void clear();
103
104         bool wasKeyDown(GameKeyType b)
105         {
106                 bool r = m_past_pressed_keys[b];
107                 m_past_pressed_keys[b] = false;
108                 return r;
109         }
110         bool getWasKeyDown(GameKeyType b)
111         {
112                 return m_past_pressed_keys[b];
113         }
114         void clearWasKeyDown(GameKeyType b)
115         {
116                 m_past_pressed_keys[b] = false;
117         }
118
119         bool wasKeyReleased(GameKeyType b)
120         {
121                 bool r = m_past_released_keys[b];
122                 m_past_released_keys[b] = false;
123                 return r;
124         }
125         bool getWasKeyReleased(GameKeyType b)
126         {
127                 return m_past_pressed_keys[b];
128         }
129         void clearWasKeyReleased(GameKeyType b)
130         {
131                 m_past_pressed_keys[b] = false;
132         }
133
134         bool isKeyDown(GameKeyType b)
135         {
136                 return m_pressed_keys[b];
137         }
138
139         s16 getAxis(JoystickAxis axis)
140         {
141                 return m_axes_vals[axis];
142         }
143
144         s16 getAxisWithoutDead(JoystickAxis axis);
145
146         f32 doubling_dtime;
147
148 private:
149         const JoystickLayout *m_layout;
150
151         s16 m_axes_vals[JA_COUNT];
152
153         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
154
155         f32 m_internal_time;
156
157         f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
158
159         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
160         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
161 };
162
163 #endif