Cogs.Core
EventBasedInput.cpp
1
2#include "EventBasedInput.h"
3
5{
6 newEvents.clear();
7 size_t mouseIndex = 0;
8 size_t keyboardIndex = 0;
9 const auto& keyboardEvents = keyboard.getEvents();
10 const auto& mouseEvents = mouse.getEvents();
11 while (keyboardIndex < keyboardEvents.size() || mouseIndex < mouseEvents.size()) {
12 const Cogs::Keyboard::Event* keyboardEvent = nullptr;
13 const Cogs::Mouse::Event* mouseEvent = nullptr;
14 if (keyboardIndex >= keyboardEvents.size()) {
15 mouseEvent = &mouseEvents[mouseIndex++];
16 }
17 else if (mouseIndex >= mouseEvents.size()) {
18 keyboardEvent = &keyboardEvents[keyboardIndex++];
19 }
20 else if (mouseEvents[mouseIndex].timestamp_ms < keyboardEvents[keyboardIndex].timestamp_ms) {
21 mouseEvent = &mouseEvents[mouseIndex++];
22 }
23 else {
24 keyboardEvent = &keyboardEvents[keyboardIndex++];
25
26 }
27
28 if (keyboardEvent) {
29 handleKeyboardEvent(*keyboardEvent);
30 }
31 else {
32 handleMouseEvent(*mouseEvent);
33 }
34 }
35}
36
37void Cogs::Core::EventBasedInput::handleMouseEvent(const Cogs::Mouse::Event& mouseEvent)
38{
39 Cogs::Core::InputEvent& event = newEvents.emplace_back();
41 event.modifiers = modifiers;
42 event.timestamp_ms = mouseEvent.timestamp_ms;
43 event.mouseEvent = mouseEvent;
44
45}
46
48{
49 switch (keyboardEvent.type) {
50 case Cogs::Keyboard::Event::Type::Press:
51 {
52 const Key k = std::get<Key>(keyboardEvent.data);
53 switch (k) {
54 // Which needed TBD - also for Other modifiers.
55 case Key::Shift:
56 case Key::LeftShift:
57 case Key::RightShift:
58 modifiers |= KeyboardModifiers::Shift;
59 break;
60 case Key::Control:
61 modifiers |= KeyboardModifiers::Control;
62 break;
63 case Key::Alt:
64 modifiers |= KeyboardModifiers::Alt;
65 break;
66 default:
67 Cogs::Core::InputEvent& event = newEvents.emplace_back();
69 event.modifiers = modifiers;
70 event.timestamp_ms = keyboardEvent.timestamp_ms;
71 event.keyEvent.key = k;
72 //LOG_DEBUG(logger, "NewInput Event Press: %d", int(k));
73 break;
74 }
75 }
76 break;
77
78 case Cogs::Keyboard::Event::Type::Release:
79 {
80 const Key k = std::get<Key>(keyboardEvent.data);
81 switch (k) {
82 case Key::Shift:
83 case Key::LeftShift:
84 case Key::RightShift:
85 modifiers &= ~KeyboardModifiers::Shift;
86 break;
87 case Key::Control:
88 modifiers &= ~KeyboardModifiers::Control;
89 break;
90 case Key::Alt:
91 modifiers &= ~KeyboardModifiers::Alt;
92 break;
93 default:
94 break;
95 }
96 }
97
99 case Cogs::Keyboard::Event::Type::Reset:
100 {
101 modifiers = KeyboardModifiers::None;
102 Cogs::Core::InputEvent& event = newEvents.emplace_back();
104 event.modifiers = modifiers;
105 event.timestamp_ms = keyboardEvent.timestamp_ms;
106 }
107 break;
108
109 default:
110 break;
111 }
112}
void updateState(const Cogs::Keyboard &keyboard, const Cogs::Mouse &mouse)
void handleKeyboardEvent(const Cogs::Keyboard::Event &keyboardEvent)
std::vector< InputEvent > newEvents
New list of input events.
const std::vector< Event > & getEvents() const
Get the previous frame's event list. Updated at the beginning of each new frame.
Definition: Keyboard.h:88
KeyboardModifiers
Current keyboard modifiers.
@ Reset
Input Focus lost event. Typically reset any cached mouse/keyboard state.
@ Keyboard
Keyboard event.
Event input queue event. Contains either a keyboard or mouse event. Keyboard event:
InputEventType inputEventType
Marks if this entry if a Keyboard event.
std::variant< Key, std::string > data
Data associated with the event: Key for Press and Release events, std::string for AddChar events and ...
Definition: Keyboard.h:67
Type type
Event type.
Definition: Keyboard.h:63
double timestamp_ms
Timestamp in miliseconds.
Definition: Keyboard.h:64
double timestamp_ms
Timestamp in miliseconds.
Definition: Mouse.h:56