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
107void os_input_manager::on_os_event(const os::event& e)
108{
109 switch(e.type)
110 {
111 case os::events::key_down:
112 {
113 auto& state_map = keyboard_->get_key_state_map();
114 key_code key = get_key_map().get_key(e.key.code, key_code::unknown);
115 state_map.set_state(key, key_state::pressed);
116 break;
117 }
118 case os::events::key_up:
119 {
120 auto& state_map = keyboard_->get_key_state_map();
121 key_code key = get_key_map().get_key(e.key.code, key_code::unknown);
122 state_map.set_state(key, key_state::released);
123 break;
124 }
125
126 case os::events::mouse_button:
127 {
128 auto& state_map = mouse_->get_button_state_map();
129
130 button_state state{};
131 switch(e.button.state_id)
132 {
133 case os::state::pressed:
134 {
135 state = button_state::pressed;
136 break;
137 }
138 case os::state::released:
139 {
141 break;
142 }
143 default:
144 break;
145 }
146
148 switch(e.button.button)
149 {
150 case os::mouse::button::left:
151 {
153 break;
154 }
155 case os::mouse::button::right:
156 {
158 break;
159 }
160 case os::mouse::button::middle:
161 {
163 break;
164 }
165 case os::mouse::button::x1:
166 {
168 break;
169 }
170
171 case os::mouse::button::x2:
172 {
174 break;
175 }
176 default:
177 break;
178 }
179
180 if(is_inside_work_zone(mouse_->get_position()))
181 {
182 state_map.set_state(static_cast<uint32_t>(mouse_button), state);
183 }
184 break;
185 }
186
187 case os::events::mouse_motion:
188 {
189 break;
190 }
191
192 case os::events::mouse_wheel:
193 {
194 if(is_inside_work_zone(mouse_->get_position()))
195 {
196 mouse_->set_scroll(e.wheel.y);
197 }
198 break;
199 }
200
201 case os::events::gamepad_added:
202 {
203 for(auto& kvp : gamepads_)
204 {
205 auto& gamepad = kvp.second;
206 gamepad->refresh_device();
207 }
208 break;
209 }
210 case os::events::gamepad_removed:
211 {
212 for(auto& kvp : gamepads_)
213 {
214 auto& gamepad = kvp.second;
215 gamepad->refresh_device();
216 }
217 break;
218 }
219
220 default:
221 break;
222 }
223}
224
226{
227 auto calc_zone = work_input_zone_ ? work_input_zone_ : window_input_zone_;
228 // Ensure both zones are defined
229 if(!calc_zone)
230 {
231 return global_pos;
232 }
233
234 const auto& work_zone = *calc_zone;
235
236 coord remapped_pos{};
237 remapped_pos.x = global_pos.x - work_zone.x;
238 remapped_pos.y = global_pos.y - work_zone.y;
239
240 if(input_reference_size_)
241 {
242 remapped_pos.x *= float(input_reference_size_->w) / float(work_zone.w);
243 remapped_pos.y *= float(input_reference_size_->h) / float(work_zone.h);
244 }
245
246 return remapped_pos;
247}
248
250{
251 auto calc_zone = work_input_zone_ ? work_input_zone_ : window_input_zone_;
252 // Ensure both zones are defined
253 if(!calc_zone)
254 {
255 return true;
256 }
257
258 const auto& work_zone = *calc_zone;
259 auto left = 0;
260 auto right = work_zone.w;
261 auto top = 0;
262 auto bottom = work_zone.h;
263
264
265 if(input_reference_size_)
266 {
267 float scale_x = float(input_reference_size_->w) / float(work_zone.w);
268 float scale_y = float(input_reference_size_->h) / float(work_zone.h);
269 left *= scale_x;
270 right *= scale_x;
271 top *= scale_y;
272 bottom *= scale_y;
273 }
274
275 return pos.x >= left && pos.x <= right && pos.y >= top && pos.y <= bottom;
276}
277
279{
280 is_input_allowed_ = allowed;
281
282 for(const auto& dev : devices_)
283 {
284 dev->set_is_input_allowed(allowed);
285 }
286}
287
289{
290 return is_input_allowed_;
291}
292} // 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_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