#pragma once #include "Core/Event.h" #include "InputTypes.h" #include "InputEvent.h" #include "InputAxis.h" #include #include #include namespace XCEngine { namespace Input { class InputManager { public: static InputManager& Get(); void Initialize(void* platformWindowHandle); void Shutdown(); void Update(float deltaTime); bool IsKeyDown(KeyCode key) const; bool IsKeyUp(KeyCode key) const; bool IsKeyPressed(KeyCode key) const; bool IsKeyReleased(KeyCode key) const; Math::Vector2 GetMousePosition() const; Math::Vector2 GetMouseDelta() const; float GetMouseScrollDelta() const; bool IsMouseButtonDown(MouseButton button) const; bool IsMouseButtonUp(MouseButton button) const; bool IsMouseButtonClicked(MouseButton button) const; bool IsMouseButtonReleased(MouseButton button) const; int GetTouchCount() const; TouchState GetTouch(int index) const; float GetAxis(const Containers::String& axisName) const; float GetAxisRaw(const Containers::String& axisName) const; bool GetButton(const Containers::String& buttonName) const; bool GetButtonDown(const Containers::String& buttonName) const; bool GetButtonUp(const Containers::String& buttonName) const; bool IsAnyKeyDown() const; bool IsAnyKeyPressed() const; void RegisterAxis(const InputAxis& axis); void RegisterButton(const Containers::String& name, KeyCode key); void ClearAxes(); Core::Event& OnKeyEvent() { return m_onKeyEvent; } Core::Event& OnMouseButton() { return m_onMouseButton; } Core::Event& OnMouseMove() { return m_onMouseMove; } Core::Event& OnMouseWheel() { return m_onMouseWheel; } Core::Event& OnTextInput() { return m_onTextInput; } void ProcessKeyDown(KeyCode key, bool repeat, bool alt, bool ctrl, bool shift, bool meta); void ProcessKeyUp(KeyCode key, bool alt, bool ctrl, bool shift, bool meta); void ProcessMouseMove(int x, int y, int deltaX, int deltaY); void ProcessMouseButton(MouseButton button, bool pressed, int x, int y); void ProcessMouseWheel(float delta, int x, int y); void ProcessTextInput(char c); private: InputManager() = default; ~InputManager() = default; size_t GetKeyIndex(KeyCode key) const; size_t GetMouseButtonIndex(MouseButton button) const; void* m_platformWindowHandle = nullptr; bool m_initialized = false; std::vector m_keyDownThisFrame; std::vector m_keyDownLastFrame; std::vector m_keyUpThisFrame; std::vector m_keyDown; Math::Vector2 m_mousePosition; Math::Vector2 m_mouseDelta; float m_mouseScrollDelta = 0.0f; std::vector m_mouseButtonDownThisFrame; std::vector m_mouseButtonDownLastFrame; std::vector m_mouseButtonUpThisFrame; std::vector m_mouseButtonDown; std::vector m_touches; std::unordered_map m_axes; std::unordered_map m_buttons; std::vector m_buttonDownThisFrame; std::vector m_buttonDownLastFrame; Core::Event m_onKeyEvent; Core::Event m_onMouseButton; Core::Event m_onMouseMove; Core::Event m_onMouseWheel; Core::Event m_onTextInput; }; } // namespace Input } // namespace XCEngine