23#define __WIZARD_ENGINE_INTERNAL__
34SDL_Keycode wze::input::_key = SDLK_UNKNOWN;
35std::array<bool, wze::KEY_COUNT> wze::input::_keys = {};
36std::unordered_map<std::string, std::vector<wze::key>> wze::input::_keymaps;
37float wze::input::_cursor_absolute_x = 0;
38float wze::input::_cursor_absolute_y = 0;
39float wze::input::_cursor_relative_x = 0;
40float wze::input::_cursor_relative_y = 0;
41float wze::input::_mouse_sensitivity = 1;
42std::unordered_map<size_t, wze::finger> wze::input::_fingers;
43std::optional<wze::gesture> wze::input::_gesture;
44std::unique_ptr<SDL_Sensor, std::function<void(SDL_Sensor*)>>
45 wze::input::_accelerometer;
46std::array<float, 3> wze::input::_accelerometer_xyz = {};
48void wze::input::update_key() {
49 std::vector<SDL_Event>::const_reverse_iterator iterator;
52 for (iterator = engine::events().rbegin();
53 iterator != engine::events().rend(); ++iterator) {
54 if (iterator->type == SDL_KEYDOWN) {
55 _key = iterator->key.keysym.sym;
61void wze::input::update_keys() {
62 uint8_t
const* keyboard_keys;
64 std::vector<SDL_Event>::const_reverse_iterator iterator;
66 static_assert((size_t)KEY_COUNT <= (size_t)SDL_NUM_SCANCODES);
67 keyboard_keys = SDL_GetKeyboardState(
nullptr);
69 std::copy(keyboard_keys, keyboard_keys + KEY_COUNT, _keys.data());
71 mouse_keys = SDL_GetMouseState(
nullptr,
nullptr);
72 _keys.at(KEY_MOUSE_LEFT) = (bool)(mouse_keys & SDL_BUTTON_LMASK);
73 _keys.at(KEY_MOUSE_MIDDLE) = (bool)(mouse_keys & SDL_BUTTON_MMASK);
74 _keys.at(KEY_MOUSE_RIGHT) = (bool)(mouse_keys & SDL_BUTTON_RMASK);
75 _keys.at(KEY_MOUSE_X1) = (bool)(mouse_keys & SDL_BUTTON_X1MASK);
76 _keys.at(KEY_MOUSE_X2) = (bool)(mouse_keys & SDL_BUTTON_X2MASK);
78 _keys.at(KEY_MOUSE_WHEEL_DOWN) =
false;
79 _keys.at(KEY_MOUSE_WHEEL_UP) =
false;
80 for (iterator = engine::events().rbegin();
81 iterator != engine::events().rend(); ++iterator) {
82 if (iterator->type == SDL_MOUSEWHEEL) {
83 if (iterator->wheel.y < 0) {
84 _keys.at(KEY_MOUSE_WHEEL_DOWN) =
true;
85 }
else if (0 < iterator->wheel.y) {
86 _keys.at(KEY_MOUSE_WHEEL_UP) =
true;
93void wze::input::update_cursor() {
94 std::vector<SDL_Event>::const_reverse_iterator iterator;
98 for (iterator = engine::events().rbegin();
99 iterator != engine::events().rend(); ++iterator) {
100 if (iterator->type == SDL_MOUSEMOTION) {
102 (float)std::clamp(iterator->motion.x, 0, window::width() - 1);
104 (float)std::clamp(iterator->motion.y, 0, window::height() - 1);
105 std::tie(_cursor_absolute_x, _cursor_absolute_y) =
106 renderer::detransform(cursor_absolute_x(), cursor_absolute_y());
111 SDL_GetRelativeMouseState(&x, &y);
112 _cursor_relative_x = (float)x * mouse_sensitivity();
113 _cursor_relative_y = (float)y * mouse_sensitivity();
116void wze::input::update_fingers() {
117 std::vector<SDL_Event>::const_iterator iterator;
119 std::for_each(_fingers.begin(), _fingers.end(),
120 [](std::pair<size_t const, finger>& finger) ->
void {
121 finger.second.relative_x = 0;
122 finger.second.relative_y = 0;
125 for (iterator = engine::events().begin();
126 iterator != engine::events().end(); ++iterator) {
128 switch (iterator->type) {
130 _fingers.erase(iterator->tfinger.fingerId);
133 case SDL_FINGERMOTION:
134 finger& finger = _fingers[iterator->tfinger.fingerId];
135 std::tie(finger.absolute_x, finger.absolute_y) =
136 renderer::detransform(
137 iterator->tfinger.x * (
float)window::width(),
138 iterator->tfinger.y * (
float)window::height());
139 finger.relative_x += iterator->tfinger.dx * (float)window::width();
140 finger.relative_y += iterator->tfinger.dy * (float)window::height();
145void wze::input::update_gesture() {
146 std::vector<SDL_Event>::const_iterator iterator;
148 _gesture = std::nullopt;
149 for (iterator = engine::events().begin();
150 iterator != engine::events().end(); ++iterator) {
151 if (iterator->type == SDL_MULTIGESTURE) {
156 [&](
float x,
float y) ->
void {
159 _gesture->length += iterator->mgesture.dDist;
160 _gesture->angle += iterator->mgesture.dTheta;
162 renderer::detransform(
163 iterator->mgesture.x * (
float)window::width(),
164 iterator->mgesture.y * (
float)window::height()));
169void wze::input::update_accelerometer() {
170 if (!_accelerometer) {
173 if ((
bool)SDL_SensorGetData(_accelerometer.get(), _accelerometer_xyz.data(),
174 _accelerometer_xyz.size())) {
175 throw exception(SDL_GetError());
177 std::for_each(_accelerometer_xyz.begin(), _accelerometer_xyz.end(),
178 [](
float& axis) ->
void {
179 axis *= math::pi() / SDL_STANDARD_GRAVITY;
183bool wze::input::text_input() {
184 return (
bool)SDL_IsTextInputActive();
187void wze::input::set_text_input(
bool text_input) {
189 SDL_StartTextInput();
195uint32_t wze::input::key() {
199std::unordered_map<std::string, std::vector<wze::key>>& wze::input::keymaps() {
203float wze::input::cursor_absolute_x() {
204 return _cursor_absolute_x;
207float wze::input::cursor_absolute_y() {
208 return _cursor_absolute_y;
211float wze::input::cursor_relative_x() {
212 return _cursor_relative_x;
215float wze::input::cursor_relative_y() {
216 return _cursor_relative_y;
219float wze::input::mouse_sensitivity() {
220 return _mouse_sensitivity;
223void wze::input::set_mouse_sensitivity(
float mouse_sensitivity) {
224 _mouse_sensitivity = mouse_sensitivity;
227bool wze::input::cursor_visible() {
228 return (
bool)SDL_GetRelativeMouseMode();
231void wze::input::set_cursor_visible(
bool cursor_visible) {
232 if ((
bool)SDL_SetRelativeMouseMode((SDL_bool)!cursor_visible)) {
233 throw exception(SDL_GetError());
237void wze::input::set_cursor_appearance(
238 std::unique_ptr<cursor, std::function<
void(cursor*)>> cursor_appearance) {
239 SDL_SetCursor(cursor_appearance.release());
242std::unordered_map<size_t, wze::finger>
const& wze::input::fingers() {
246std::optional<wze::gesture>
const& wze::input::gesture() {
250float wze::input::accelerometer_x() {
251 return _accelerometer_xyz.at(1);
254float wze::input::accelerometer_y() {
255 return _accelerometer_xyz.at(0);
258float wze::input::accelerometer_z() {
259 return _accelerometer_xyz.at(2);
262void wze::input::initialize() {
263 int32_t sensor_count;
266 sensor_count = SDL_NumSensors();
267 for (sensor = 0; sensor != sensor_count; ++sensor) {
268 if (SDL_SensorGetDeviceType(sensor) == SDL_SENSOR_ACCEL) {
269 _accelerometer = {SDL_SensorOpen(sensor), SDL_SensorClose};
270 if (!_accelerometer) {
271 throw exception(SDL_GetError());
277void wze::input::update() {
283 update_accelerometer();
286bool wze::input::key(
enum key key) {
287 return _keys.at(
key);
290bool wze::input::key(std::string
const& name) {
291 std::vector<enum key>& keys = keymaps().at(name);
292 return std::any_of(keys.begin(), keys.end(), [](
enum key key) ->
bool {
293 return input::key(key);
297std::pair<float, float> wze::input::cursor_spatial(
float z) {
298 return camera::unproject(cursor_absolute_x(), cursor_absolute_y(), z);
Subsystem to handle transformations and spatial projections.
Master singleton of the Wizard Engine.
Subsystem to handle graphics.
Subsystem to handle game window.