]> git.lizzy.rs Git - dragonfireclient.git/blob - src/client/joystick_controller.h
Turn off verbose info message introduced accidentally with ae9b1aa
[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 #pragma once
21
22 #include "irrlichttypes_extrabloated.h"
23 #include "keys.h"
24 #include <bitset>
25 #include <vector>
26
27 enum JoystickAxis {
28         JA_SIDEWARD_MOVE,
29         JA_FORWARD_MOVE,
30
31         JA_FRUSTUM_HORIZONTAL,
32         JA_FRUSTUM_VERTICAL,
33
34         // To know the count of enum values
35         JA_COUNT,
36 };
37
38 struct JoystickAxisLayout {
39         u16 axis_id;
40         // -1 if to invert, 1 if to keep it.
41         int invert;
42 };
43
44
45 struct JoystickCombination {
46
47         virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const=0;
48
49         GameKeyType key;
50 };
51
52 struct JoystickButtonCmb : public JoystickCombination {
53
54         JoystickButtonCmb() = default;
55
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() = default;
72
73         JoystickAxisCmb(GameKeyType key, u16 axis_to_compare, int direction, s16 thresh) :
74                 axis_to_compare(axis_to_compare),
75                 direction(direction),
76                 thresh(thresh)
77         {
78                 this->key = key;
79         }
80
81         virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
82
83         u16 axis_to_compare;
84
85         // if -1, thresh must be smaller than the axis value in order to trigger
86         // if  1, thresh must be bigger  than the axis value in order to trigger
87         int direction;
88         s16 thresh;
89 };
90
91 struct JoystickLayout {
92         std::vector<JoystickButtonCmb> button_keys;
93         std::vector<JoystickAxisCmb> axis_keys;
94         JoystickAxisLayout axes[JA_COUNT];
95         s16 axes_dead_border;
96 };
97
98 class JoystickController {
99
100 public:
101         JoystickController();
102
103         void onJoystickConnect(const std::vector<irr::SJoystickInfo> &joystick_infos);
104
105         bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
106         void clear();
107
108         bool wasKeyDown(GameKeyType b)
109         {
110                 bool r = m_past_pressed_keys[b];
111                 m_past_pressed_keys[b] = false;
112                 return r;
113         }
114         bool getWasKeyDown(GameKeyType b)
115         {
116                 return m_past_pressed_keys[b];
117         }
118         void clearWasKeyDown(GameKeyType b)
119         {
120                 m_past_pressed_keys[b] = false;
121         }
122
123         bool wasKeyReleased(GameKeyType b)
124         {
125                 bool r = m_past_released_keys[b];
126                 m_past_released_keys[b] = false;
127                 return r;
128         }
129         bool getWasKeyReleased(GameKeyType b)
130         {
131                 return m_past_pressed_keys[b];
132         }
133         void clearWasKeyReleased(GameKeyType b)
134         {
135                 m_past_pressed_keys[b] = false;
136         }
137
138         bool isKeyDown(GameKeyType b)
139         {
140                 return m_pressed_keys[b];
141         }
142
143         s16 getAxis(JoystickAxis axis)
144         {
145                 return m_axes_vals[axis];
146         }
147
148         s16 getAxisWithoutDead(JoystickAxis axis);
149
150         f32 doubling_dtime;
151
152 private:
153         void setLayoutFromControllerName(const std::string &name);
154
155         JoystickLayout m_layout;
156
157         s16 m_axes_vals[JA_COUNT];
158
159         u8 m_joystick_id = 0;
160
161         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
162
163         f32 m_internal_time;
164
165         f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
166
167         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
168         std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
169 };