Unravel Engine C++ Reference
Loading...
Searching...
No Matches
os_input_manager.cpp
Go to the documentation of this file.
2#include "../bimap.hpp"
3#include "os_key_map.hpp"
4#include <cassert>
5#include <logging/logging.h>
6
7namespace input
8{
9
10namespace
11{
12auto get_key_map() -> bimap<key_code, int>&
13{
14 static bimap<key_code, int> keyMap;
15 return keyMap;
16}
17} // namespace
18
19// ----------------------------------------------------------------------------
24
26{
27 for(uint32_t index = 0; index < get_max_gamepads(); ++index)
28 {
29 auto gamepad = std::make_shared<os_gamepad>(index);
30 devices_.emplace_back(gamepad);
31 gamepads_[index] = gamepad.get();
32 }
33
34 auto keyboard = std::make_shared<os_keyboard>();
35 devices_.emplace_back(keyboard);
36 keyboard_ = keyboard.get();
37
38 auto mouse = std::make_shared<os_mouse>();
39 devices_.emplace_back(mouse);
40 mouse_ = mouse.get();
41}
42
43auto os_input_manager::get_all_devices() const -> const std::vector<std::shared_ptr<input_device>>&
44{
45 return devices_;
46}
47
48// ----------------------------------------------------------------------------
49auto os_input_manager::get_gamepad(uint32_t index) const -> const gamepad&
50{
51 return *gamepads_.at(index);
52}
53
54auto os_input_manager::get_max_gamepads() const -> uint32_t
55{
56 return 16;
57}
58
59// ----------------------------------------------------------------------------
60auto os_input_manager::get_mouse() const -> const mouse&
61{
62 return *mouse_;
63}
64
65// ----------------------------------------------------------------------------
67{
68 return *keyboard_;
69}
70
71// ----------------------------------------------------------------------------
73{
74 // Update Pressed and Released states to Down and Up
75 keyboard_->update();
76
77 mouse_->update();
78
79 auto pos = os::mouse::get_position();
80 mouse_->set_position(remap_to_work_zone({pos.x, pos.y}));
81}
82
84{
85 // Update gamepads
86 for(auto& kvp : gamepads_)
87 {
88 auto& gamepad = kvp.second;
89 gamepad->update();
90 }
91}
93{
94 window_input_zone_ = window_zone;
95}
96
98{
99 work_input_zone_ = work_zone;
100}
101
103{
104 input_reference_size_ = reference_size;
105}
106
108{
109
110 if(work_input_zone_)
111 {
112 return *work_input_zone_;
113 }
114 if(window_input_zone_)
115 {
116 return *window_input_zone_;
117 }
118
119 return {0, 0, 1024, 768};
120}
121
122void os_input_manager::on_os_event(const os::event& e)
123{
124 switch(e.type)
125 {
126 case os::events::key_down:
127 {
128 auto& state_map = keyboard_->get_key_state_map();
129 key_code key = get_key_map().get_key(e.key.code, key_code::unknown);
130 state_map.set_state(key, key_state::pressed);
131 break;
132 }
133 case os::events::key_up:
134 {
135 auto& state_map = keyboard_->get_key_state_map();
136 key_code key = get_key_map().get_key(e.key.code, key_code::unknown);
137 state_map.set_state(key, key_state::released);
138 break;
139 }
140
141 case os::events::mouse_button:
142 {
143 auto& state_map = mouse_->get_button_state_map();
144
145 button_state state{};
146 switch(e.button.state_id)
147 {
148 case os::state::pressed:
149 {
150 state = button_state::pressed;
151 break;
152 }
153 case os::state::released:
154 {
156 break;
157 }
158 default:
159 break;
160 }
161
163 switch(e.button.button)
164 {
165 case os::mouse::button::left:
166 {
168 break;
169 }
170 case os::mouse::button::right:
171 {
173 break;
174 }
175 case os::mouse::button::middle:
176 {
178 break;
179 }
180 case os::mouse::button::x1:
181 {
183 break;
184 }
185
186 case os::mouse::button::x2:
187 {
189 break;
190 }
191 default:
192 break;
193 }
194
195 if(is_inside_work_zone(mouse_->get_position()))
196 {
197 state_map.set_state(static_cast<uint32_t>(mouse_button), state);
198 }
199 break;
200 }
201
202 case os::events::mouse_motion:
203 {
204 break;
205 }
206
207 case os::events::mouse_wheel:
208 {
209 if(is_inside_work_zone(mouse_->get_position()))
210 {
211 mouse_->set_scroll(e.wheel.y);
212 }
213 break;
214 }
215
216 case os::events::gamepad_added:
217 {
218 for(auto& kvp : gamepads_)
219 {
220 auto& gamepad = kvp.second;
221 gamepad->refresh_device();
222 }
223 break;
224 }
225 case os::events::gamepad_removed:
226 {
227 for(auto& kvp : gamepads_)
228 {
229 auto& gamepad = kvp.second;
230 gamepad->refresh_device();
231 }
232 break;
233 }
234
235 default:
236 break;
237 }
238}
239
241{
242 auto calc_zone = work_input_zone_ ? work_input_zone_ : window_input_zone_;
243 // Ensure both zones are defined
244 if(!calc_zone)
245 {
246 return global_pos;
247 }
248
249 const auto& work_zone = *calc_zone;
250
251 coord remapped_pos{};
252 remapped_pos.x = global_pos.x - work_zone.x;
253 remapped_pos.y = global_pos.y - work_zone.y;
254
255 if(input_reference_size_)
256 {
257 remapped_pos.x *= float(input_reference_size_->w) / float(work_zone.w);
258 remapped_pos.y *= float(input_reference_size_->h) / float(work_zone.h);
259 }
260
261 return remapped_pos;
262}
263
265{
266 auto calc_zone = work_input_zone_ ? work_input_zone_ : window_input_zone_;
267 // Ensure both zones are defined
268 if(!calc_zone)
269 {
270 return true;
271 }
272
273 const auto& work_zone = *calc_zone;
274 auto left = 0;
275 auto right = work_zone.w;
276 auto top = 0;
277 auto bottom = work_zone.h;
278
279 if(input_reference_size_)
280 {
281 float scale_x = float(input_reference_size_->w) / float(work_zone.w);
282 float scale_y = float(input_reference_size_->h) / float(work_zone.h);
283 left *= scale_x;
284 right *= scale_x;
285 top *= scale_y;
286 bottom *= scale_y;
287 }
288
289 return pos.x >= left && pos.x <= right && pos.y >= top && pos.y <= bottom;
290}
291
293{
294 is_input_allowed_ = allowed;
295
296 for(const auto& dev : devices_)
297 {
298 dev->set_is_input_allowed(allowed);
299 }
300}
301
303{
304 return is_input_allowed_;
305}
306} // namespace input
auto is_inside_work_zone(coord global_pos) -> bool
void before_events_update() override
auto get_max_gamepads() const -> uint32_t override
auto get_work_zone() const -> zone
auto get_mouse() const -> const mouse &override
void set_work_zone(const zone &work_zone)
void set_is_input_allowed(bool allowed)
auto get_keyboard() const -> const keyboard &override
void set_reference_size(const input_reference_size &reference_size)
void set_window_zone(const zone &window_zone)
auto get_gamepad(uint32_t index) const -> const gamepad &override
void after_events_update() override
auto get_all_devices() const -> const std::vector< std::shared_ptr< input_device > > &
auto is_input_allowed() const -> bool
auto remap_to_work_zone(coord global_pos) -> coord
void on_os_event(const os::event &e)
auto get_key_state_map() -> key_state_map &
auto get_position() const -> coord override
Definition os_mouse.cpp:53
void set_scroll(float scroll)
Definition os_mouse.cpp:110
auto get_button_state_map() -> button_state_map &
Definition os_mouse.cpp:12
void set_position(coord pos)
Definition os_mouse.cpp:101
void initialize_os_key_map(bimap< key_code, int > &key_map)
Definition os_key_map.cpp:7
key_code
Definition key.hpp:6
Hash specialization for batch_key to enable use in std::unordered_map.