65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <surface/system.hpp>
|
||
|
|
||
|
namespace lt::input {
|
||
|
|
||
|
template<class... Ts>
|
||
|
struct overloads: Ts...
|
||
|
{
|
||
|
using Ts::operator()...;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @note If this system is attached, it will always consume the input events f rom surface.
|
||
|
* Therefore if you want any input detection mechanism, callbacks should be setup with this
|
||
|
* system and not directly with surface.
|
||
|
*/
|
||
|
class System
|
||
|
{
|
||
|
public:
|
||
|
System(lt::surface::System &surface_system)
|
||
|
{
|
||
|
surface_system.add_event_listener([this](auto &&event) {
|
||
|
return handle_event(std::forward<decltype(event)>(event));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
auto handle_event(const lt::surface::System::Event &event) -> bool
|
||
|
{
|
||
|
const auto visitor = overloads {
|
||
|
[this](const lt::surface::KeyPressedEvent &event) {
|
||
|
m_keys[event.get_key()] = true;
|
||
|
return true;
|
||
|
},
|
||
|
|
||
|
[](const lt::surface::KeyRepeatEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::KeyReleasedEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::KeySetCharEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::MouseMovedEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::WheelScrolledEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::ButtonPressedEvent &) { return false; },
|
||
|
|
||
|
[](const lt::surface::ButtonReleasedEvent &) { return false; },
|
||
|
|
||
|
[](const auto &) { return false; },
|
||
|
};
|
||
|
|
||
|
return std::visit(visitor, event);
|
||
|
}
|
||
|
|
||
|
void setup_callbacks(GLFWwindow *handle);
|
||
|
|
||
|
std::array<bool, 512> m_keys {};
|
||
|
};
|
||
|
|
||
|
|
||
|
} // namespace lt::input
|