34 if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) != 0)
36 debug::log_error(
"Failed to initialize SDL joystick and controller subsytems: {}", SDL_GetError());
37 throw std::runtime_error(
"Failed to initialize SDL joystick and controller subsytems");
57 SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
64 std::uint16_t sdl_key_mod = KMOD_NONE;
75 const int status = SDL_PeepEvents(&
event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LOCALECHANGED);
84 throw std::runtime_error(
"Failed to peep SDL events");
104 const int status = SDL_PeepEvents(&
event, 1, SDL_GETEVENT, SDL_KEYDOWN, SDL_LASTEVENT);
113 throw std::runtime_error(
"Failed to peep SDL events");
118 [[likely]]
case SDL_MOUSEMOTION:
120 m_mouse.
move({
event.motion.x,
event.motion.y}, {
event.motion.xrel,
event.motion.yrel});
124 [[likely]]
case SDL_KEYDOWN:
131 if (sdl_key_mod !=
event.key.keysym.mod)
133 sdl_key_mod =
event.key.keysym.mod;
136 if (sdl_key_mod & KMOD_LSHIFT)
138 if (sdl_key_mod & KMOD_RSHIFT)
140 if (sdl_key_mod & KMOD_LCTRL)
142 if (sdl_key_mod & KMOD_RCTRL)
144 if (sdl_key_mod & KMOD_LALT)
146 if (sdl_key_mod & KMOD_RALT)
148 if (sdl_key_mod & KMOD_LGUI)
150 if (sdl_key_mod & KMOD_RGUI)
152 if (sdl_key_mod & KMOD_NUM)
154 if (sdl_key_mod & KMOD_CAPS)
156 if (sdl_key_mod & KMOD_SCROLL)
158 if (sdl_key_mod & KMOD_MODE)
162 if (
event.type == SDL_KEYDOWN)
176 const float flip = (
event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) ? -1.0f : 1.0f;
177 m_mouse.
scroll({
event.wheel.preciseX *
flip,
event.wheel.preciseY *
flip});
181 case SDL_MOUSEBUTTONDOWN:
187 case SDL_MOUSEBUTTONUP:
193 [[likely]]
case SDL_CONTROLLERAXISMOTION:
195 if (
event.caxis.axis != SDL_CONTROLLER_AXIS_INVALID)
197 if (
auto it = m_gamepad_map.find(
event.cdevice.which); it != m_gamepad_map.end())
202 static_cast<float>(
event.caxis.value),
203 static_cast<float>(std::numeric_limits<decltype(
event.caxis.value)>::min()),
204 static_cast<float>(std::numeric_limits<decltype(
event.caxis.value)>::max()),
216 case SDL_CONTROLLERBUTTONDOWN:
218 if (
event.cbutton.button != SDL_CONTROLLER_BUTTON_INVALID)
220 if (
auto it = m_gamepad_map.find(
event.cdevice.which); it != m_gamepad_map.end())
228 case SDL_CONTROLLERBUTTONUP:
230 if (
event.cbutton.button != SDL_CONTROLLER_BUTTON_INVALID)
232 if (
auto it = m_gamepad_map.find(
event.cdevice.which); it != m_gamepad_map.end())
240 [[unlikely]]
case SDL_CONTROLLERDEVICEADDED:
242 if (SDL_IsGameController(
event.cdevice.which))
244 SDL_GameController* sdl_controller = SDL_GameControllerOpen(
event.cdevice.which);
248 const char* controller_name = SDL_GameControllerNameForIndex(
event.cdevice.which);
249 if (!controller_name)
251 controller_name =
"";
254 if (
auto it = m_gamepad_map.find(
event.cdevice.which); it != m_gamepad_map.end())
258 it->second->connect();
263 SDL_Joystick* sdl_joystick = SDL_GameControllerGetJoystick(sdl_controller);
264 SDL_JoystickGUID sdl_guid = SDL_JoystickGetGUID(sdl_joystick);
268 std::memcpy(gamepad_uuid.
data.data(), sdl_guid.data, gamepad_uuid.
data.size());
273 auto& gamepad = m_gamepad_map[
event.cdevice.which];
274 gamepad = std::make_unique<input::gamepad>();
275 gamepad->set_uuid(gamepad_uuid);
294 [[unlikely]]
case SDL_CONTROLLERDEVICEREMOVED:
296 SDL_GameController* sdl_controller = SDL_GameControllerFromInstanceID(
event.cdevice.which);
300 SDL_GameControllerClose(sdl_controller);
301 if (
auto it = m_gamepad_map.find(
event.cdevice.which); it != m_gamepad_map.end())
303 it->second->disconnect();
323 if (SDL_ShowCursor((visible) ? SDL_ENABLE : SDL_DISABLE) < 0)
325 debug::log_error(
"Failed to set cursor visibility: \"{}\"", SDL_GetError());
332 if (SDL_SetRelativeMouseMode((enabled) ? SDL_TRUE : SDL_FALSE) < 0)
334 debug::log_error(
"Failed to set relative mouse mode: \"{}\"", SDL_GetError());
void dispatch(const T &message) const
Dispatches a message to subscribers of the message type.
status
Behavior tree node return status enumerations.
constexpr T flip(T x, int i) noexcept
Flips a single bit in a value.
log_message< log_message_severity::trace, Args... > log_trace
Formats and logs a trace message.
log_message< log_message_severity::debug, Args... > log_debug
Formats and logs a debug message.
log_message< log_message_severity::error, Args... > log_error
Formats and logs an error message.
log_message< log_message_severity::info, Args... > log_info
Formats and logs an info message.
Publish-subscribe messaging.
constexpr T map(T x, T from_min, T from_max, T to_min, T to_max) noexcept
Remaps a number from one range to another.
@ position
Vertex position (vec3)
128-bit universally unique identifier (UUID).
std::array< std::byte, 16 > data
UUID data.
std::string string() const
Returns a string representation of the UUID.