#pragma once #include #include #include #include "glm/vec2.hpp" class Listener; class MouseListener; class Input { friend Listener; friend MouseListener; public: explicit Input(GLFWwindow *window); static Input *instance; static std::map KeyIsDown; static std::map MouseButtonIsDown; glm::vec2 currentCursorPosition {}; private: GLFWwindow *window; std::set listeners; void keyPressed(int key); void keyReleased(int key); void mouseButtonPressed(int button); void mouseButtonReleased(int button); void mouseMoved(const glm::vec2 &newCursorPosition); }; class Listener { public: Listener(); virtual ~Listener(); }; class KeyListener : Listener { }; class MouseListener : public Listener { public: virtual void mouseMoved(const glm::vec2 &delta) {}; virtual void mouseButtonPressed(int button) {}; virtual void mouseButtonReleased(int button) {}; };