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 "../generic/unique_id.h"
41 typedef int8_t KeyboardID;
42 typedef int8_t MouseID;
44 #define STRONG_TYPEDEF(name, type) \
45 typedef struct tag_ ## name { \
47 type to_ ## type () const { return v; } \
49 explicit tag_ ## name (type i): v(i) {} \
50 bool operator==(const tag_ ## name & rhs) const { return v == rhs.v; } \
62 typedef int8_t MouseButtonID;
63 typedef int8_t JoystickHatID;
65 static const KeyboardID ALL_KEYBOARDS = -1;
66 static const MouseID ALL_MICE = -1;
67 static const GameControllerIndex ALL_GAME_CONTROLLERS = GameControllerIndex(-1);
97 MOUSE_AXIS_INVALID = -1,
103 MOUSE_AXIS_X = MOUSE_AXIS_0,
104 MOUSE_AXIS_Y = MOUSE_AXIS_1
108 JOYSTICK_AXIS_INVALID = -1,
118 JOYSTICK_AXIS_X = JOYSTICK_AXIS_0,
119 JOYSTICK_AXIS_Y = JOYSTICK_AXIS_1,
120 JOYSTICK_AXIS_XL = JOYSTICK_AXIS_0,
121 JOYSTICK_AXIS_YL = JOYSTICK_AXIS_1,
122 JOYSTICK_AXIS_XR = JOYSTICK_AXIS_2,
123 JOYSTICK_AXIS_YR = JOYSTICK_AXIS_3,
124 JOYSTICK_AXIS_LTRIGGER = JOYSTICK_AXIS_4,
125 JOYSTICK_AXIS_RTRIGGER = JOYSTICK_AXIS_5,
128 enum JoystickHatAxis {
135 enum JoystickButton : int8_t {
136 JOYSTICK_BUTTON_INVALID = -1,
141 JOYSTICK_BUTTON_BACK,
142 JOYSTICK_BUTTON_GUIDE,
143 JOYSTICK_BUTTON_START,
144 JOYSTICK_BUTTON_LEFT_STICK,
145 JOYSTICK_BUTTON_RIGHT_STICK,
146 JOYSTICK_BUTTON_LEFT_SHOULDER,
147 JOYSTICK_BUTTON_RIGHT_SHOULDER,
148 JOYSTICK_BUTTON_DPAD_UP,
149 JOYSTICK_BUTTON_DPAD_DOWN,
150 JOYSTICK_BUTTON_DPAD_LEFT,
151 JOYSTICK_BUTTON_DPAD_RIGHT,
152 JOYSTICK_BUTTON_DPAD2_UP,
153 JOYSTICK_BUTTON_DPAD2_DOWN,
154 JOYSTICK_BUTTON_DPAD2_LEFT,
155 JOYSTICK_BUTTON_DPAD2_RIGHT,
159 const static std::size_t MAX_MOUSE_BUTTONS = 16u;
160 const static std::size_t MAX_JOYSTICK_HATS = 4u;
161 const static std::size_t MAX_DEVICE_TYPE_COUNT = 4u;
164 HAT_POSITION_CENTERED = 0,
166 HAT_POSITION_RIGHT = 2,
167 HAT_POSITION_DOWN = 4,
168 HAT_POSITION_LEFT = 8,
169 HAT_POSITION_RIGHT_UP = HAT_POSITION_RIGHT | HAT_POSITION_UP,
170 HAT_POSITION_RIGHT_DOWN = HAT_POSITION_RIGHT | HAT_POSITION_DOWN,
171 HAT_POSITION_LEFT_UP = HAT_POSITION_LEFT | HAT_POSITION_UP,
172 HAT_POSITION_LEFT_DOWN = HAT_POSITION_LEFT | HAT_POSITION_DOWN
186 GameControllerID id()
const {
190 GameControllerIndex index()
const;
192 bool has_rumble_effect()
const;
204 bool button_state(JoystickButton button)
const;
205 float axis_state(JoystickAxis axis)
const;
206 HatPosition hat_state(JoystickHatID hat)
const;
208 const uint8_t* platform_data()
const {
return &platform_data_.b[0]; }
211 GameControllerID id_ = GameControllerID(-1);
213 uint8_t button_count = 0;
214 uint8_t axis_count = 0;
215 uint8_t hat_count = 0;
217 bool has_rumble_ =
false;
223 bool buttons[JOYSTICK_BUTTON_MAX] = {0};
224 float axises[JOYSTICK_AXIS_MAX] = {0};
225 HatPosition hats[MAX_JOYSTICK_HATS] = {HAT_POSITION_CENTERED};
236 void pre_update(
float dt);
237 void update(
float dt);
243 void _update_mouse_devices(
const std::vector<MouseDeviceInfo>& device_info) {
244 mouse_count_ = std::min(device_info.size(), MAX_DEVICE_TYPE_COUNT);
245 for(decltype(mouse_count_) i = 0; i < mouse_count_; ++i) {
246 mice_[i].button_count = device_info[i].button_count;
247 mice_[i].axis_count = device_info[i].axis_count;
251 void _update_keyboard_devices(
const std::vector<KeyboardDeviceInfo>& device_info) {
252 keyboard_count_ = std::min(device_info.size(), MAX_DEVICE_TYPE_COUNT);
255 void _update_game_controllers(
const std::vector<GameControllerInfo>& device_info);
257 void _handle_key_down(KeyboardID keyboard_id, KeyboardCode code);
258 void _handle_key_up(KeyboardID keyboard_id, KeyboardCode code);
260 void _handle_mouse_motion(MouseID mouse_id, uint32_t x, uint32_t y, int32_t xrel, int32_t yrel);
261 void _handle_mouse_down(MouseID mouse_id, MouseButtonID button_id);
262 void _handle_mouse_up(MouseID mouse_id, MouseButtonID button_id);
265 void _handle_joystick_axis_motion(GameControllerID joypad_id, JoystickAxis axis,
float value);
267 void _handle_joystick_button_down(GameControllerID joypad_id, JoystickButton button);
268 void _handle_joystick_button_up(GameControllerID joypad_id, JoystickButton button);
269 void _handle_joystick_hat_motion(GameControllerID joypad_id, JoystickHatID hat_id, HatPosition position);
272 bool keyboard_key_state(KeyboardID keyboard_id, KeyboardCode code)
const;
274 bool mouse_button_state(MouseID mouse_id, MouseButtonID button)
const;
276 float mouse_axis_state(MouseID mouse_id, MouseAxis axis)
const;
277 Vec2 mouse_position(MouseID mouse_id)
const;
280 const GameController* game_controller_by_id(GameControllerID
id)
const;
282 GameControllerIndex game_controller_index_from_id(GameControllerID
id)
const;
284 std::size_t game_controller_count()
const {
return joystick_count_; }
285 std::size_t keyboard_count()
const {
return keyboard_count_; }
286 std::size_t mouse_count()
const {
return mouse_count_; }
288 JoystickAxis linked_axis(GameControllerID
id, JoystickAxis axis);
293 Window* window_ =
nullptr;
295 bool joystick_button_state(GameControllerID joystick_id, JoystickButton button)
const;
296 float joystick_axis_state(GameControllerID joystick_id, JoystickAxis axis)
const;
297 HatPosition joystick_hat_state(GameControllerID joystick_id, JoystickHatID hat)
const;
300 struct KeyboardState {
301 bool keys[MAX_KEYBOARD_CODES] = {0};
304 uint8_t keyboard_count_ = 0;
305 KeyboardState keyboards_[4];
308 uint8_t button_count = 0;
309 uint8_t axis_count = 0;
311 bool buttons[MAX_MOUSE_BUTTONS] = {0};
312 float axises[MOUSE_AXIS_MAX] = {0};
318 uint8_t mouse_count_ = 0;
321 uint8_t joystick_count_ = 0;
326 #endif // INPUT_CONTROLLER_H