Calamity Engine 1.0.0
A cross-platform 2D game engine written in C++ and SDL3.
Loading...
Searching...
No Matches
input.hpp
Go to the documentation of this file.
1#pragma once
2#include <SDL3/SDL.h>
3#include "../../core/definitions.hpp"
4#include "keycode.hpp"
5#include <map>
6#include <optional>
7// enums //
8
34
35enum class ControllerAxis {
36 INVALID = -1,
37 LEFT_X,
38 LEFT_Y,
39 RIGHT_X,
40 RIGHT_Y,
44};
45
46enum class MouseButton {
47 NONE,
48 LEFT,
49 MIDDLE,
50 RIGHT,
57};
58
59// input events //
60
62{
63public:
64 virtual ~InputEvent() = default;
65 virtual bool operator==(const InputEvent& other) const { return false; };
66 virtual bool operator<=(const InputEvent& other) const { return false; };
67
68 bool isActionPressed(const std::string& action) const;
69 bool isActionReleased(const std::string& action) const;
70 bool isAction(const std::string& action) const;
71
72 // float getActionStrength(std::string action) const;
73 virtual bool isPressed() const { return false; }
74 virtual bool isReleased() const { return false; }
75 virtual float getStrength() const { return 0.0f; }
76};
77
79public:
80 std::string action = "";
81 int eventIndex = -1;
82 bool pressed = false;
83 float strength = 1.0;
84
85 bool isPressed() const { return pressed; };
86 bool isReleased() const { return !pressed; };
87 float getStrength() const { return strength; };
88};
89
91public:
92 bool altPressed = false;
94 bool ctrlPressed = false;
95 bool metaPressed = false;
96 bool shiftPressed = false;
97
98 // TODO make this use keymodifiermask or whatever godot does
99 std::vector<bool> getModifiersMask() const;
101};
102
103// TODO add keylabel and shit to this from SDL key
105public:
106 bool operator==(const InputEvent& other) const;
107 bool operator<=(const InputEvent& other) const;
108
109 bool echo = false; // todo
112 const char * keyLabel;
113 bool pressed = false;
114
115 bool isPressed() const { return pressed; };
116 bool isReleased() const { return !pressed; };
117 float getStrength() const { return (float)pressed; }
118};
119
121public:
124};
125
126// here's one thing that i dont like how godot does.
127// if its a mouse wheel event i'll just put like the entire Vector2 of factor because
128// then if you're using a touchpad (for example) you dont actually get the high resolution 2d scroll or whatever
130public:
131 bool operator==(const InputEvent& other) const;
132 bool operator<=(const InputEvent& other) const;
133
135 bool doubleClick = false;
136 Vector2 factor = {0, 0};
137 bool pressed = false;
138
139 bool isPressed() const { return pressed; };
140 bool isReleased() const { return !pressed; };
141 float getStrength() const { return (float)pressed; };
142};
143
145public:
146 bool operator==(const InputEvent& other) const;
147 bool operator<=(const InputEvent& other) const;
148
149 // this also has some stuff to do with drawing pens so todo that i guess
150 // should be easy with SDL pen events
153};
154
156public:
157 bool operator==(const InputEvent& other) const;
158 bool operator<=(const InputEvent& other) const;
159
162 float pressure = 1.0f;
164
165 bool isPressed() const { return pressed; };
166 bool isReleased() const { return !pressed; };
167 float getStrength() const { return (float)pressed; } // for now its this because sdl doesnt do gamepad button pressure :(
168};
169
171public:
172 bool operator==(const InputEvent& other) const;
173 bool operator<=(const InputEvent& other) const;
174
177};
178
180public:
181 bool operator==(const InputEvent& other) const;
182 bool operator<=(const InputEvent& other) const;
183
185 float motion;
187
188 float getStrength() const { return motion; };
189};
190
191#include "../../core/node/components.hpp"
192
193// input registry stuff //
194
196 std::string name;
197 std::vector<std::unique_ptr<InputEvent>> events;
198 float deadzone;
199};
200
228public:
229 int actionAddEvent(const std::string& name, std::unique_ptr<InputEvent> event);
230 void actionRemoveEvent(const std::string& action, int index);
231 void actionRemoveEvents(const std::string& action);
232 float actionGetDeadzone(const std::string& action) const;
233 std::vector<InputEvent> actionGetEvents(std::string action);
234 void actionSetDeadzone(const std::string& action, float deadzone);
235 void addAction(const std::string& action, float deadzone = 0.1f);
236 void removeAction(const std::string& action);
237 bool eventIsAction(const InputEvent* event, const std::string& name, bool identityCheck = false);
238 std::vector<std::string> getActions();
239 bool hasAction(const std::string& action) const;
240 std::unordered_map<std::string, InputRegistryAction> *getActionsArray();
241private:
242 std::unordered_map<std::string, InputRegistryAction> actions;
243};
244
245// input stuff //
246
255class Input
256{
257public:
258 void update(float deltaTime);
259
260 bool isKeyPressed(Keycode key) const;
261 bool isControllerButtonPressed(int device, ControllerButton button) const;
262 bool isKeyLabelPressed(const char * label) const;
263 bool isMouseButtonPressed(MouseButton button) const;
264 std::optional<Vector2> getMousePosition() const;
265
266 // controllers //
267 float getControllerAxis(int device, ControllerAxis axis) const;
268 std::string getControllerGUID(int device) const;
269 std::string getControllerName(int device) const;
270
271 std::vector<int> getConnectedControllers();
272 void startControllerVibration(int device, float weakMagnitude, float strongMagnitude, int durationMs = 0) const;
273 //void vibrateHandheld(int durationMs = 500, float amplitude = -1.0f); // no mobile support, yet :)
274
275 // input getting methods //
276 Vector2 getVector(const std::string& minX, const std::string& maxX, const std::string& minY, const std::string& maxY, float deadzone = -1.0f) const;
277 float getAxis(const std::string& minAction, const std::string& maxAction) const;
278 bool isActionJustPressed(const std::string& name) const;
279 bool isActionJustReleased(const std::string& name) const;
280 bool isActionPressed(const std::string& name) const;
281
282 bool shouldQuit = false;
283private:
284 std::vector<std::unique_ptr<InputEvent>> inputs;
285 int sdlKeyNum = 0;
286 const bool * sdlKeyArray = SDL_GetKeyboardState(&sdlKeyNum);
287
288 std::unordered_map<std::string, float> actionStrength;
289 std::unordered_map<std::string, float> prevActionStrength;
290 std::unordered_map<std::string, InputRegistryAction>* actionsArrayPointer = nullptr;
291 std::unordered_set<std::string> heldActions;
292
293 // sdl controller id -> sequential controller id (calamity controller id)
294 std::map<int, int> controllerMap;
295 std::map<int, int> reversedControllerMap; // its stupid, but it works, so its not stupid
296};
Definition input.hpp:78
float getStrength() const
Definition input.hpp:87
bool pressed
Definition input.hpp:82
bool isPressed() const
Definition input.hpp:85
std::string action
Definition input.hpp:80
float strength
Definition input.hpp:83
bool isReleased() const
Definition input.hpp:86
int eventIndex
Definition input.hpp:81
Definition input.hpp:155
bool pressed
Definition input.hpp:161
bool operator==(const InputEvent &other) const
Definition input.cpp:438
bool isPressed() const
Definition input.hpp:165
bool operator<=(const InputEvent &other) const
Definition input.cpp:486
ControllerButton button
Definition input.hpp:160
float pressure
Definition input.hpp:162
bool isReleased() const
Definition input.hpp:166
int device
Definition input.hpp:163
float getStrength() const
Definition input.hpp:167
Definition input.hpp:179
ControllerAxis axis
Definition input.hpp:186
float getStrength() const
Definition input.hpp:188
bool operator==(const InputEvent &other) const
Definition input.cpp:454
float motion
Definition input.hpp:185
int device
Definition input.hpp:184
bool operator<=(const InputEvent &other) const
Definition input.cpp:502
Definition input.hpp:170
int device
Definition input.hpp:175
bool connected
Definition input.hpp:176
bool operator==(const InputEvent &other) const
Definition input.cpp:446
bool operator<=(const InputEvent &other) const
Definition input.cpp:494
Definition input.hpp:104
Keycode scancode
Definition input.hpp:110
bool operator==(const InputEvent &other) const
Definition input.cpp:414
bool echo
Definition input.hpp:109
bool operator<=(const InputEvent &other) const
Definition input.cpp:462
bool isReleased() const
Definition input.hpp:116
Keycode keycode
Definition input.hpp:111
float getStrength() const
Definition input.hpp:117
bool pressed
Definition input.hpp:113
const char * keyLabel
Definition input.hpp:112
bool isPressed() const
Definition input.hpp:115
Definition input.hpp:129
float getStrength() const
Definition input.hpp:141
MouseButton button
Definition input.hpp:134
bool isPressed() const
Definition input.hpp:139
bool doubleClick
Definition input.hpp:135
Vector2 factor
Definition input.hpp:136
bool pressed
Definition input.hpp:137
bool operator==(const InputEvent &other) const
Definition input.cpp:422
bool operator<=(const InputEvent &other) const
Definition input.cpp:470
bool isReleased() const
Definition input.hpp:140
Definition input.hpp:144
Vector2 position
Definition input.hpp:152
bool operator<=(const InputEvent &other) const
Definition input.cpp:478
bool operator==(const InputEvent &other) const
Definition input.cpp:430
Vector2 relative
Definition input.hpp:151
Definition input.hpp:120
Vector2 relative
Definition input.hpp:123
Vector2 position
Definition input.hpp:122
Definition input.hpp:90
bool metaPressed
Definition input.hpp:95
std::vector< bool > getModifiersMask() const
bool isCommandOrControlPressed() const
bool ctrlPressed
Definition input.hpp:94
bool altPressed
Definition input.hpp:92
bool shiftPressed
Definition input.hpp:96
bool commandOrControlAutoremap
Definition input.hpp:93
Definition input.hpp:62
bool isAction(const std::string &action) const
Definition input.cpp:512
virtual bool isReleased() const
Definition input.hpp:74
virtual float getStrength() const
Definition input.hpp:75
virtual bool operator<=(const InputEvent &other) const
Definition input.hpp:66
bool isActionPressed(const std::string &action) const
Definition input.cpp:517
bool isActionReleased(const std::string &action) const
Definition input.cpp:522
virtual bool operator==(const InputEvent &other) const
Definition input.hpp:65
virtual ~InputEvent()=default
virtual bool isPressed() const
Definition input.hpp:73
Definition input.hpp:227
int actionAddEvent(const std::string &name, std::unique_ptr< InputEvent > event)
Definition input.cpp:354
float actionGetDeadzone(const std::string &action) const
Definition input.cpp:372
void removeAction(const std::string &action)
Definition input.cpp:342
bool eventIsAction(const InputEvent *event, const std::string &name, bool identityCheck=false)
Definition input.cpp:398
void actionSetDeadzone(const std::string &action, float deadzone)
Definition input.cpp:377
std::vector< InputEvent > actionGetEvents(std::string action)
std::vector< std::string > getActions()
Definition input.cpp:382
bool hasAction(const std::string &action) const
Definition input.cpp:347
void actionRemoveEvent(const std::string &action, int index)
Definition input.cpp:360
void addAction(const std::string &action, float deadzone=0.1f)
Definition input.cpp:337
std::unordered_map< std::string, InputRegistryAction > * getActionsArray()
Definition input.cpp:392
void actionRemoveEvents(const std::string &action)
Definition input.cpp:366
Definition input.hpp:256
float getControllerAxis(int device, ControllerAxis axis) const
Definition input.cpp:294
bool shouldQuit
Definition input.hpp:282
std::string getControllerName(int device) const
Definition input.cpp:313
void startControllerVibration(int device, float weakMagnitude, float strongMagnitude, int durationMs=0) const
Definition input.cpp:330
float getAxis(const std::string &minAction, const std::string &maxAction) const
Definition input.cpp:546
void update(float deltaTime)
Definition input.cpp:18
bool isControllerButtonPressed(int device, ControllerButton button) const
Definition input.cpp:268
bool isActionJustReleased(const std::string &name) const
Definition input.cpp:539
std::optional< Vector2 > getMousePosition() const
Definition input.cpp:273
bool isKeyLabelPressed(const char *label) const
Definition input.cpp:256
bool isMouseButtonPressed(MouseButton button) const
Definition input.cpp:262
Vector2 getVector(const std::string &minX, const std::string &maxX, const std::string &minY, const std::string &maxY, float deadzone=-1.0f) const
Definition input.cpp:551
bool isActionJustPressed(const std::string &name) const
Definition input.cpp:532
std::vector< int > getConnectedControllers()
Definition input.cpp:320
bool isActionPressed(const std::string &name) const
Definition input.cpp:527
bool isKeyPressed(Keycode key) const
Definition input.cpp:251
std::string getControllerGUID(int device) const
Definition input.cpp:304
ControllerAxis
Definition input.hpp:35
ControllerButton
Definition input.hpp:9
MouseButton
Definition input.hpp:46
Keycode
Definition keycode.hpp:5
Definition input.hpp:195
std::vector< std::unique_ptr< InputEvent > > events
Definition input.hpp:197
std::string name
Definition input.hpp:196
float deadzone
Definition input.hpp:198
Definition definitions.hpp:77