From 0c8b26360a0d7b91b45d0d9a741623cec6a6018d Mon Sep 17 00:00:00 2001 From: Light Date: Sun, 1 Aug 2021 16:43:59 +0430 Subject: [PATCH] New Events, Fixes - Added SetCharEvent - Added KeyRepeatEVent - Fixed ImGui not picking keys from io.KeyMap because it gets assigned to VK_** keys from windows after ImGui_ImplWin32_Init call, had to re-assign them back to Key::** (glfw key codes)... - Removed UserInterface::OnInput - Maintenance --- Engine/src/Engine/Core/Application.cpp | 11 +++-- Engine/src/Engine/Events/CharEvent.h | 34 ++++++++++++++ Engine/src/Engine/Events/Event.h | 3 +- Engine/src/Engine/Events/KeyboardEvents.h | 23 +++++++++ Engine/src/Engine/Input/Input.cpp | 31 +++++++++--- Engine/src/Engine/Layer/Layer.cpp | 13 +++++ Engine/src/Engine/Layer/Layer.h | 14 ++++++ .../Engine/UserInterface/UserInterface.cpp | 47 +------------------ .../src/Engine/UserInterface/UserInterface.h | 2 - .../GraphicsAPI/DirectX/dxUserInterface.cpp | 26 ++++++++++ .../GraphicsAPI/OpenGL/glUserInterface.cpp | 26 ++++++++++ Engine/src/Platform/OS/Linux/lWindow.cpp | 10 ++++ Engine/src/Platform/OS/Linux/lWindow.h | 2 +- Engine/src/Platform/OS/Windows/wWindow.cpp | 17 ++++++- 14 files changed, 197 insertions(+), 62 deletions(-) create mode 100644 Engine/src/Engine/Events/CharEvent.h diff --git a/Engine/src/Engine/Core/Application.cpp b/Engine/src/Engine/Core/Application.cpp index 6a1115b..c4fd314 100644 --- a/Engine/src/Engine/Core/Application.cpp +++ b/Engine/src/Engine/Core/Application.cpp @@ -110,6 +110,8 @@ namespace Light { void Application::OnEvent(const Event& event) { + LT_ENGINE_TRACE(event.GetInfoLog()); + // window if (event.HasCategory(WindowEventCategory)) { @@ -121,13 +123,14 @@ namespace Light { // input if (event.HasCategory(InputEventCategory)) + { m_Input->OnEvent(event); - /* layers */ - // return if the event is an input event and 'Input' has disabled the game events - if (event.HasCategory(InputEventCategory) && !m_Input->IsReceivingGameEvents()) - return; + if(!m_Input->IsReceivingGameEvents()) // return if the event is an input event and 'Input' has disabled the game events + return; + } + /* layers */ for (auto it = m_LayerStack->rbegin(); it != m_LayerStack->rend(); it++) if ((*it)->OnEvent(event)) return; } diff --git a/Engine/src/Engine/Events/CharEvent.h b/Engine/src/Engine/Events/CharEvent.h new file mode 100644 index 0000000..f9d2197 --- /dev/null +++ b/Engine/src/Engine/Events/CharEvent.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Event.h" + +#include "Base/Base.h" + +#include + +namespace Light { + + class SetCharEvent : public Event + { + private: + const unsigned int m_Character; + + public: + SetCharEvent(unsigned int character) + : m_Character(character) + { + } + + inline int GetCharacter() const { return m_Character; } + + virtual std::string GetInfoLog() const override + { + std::stringstream ss; + ss << "CharSet: " << m_Character; + return ss.str(); + } + EVENT_TYPE(SetChar) + EVENT_CATEGORY(InputEventCategory | KeyboardEventCategory) + }; + +} \ No newline at end of file diff --git a/Engine/src/Engine/Events/Event.h b/Engine/src/Engine/Events/Event.h index 509ff6f..c84a840 100644 --- a/Engine/src/Engine/Events/Event.h +++ b/Engine/src/Engine/Events/Event.h @@ -10,7 +10,8 @@ namespace Light { // input MouseMoved, WheelScrolled, ButtonPressed, ButtonReleased, - KeyPressed, KeyReleased, + KeyPressed, KeyRepeated, KeyReleased, + SetChar, // window WindowMoved, WindowResized, WindowClosed, WindowLostFocus, WindowGainFocus, diff --git a/Engine/src/Engine/Events/KeyboardEvents.h b/Engine/src/Engine/Events/KeyboardEvents.h index 6f5d9d4..9da405e 100644 --- a/Engine/src/Engine/Events/KeyboardEvents.h +++ b/Engine/src/Engine/Events/KeyboardEvents.h @@ -31,6 +31,29 @@ namespace Light { EVENT_CATEGORY(InputEventCategory | KeyboardEventCategory) }; + class KeyRepeatEvent : public Event + { + private: + const int m_Key; + + public: + KeyRepeatEvent(int key) + : m_Key(key) + { + } + + inline int GetKey() const { return m_Key; } + + virtual std::string GetInfoLog() const override + { + std::stringstream ss; + ss << "KeyRepeated: " << m_Key; + return ss.str(); + } + EVENT_TYPE(KeyRepeated) + EVENT_CATEGORY(InputEventCategory | KeyboardEventCategory) + }; + class KeyReleasedEvent : public Event { private: diff --git a/Engine/src/Engine/Input/Input.cpp b/Engine/src/Engine/Input/Input.cpp index 7938650..d94d15e 100644 --- a/Engine/src/Engine/Input/Input.cpp +++ b/Engine/src/Engine/Input/Input.cpp @@ -2,11 +2,14 @@ #include "Input.h" #include "Events/Event.h" +#include "Events/CharEvent.h" #include "Events/MouseEvents.h" #include "Events/KeyboardEvents.h" #include +#include "Input/KeyCodes.h" + namespace Light { Input* Input::s_Context = nullptr; @@ -72,7 +75,7 @@ namespace Light { } if(m_UserInterfaceEvents) - ImGui::GetIO().MousePos = ImVec2(event.GetX(), event.GetY()); + io.MousePos = ImVec2(event.GetX(), event.GetY()); return; } @@ -84,7 +87,7 @@ namespace Light { m_MouseButtons[event.GetButton()] = true; if (m_UserInterfaceEvents) - ImGui::GetIO().MouseDown[event.GetButton()] = true; + io.MouseDown[event.GetButton()] = true; return; } @@ -96,7 +99,7 @@ namespace Light { m_MouseButtons[event.GetButton()] = false; if (m_UserInterfaceEvents) - ImGui::GetIO().MouseDown[event.GetButton()] = false; + io.MouseDown[event.GetButton()] = false; return; } @@ -108,11 +111,11 @@ namespace Light { m_MouseWheelDelta = event.GetOffset(); if (m_UserInterfaceEvents) - ImGui::GetIO().MouseWheel = event.GetOffset(); + io.MouseWheel = event.GetOffset(); return; } - //** MOUSE_EVENTS **// + //** KEYBOARD_EVENTS **// case EventType::KeyPressed: { const KeyPressedEvent& event = (const KeyPressedEvent&)inputEvent; @@ -121,7 +124,11 @@ namespace Light { m_KeyboadKeys[event.GetKey()] = true; if (m_UserInterfaceEvents) - ImGui::GetIO().KeysDown[event.GetKey()] = true; + { + io.KeysDown[event.GetKey()] = true; + //if (event.GetKey() == Key::BackSpace) + // io.AddInputCharacter(Key::BackSpace); + } return; } @@ -133,7 +140,17 @@ namespace Light { m_KeyboadKeys[event.GetKey()] = false; if (m_UserInterfaceEvents) - ImGui::GetIO().KeysDown[event.GetKey()] = false; + io.KeysDown[event.GetKey()] = false; + + return; + } + case EventType::SetChar: + { + if(m_UserInterfaceEvents) + { + const SetCharEvent& event = (const SetCharEvent&)inputEvent; + io.AddInputCharacter(event.GetCharacter()); + } return; } diff --git a/Engine/src/Engine/Layer/Layer.cpp b/Engine/src/Engine/Layer/Layer.cpp index 939d511..146e2c8 100644 --- a/Engine/src/Engine/Layer/Layer.cpp +++ b/Engine/src/Engine/Layer/Layer.cpp @@ -2,6 +2,7 @@ #include "Layer.h" #include "Events/Event.h" +#include "Events/CharEvent.h" #include "Events/KeyboardEvents.h" #include "Events/MouseEvents.h" #include "Events/WindowEvents.h" @@ -18,28 +19,40 @@ namespace Light { switch (event.GetEventType()) { /* mouse */ + // cursor case EventType::MouseMoved: return OnMouseMoved((MouseMovedEvent&)event); + // button case EventType::ButtonPressed: return OnButtonPressed((ButtonPressedEvent&)event); case EventType::ButtonReleased: return OnButtonReleased((ButtonReleasedEvent&)event); + // wheel case EventType::WheelScrolled: return OnWheelScrolled((WheelScrolledEvent&)event); /* keyboard */ + // key case EventType::KeyPressed: return OnKeyPressed((KeyPressedEvent&)event); + case EventType::KeyRepeated: + return OnKeyRepeat((KeyRepeatEvent&)event); case EventType::KeyReleased: return OnKeyReleased((KeyReleasedEvent&)event); + // char + case EventType::SetChar: + return OnSetChar((SetCharEvent&)event); /* window */ + // termination case EventType::WindowClosed: return OnWindowClosed((WindowClosedEvent&)event); + // size/position case EventType::WindowResized: return OnWindowResized((WindowResizedEvent&)event); case EventType::WindowMoved: return OnWindowMoved((WindowMovedEvent&)event); + // focus case EventType::WindowLostFocus: return OnWindowLostFocus((WindowLostFocusEvent&)event); case EventType::WindowGainFocus: diff --git a/Engine/src/Engine/Layer/Layer.h b/Engine/src/Engine/Layer/Layer.h index 0879b21..95c77bb 100644 --- a/Engine/src/Engine/Layer/Layer.h +++ b/Engine/src/Engine/Layer/Layer.h @@ -13,8 +13,12 @@ namespace Light { class WheelScrolledEvent; // keyboard + // key class KeyPressedEvent; + class KeyRepeatEvent; class KeyReleasedEvent; + // char + class SetCharEvent; // window class WindowClosedEvent; @@ -44,19 +48,29 @@ namespace Light { protected: /* mouse */ + // cursor virtual bool OnMouseMoved(const MouseMovedEvent& event) { return false; } + // button virtual bool OnButtonPressed(const ButtonPressedEvent& event) { return false; } virtual bool OnButtonReleased(const ButtonReleasedEvent& event) { return false; } + // wheel virtual bool OnWheelScrolled(const WheelScrolledEvent& event) { return false; } /* keyboard */ + // key virtual bool OnKeyPressed(const KeyPressedEvent& event) { return false; } + virtual bool OnKeyRepeat(const KeyRepeatEvent& event) { return false; } virtual bool OnKeyReleased(const KeyReleasedEvent& event) { return false; } + // char + virtual bool OnSetChar(const SetCharEvent& event) { return false; } /* window */ + // termination virtual bool OnWindowClosed(const WindowClosedEvent& event) { return false; } + // size/position virtual bool OnWindowResized(const WindowResizedEvent& event) { return false; } virtual bool OnWindowMoved(const WindowMovedEvent& event) { return false; } + // focus virtual bool OnWindowLostFocus(const WindowLostFocusEvent& event) { return false; } virtual bool OnWindowGainFocus(const WindowGainFocusEvent& event) { return false; } }; diff --git a/Engine/src/Engine/UserInterface/UserInterface.cpp b/Engine/src/Engine/UserInterface/UserInterface.cpp index aa2ba47..952c987 100644 --- a/Engine/src/Engine/UserInterface/UserInterface.cpp +++ b/Engine/src/Engine/UserInterface/UserInterface.cpp @@ -8,6 +8,7 @@ #endif #include "Events/Event.h" +#include "Events/CharEvent.h" #include "Events/MouseEvents.h" #include "Events/KeyboardEvents.h" @@ -33,50 +34,4 @@ namespace Light { } } - void UserInterface::OnInput(const Event& inputEvent) - { - ImGuiIO& io = ImGui::GetIO(); - switch (inputEvent.GetEventType()) - { - /* mouse events */ - case EventType::MouseMoved: - { - const MouseMovedEvent& event = (const MouseMovedEvent&)inputEvent; - ImGui::GetIO().MousePos = ImVec2(event.GetX(), event.GetY()); - return; - } - case EventType::ButtonPressed: - { - const ButtonPressedEvent& event = (const ButtonPressedEvent&)inputEvent; - ImGui::GetIO().MouseDown[event.GetButton()] = true; - return; - } - case EventType::ButtonReleased: - { - const ButtonReleasedEvent& event = (const ButtonReleasedEvent&)inputEvent; - ImGui::GetIO().MouseDown[event.GetButton()] = false; - return; - } - case EventType::WheelScrolled: - { - const WheelScrolledEvent& event = (const WheelScrolledEvent&)inputEvent; - ImGui::GetIO().MouseWheel = event.GetOffset(); - return; - } - /* keyboard events */ - case EventType::KeyPressed: - { - const KeyPressedEvent& event = (const KeyPressedEvent&)inputEvent; - ImGui::GetIO().MouseDown[event.GetKey()] = true; - return; - } - case EventType::KeyReleased: - { - const KeyReleasedEvent& event = (const KeyReleasedEvent&)inputEvent; - ImGui::GetIO().MouseDown[event.GetKey()] = false; - return; - } - } - } - } \ No newline at end of file diff --git a/Engine/src/Engine/UserInterface/UserInterface.h b/Engine/src/Engine/UserInterface/UserInterface.h index f224eb8..c53175a 100644 --- a/Engine/src/Engine/UserInterface/UserInterface.h +++ b/Engine/src/Engine/UserInterface/UserInterface.h @@ -20,8 +20,6 @@ namespace Light { virtual ~UserInterface() = default; - void OnInput(const Event& inputEvent); - virtual void Begin() = 0; virtual void End() = 0; diff --git a/Engine/src/Platform/GraphicsAPI/DirectX/dxUserInterface.cpp b/Engine/src/Platform/GraphicsAPI/DirectX/dxUserInterface.cpp index b65dd80..632e1e4 100644 --- a/Engine/src/Platform/GraphicsAPI/DirectX/dxUserInterface.cpp +++ b/Engine/src/Platform/GraphicsAPI/DirectX/dxUserInterface.cpp @@ -2,6 +2,8 @@ #include "dxUserInterface.h" #include "dxSharedContext.h" +#include "Input/KeyCodes.h" + #define GLFW_EXPOSE_NATIVE_WIN32 #include #include @@ -40,6 +42,30 @@ namespace Light { // init ImGui_ImplWin32_Init(glfwGetWin32Window(windowHandle)); ImGui_ImplDX11_Init(sharedContext->GetDevice().Get(), sharedContext->GetDeviceContext().Get()); + + // keyboard map + io.KeyMap[ImGuiKey_Tab] = Key::Tab; + io.KeyMap[ImGuiKey_LeftArrow] = Key::LeftArrow; + io.KeyMap[ImGuiKey_RightArrow] = Key::RightArrow; + io.KeyMap[ImGuiKey_UpArrow] = Key::UpArrow; + io.KeyMap[ImGuiKey_DownArrow] = Key::DownArrow; + io.KeyMap[ImGuiKey_PageUp] = Key::PageUp; + io.KeyMap[ImGuiKey_PageDown] = Key::PageDown; + io.KeyMap[ImGuiKey_Home] = Key::Home; + io.KeyMap[ImGuiKey_End] = Key::End; + io.KeyMap[ImGuiKey_Insert] = Key::Insert; + io.KeyMap[ImGuiKey_Delete] = Key::Delete; + io.KeyMap[ImGuiKey_Backspace] = Key::BackSpace; + io.KeyMap[ImGuiKey_Space] = Key::Space; + io.KeyMap[ImGuiKey_Enter] = Key::Enter; + io.KeyMap[ImGuiKey_Escape] = Key::Escape; + io.KeyMap[ImGuiKey_KeyPadEnter] = Key::Enter; + io.KeyMap[ImGuiKey_A] = Key::A; + io.KeyMap[ImGuiKey_C] = Key::C; + io.KeyMap[ImGuiKey_V] = Key::V; + io.KeyMap[ImGuiKey_X] = Key::X; + io.KeyMap[ImGuiKey_Y] = Key::Y; + io.KeyMap[ImGuiKey_Z] = Key::Z; } dxUserInterface::~dxUserInterface() diff --git a/Engine/src/Platform/GraphicsAPI/OpenGL/glUserInterface.cpp b/Engine/src/Platform/GraphicsAPI/OpenGL/glUserInterface.cpp index f62318b..fc58eff 100644 --- a/Engine/src/Platform/GraphicsAPI/OpenGL/glUserInterface.cpp +++ b/Engine/src/Platform/GraphicsAPI/OpenGL/glUserInterface.cpp @@ -2,6 +2,8 @@ #include "ltpch.h" #include "glUserInterface.h" +#include "Input/KeyCodes.h" + #include #include @@ -38,6 +40,30 @@ namespace Light { // init ImGui_ImplGlfw_InitForOpenGL(windowHandle, false); ImGui_ImplOpenGL3_Init(); + + // keyboard map + io.KeyMap[ImGuiKey_Tab] = Key::Tab; + io.KeyMap[ImGuiKey_LeftArrow] = Key::LeftArrow; + io.KeyMap[ImGuiKey_RightArrow] = Key::RightArrow; + io.KeyMap[ImGuiKey_UpArrow] = Key::UpArrow; + io.KeyMap[ImGuiKey_DownArrow] = Key::DownArrow; + io.KeyMap[ImGuiKey_PageUp] = Key::PageUp; + io.KeyMap[ImGuiKey_PageDown] = Key::PageDown; + io.KeyMap[ImGuiKey_Home] = Key::Home; + io.KeyMap[ImGuiKey_End] = Key::End; + io.KeyMap[ImGuiKey_Insert] = Key::Insert; + io.KeyMap[ImGuiKey_Delete] = Key::Delete; + io.KeyMap[ImGuiKey_Backspace] = Key::BackSpace; + io.KeyMap[ImGuiKey_Space] = Key::Space; + io.KeyMap[ImGuiKey_Enter] = Key::Enter; + io.KeyMap[ImGuiKey_Escape] = Key::Escape; + io.KeyMap[ImGuiKey_KeyPadEnter] = Key::Enter; + io.KeyMap[ImGuiKey_A] = Key::A; + io.KeyMap[ImGuiKey_C] = Key::C; + io.KeyMap[ImGuiKey_V] = Key::V; + io.KeyMap[ImGuiKey_X] = Key::X; + io.KeyMap[ImGuiKey_Y] = Key::Y; + io.KeyMap[ImGuiKey_Z] = Key::Z; } glUserInterface::~glUserInterface() diff --git a/Engine/src/Platform/OS/Linux/lWindow.cpp b/Engine/src/Platform/OS/Linux/lWindow.cpp index 472ee47..0f353b3 100644 --- a/Engine/src/Platform/OS/Linux/lWindow.cpp +++ b/Engine/src/Platform/OS/Linux/lWindow.cpp @@ -2,6 +2,7 @@ #include "lWindow.h" #include "Events/Event.h" +#include "Events/CharEvent.h" #include "Events/MouseEvents.h" #include "Events/KeyboardEvents.h" #include "Events/WindowEvents.h" @@ -176,6 +177,15 @@ namespace Light { callback(event); } }); + /* char */ + glfwSetCharCallback(m_Handle, [](GLFWwindow* window, unsigned int character) + { + std::function callback = *(std::function*)glfwGetWindowUserPointer(window); + + SetCharEvent event(character); + callback(event); + }); + //============================== KEYBOARD_EVENTS ==============================// //============================== WINDOW_EVENTS ==============================// diff --git a/Engine/src/Platform/OS/Linux/lWindow.h b/Engine/src/Platform/OS/Linux/lWindow.h index b727f23..c31f972 100644 --- a/Engine/src/Platform/OS/Linux/lWindow.h +++ b/Engine/src/Platform/OS/Linux/lWindow.h @@ -34,7 +34,7 @@ namespace Light { void SetSize(const glm::uvec2& size, bool additive = false) override; void SetVSync(bool vsync, bool toggle = false) override; - void SetVisibility(bool visible, bool toggle = false); + void SetVisibility(bool visible, bool toggle = false) override; //======================================== SETTERS ========================================// private: diff --git a/Engine/src/Platform/OS/Windows/wWindow.cpp b/Engine/src/Platform/OS/Windows/wWindow.cpp index f651b8d..3e54f2c 100644 --- a/Engine/src/Platform/OS/Windows/wWindow.cpp +++ b/Engine/src/Platform/OS/Windows/wWindow.cpp @@ -2,10 +2,12 @@ #include "wWindow.h" #include "Events/Event.h" +#include "Events/CharEvent.h" #include "Events/MouseEvents.h" #include "Events/KeyboardEvents.h" #include "Events/WindowEvents.h" + #include "Graphics/GraphicsContext.h" #include @@ -157,9 +159,22 @@ namespace Light { if (action == GLFW_PRESS) callback(KeyPressedEvent(key)); - else if(action == GLFW_RELEASE) + else if (action == GLFW_RELEASE) callback(KeyReleasedEvent(key)); + else if (action == GLFW_REPEAT) + callback(KeyRepeatEvent(key)); }); + + /* char */ + glfwSetCharCallback(m_Handle, [](GLFWwindow* window, unsigned int character) + { + std::function callback = *(std::function*)glfwGetWindowUserPointer(window); + callback(SetCharEvent(character)); + }); + + // ImGuiIO& io = ImGui::GetIO(); + // io.AddInputCharacter(c); + //============================== KEYBOARD_EVENTS ==============================// //============================== WINDOW_EVENTS ==============================//