19 #ifndef INPUT_CONTROLLER_H
20 #define INPUT_CONTROLLER_H
29 #include "../keycodes.h"
32 #include "../signals/signal.h"
33 #include "../generic/managed.h"
34 #include "../generic/identifiable.h"
35 #include "../core/stage_node_id.h"
36 #include "../utils/limited_vector.h"
41 #define STRONG_TYPEDEF(name, type) \
42 typedef struct tag_##name { \
43 type to_##type() const { \
47 explicit tag_##name(type i) : \
49 bool operator==(const tag_##name& rhs) const { \
52 bool operator<(const tag_##name& rhs) const { \
60 STRONG_TYPEDEF(MouseID, int8_t);
61 STRONG_TYPEDEF(KeyboardID, int8_t);
65 STRONG_TYPEDEF(GameControllerID, int8_t);
69 STRONG_TYPEDEF(GameControllerIndex, int8_t);
71 typedef int8_t MouseButtonID;
72 typedef int8_t JoystickHatID;
74 static const KeyboardID ALL_KEYBOARDS = KeyboardID(-1);
75 static const MouseID ALL_MICE = MouseID(-1);
76 static const GameControllerIndex ALL_GAME_CONTROLLERS = GameControllerIndex(-1);
95 KEYBOARD_TYPE_PHYSICAL,
96 KEYBOARD_TYPE_SOFTWARE,
101 KeyboardType type = KEYBOARD_TYPE_PHYSICAL;
106 uint8_t button_count;
112 MOUSE_AXIS_INVALID = -1,
118 MOUSE_AXIS_X = MOUSE_AXIS_0,
119 MOUSE_AXIS_Y = MOUSE_AXIS_1
123 JOYSTICK_AXIS_INVALID = -1,
133 JOYSTICK_AXIS_X = JOYSTICK_AXIS_0,
134 JOYSTICK_AXIS_Y = JOYSTICK_AXIS_1,
135 JOYSTICK_AXIS_XL = JOYSTICK_AXIS_0,
136 JOYSTICK_AXIS_YL = JOYSTICK_AXIS_1,
137 JOYSTICK_AXIS_XR = JOYSTICK_AXIS_2,
138 JOYSTICK_AXIS_YR = JOYSTICK_AXIS_3,
139 JOYSTICK_AXIS_LTRIGGER = JOYSTICK_AXIS_4,
140 JOYSTICK_AXIS_RTRIGGER = JOYSTICK_AXIS_5,
143 enum JoystickHatAxis {
150 enum JoystickButton : int8_t {
151 JOYSTICK_BUTTON_INVALID = -1,
156 JOYSTICK_BUTTON_BACK,
157 JOYSTICK_BUTTON_GUIDE,
158 JOYSTICK_BUTTON_START,
159 JOYSTICK_BUTTON_LEFT_STICK,
160 JOYSTICK_BUTTON_RIGHT_STICK,
161 JOYSTICK_BUTTON_LEFT_SHOULDER,
162 JOYSTICK_BUTTON_RIGHT_SHOULDER,
163 JOYSTICK_BUTTON_DPAD_UP,
164 JOYSTICK_BUTTON_DPAD_DOWN,
165 JOYSTICK_BUTTON_DPAD_LEFT,
166 JOYSTICK_BUTTON_DPAD_RIGHT,
167 JOYSTICK_BUTTON_DPAD2_UP,
168 JOYSTICK_BUTTON_DPAD2_DOWN,
169 JOYSTICK_BUTTON_DPAD2_LEFT,
170 JOYSTICK_BUTTON_DPAD2_RIGHT,
174 const static std::size_t MAX_MOUSE_BUTTONS = 16u;
175 const static std::size_t MAX_JOYSTICK_HATS = 4u;
176 const static std::size_t MAX_DEVICE_TYPE_COUNT = 4u;
179 HAT_POSITION_CENTERED = 0,
181 HAT_POSITION_RIGHT = 2,
182 HAT_POSITION_DOWN = 4,
183 HAT_POSITION_LEFT = 8,
184 HAT_POSITION_RIGHT_UP = HAT_POSITION_RIGHT | HAT_POSITION_UP,
185 HAT_POSITION_RIGHT_DOWN = HAT_POSITION_RIGHT | HAT_POSITION_DOWN,
186 HAT_POSITION_LEFT_UP = HAT_POSITION_LEFT | HAT_POSITION_UP,
187 HAT_POSITION_LEFT_DOWN = HAT_POSITION_LEFT | HAT_POSITION_DOWN
196 parent_(parent), id_(
id) {}
201 GameControllerID id()
const {
205 GameControllerIndex index()
const;
207 bool has_rumble_effect()
const;
219 bool button_state(JoystickButton button)
const;
220 float axis_state(JoystickAxis axis)
const;
221 HatPosition hat_state(JoystickHatID hat)
const;
223 const uint8_t* platform_data()
const {
return &platform_data_.b[0]; }
226 GameControllerID id_ = GameControllerID(-1);
228 uint8_t button_count = 0;
229 uint8_t axis_count = 0;
230 uint8_t hat_count = 0;
232 bool has_rumble_ =
false;
238 bool buttons[JOYSTICK_BUTTON_MAX] = {0};
239 float axises[JOYSTICK_AXIS_MAX] = {0};
240 HatPosition hats[MAX_JOYSTICK_HATS] = {HAT_POSITION_CENTERED};
245 bool keys[MAX_KEYBOARD_CODES] = {0};
256 void pre_update(
float dt);
257 void update(
float dt);
263 void _update_mouse_devices(
const std::vector<MouseDeviceInfo>& device_info) {
265 for(std::size_t i = 0; i < device_info.size(); ++i) {
266 auto mouse = MouseState();
267 mouse.button_count = device_info[i].button_count;
268 mouse.axis_count = device_info[i].axis_count;
269 mice_.push_back(mouse);
273 void _update_keyboard_devices(
const std::vector<KeyboardDeviceInfo>& device_info) {
275 for(std::size_t i = 0; i < device_info.size(); ++i) {
277 keyboard.type = device_info[i].type;
278 keyboards_.push_back(keyboard);
282 void _update_game_controllers(
const std::vector<GameControllerInfo>& device_info);
284 void _handle_key_down(KeyboardID keyboard_id, KeyboardCode code);
285 void _handle_key_up(KeyboardID keyboard_id, KeyboardCode code);
287 void _handle_mouse_motion(MouseID mouse_id, uint32_t x, uint32_t y, int32_t xrel, int32_t yrel);
288 void _handle_mouse_down(MouseID mouse_id, MouseButtonID button_id);
289 void _handle_mouse_up(MouseID mouse_id, MouseButtonID button_id);
292 void _handle_joystick_axis_motion(GameControllerID joypad_id, JoystickAxis axis,
float value);
294 void _handle_joystick_button_down(GameControllerID joypad_id, JoystickButton button);
295 void _handle_joystick_button_up(GameControllerID joypad_id, JoystickButton button);
296 void _handle_joystick_hat_motion(GameControllerID joypad_id, JoystickHatID hat_id, HatPosition position);
299 bool keyboard_key_state(KeyboardID keyboard_id, KeyboardCode code)
const;
301 bool mouse_button_state(MouseID mouse_id, MouseButtonID button)
const;
303 float mouse_axis_state(MouseID mouse_id, MouseAxis axis)
const;
304 Vec2 mouse_position(MouseID mouse_id)
const;
307 const GameController* game_controller_by_id(GameControllerID
id)
const;
309 GameControllerIndex game_controller_index_from_id(GameControllerID
id)
const;
311 std::size_t game_controller_count()
const {
312 return game_controllers_.size();
314 std::size_t keyboard_count()
const {
315 return keyboards_.size();
318 Keyboard* keyboard_by_id(KeyboardID keyboard_id);
319 const Keyboard* keyboard_by_id(KeyboardID keyboard_id)
const;
321 std::size_t mouse_count()
const {
325 JoystickAxis linked_axis(GameControllerID
id, JoystickAxis axis);
330 Window* window_ =
nullptr;
332 bool joystick_button_state(GameControllerID joystick_id, JoystickButton button)
const;
333 float joystick_axis_state(GameControllerID joystick_id, JoystickAxis axis)
const;
334 HatPosition joystick_hat_state(GameControllerID joystick_id, JoystickHatID hat)
const;
337 uint8_t button_count = 0;
338 uint8_t axis_count = 0;
340 bool buttons[MAX_MOUSE_BUTTONS] = {0};
341 float axises[MOUSE_AXIS_MAX] = {0};
353 #endif // INPUT_CONTROLLER_H