Brenta Engine 1.2
Loading...
Searching...
No Matches
input.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/window.hpp>
7#include <brenta/input.hpp>
8#include <brenta/logger.hpp>
9
10using namespace brenta;
11
12//
13// Static variables
14//
15
16std::unordered_map<int, std::function<void()>> input::keyboard_callbacks;
17std::unordered_map<std::string, std::function<void(double, double)>>
18 input::mouse_callbacks;
19const std::string input::subsystem_name = "input";
20bool input::initialized = false;
21
22//
23// Subsystem interface
24//
25
26std::expected<void, subsystem::error> input::initialize()
27{
28 if (this->is_initialized()) return {};
29
30 window::set_key_callback(input::key_callback);
31 window::set_mouse_pos_callback(input::mouse_pos_callback);
32
33 input::initialized = true;
34 INFO("{} initialized", input::subsystem_name);
35 return {};
36}
37
38std::expected<void, subsystem::error> input::terminate()
39{
40 if (!this->is_initialized()) return {};
41
42 input::initialized = false;
43 INFO("{}: terminated", input::subsystem_name);
44 return {};
45}
46
47std::string input::name()
48{
49 return input::subsystem_name;
50}
51
53{
54 return input::initialized;
55}
56
57//
58// Member functions
59//
60
61input &input::instance()
62{
63 static input _input;
64 return _input;
65}
66
67void input::add_keyboard_callback(int key, std::function<void()> callback)
68{
69 input::keyboard_callbacks[key] = callback;
70 DEBUG("{}: aded callback for key: {}",
71 input::subsystem_name, std::to_string(key));
72}
73
75{
76 if (input::keyboard_callbacks.find(key) == input::keyboard_callbacks.end())
77 {
78 ERROR("{}: no callback found for key: {}", input::subsystem_name, key);
79 return;
80 }
81
82 input::keyboard_callbacks.erase(key);
83 DEBUG("{}: removed callback for key: {}", input::subsystem_name, key);
84}
85
86void input::key_callback([[maybe_unused]] GLFWwindow *window,
87 [[maybe_unused]] int key,
88 [[maybe_unused]] int scancode, int action,
89 [[maybe_unused]] int mods)
90{
91 if (action == GLFW_PRESS)
92 {
93 if (input::keyboard_callbacks.find(key) != input::keyboard_callbacks.end())
94 {
95 input::keyboard_callbacks.at(key)();
96 }
97 }
98}
99
100void input::add_mouse_pos_callback(types::mouse_callback_name_t callback_name,
101 std::function<void(double, double)> callback)
102{
103 input::mouse_callbacks[callback_name] = callback;
104 DEBUG("{}: added callback for mouse: {}",
105 input::subsystem_name, callback_name);
106}
107
108void input::remove_mouse_pos_callback(types::mouse_callback_name_t callback_name)
109{
110 if (input::mouse_callbacks.find(callback_name)
111 == input::mouse_callbacks.end())
112 {
113 ERROR("{}: no callback found for mouse: {}",
114 input::subsystem_name, callback_name);
115 return;
116 }
117
118 input::mouse_callbacks.erase(callback_name);
119 DEBUG("{}: removed callback for mouse: {}",
120 input::subsystem_name, callback_name);
121}
122
123void input::mouse_pos_callback([[maybe_unused]] GLFWwindow *window,
124 double xpos,
125 double ypos)
126{
127 for (auto &callback : input::mouse_callbacks)
128 {
129 callback.second(xpos, ypos);
130 }
131}
132
133//
134// Builder
135//
136
137subsystem &input::builder::build()
138{
139 return input::instance();
140}
Input subsystem.
Definition input.hpp:35
bool is_initialized() override
Returns true if the subsystem is initialized.
Definition input.cpp:52
std::expected< void, subsystem::error > initialize() override
Initialize the input system.
Definition input.cpp:26
std::string name() override
Returns the name of the sybsystem.
Definition input.cpp:47
static void remove_keyboard_callback(int key)
Remove a keyboard callback.
Definition input.cpp:74
static void remove_mouse_pos_callback(types::mouse_callback_name_t callback_name)
Remove a mouse position callback.
Definition input.cpp:108
static void mouse_pos_callback(GLFWwindow *window, double xpos, double ypos)
Mouse position callback.
Definition input.cpp:123
static void add_mouse_pos_callback(types::mouse_callback_name_t name, std::function< void(double, double)> callback)
Add a mouse position callback.
Definition input.cpp:100
std::expected< void, subsystem::error > terminate() override
Cleans up resources.
Definition input.cpp:38
static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
Keyboard callback.
Definition input.cpp:86
static void add_keyboard_callback(int key, std::function< void()> callback)
Add a keyboard callback.
Definition input.cpp:67
Subsystem interface.
Definition subsystem.hpp:22
Window subsystem.
Definition window.hpp:29