#include "player-input.hpp" #include "window.hpp" #include "game-settings.hpp" GLFWcursorenterfun prevCursorEnterCallback; GLFWcursorposfun prevCursorPosCallback; GLFWkeyfun prevKeyCallback; GLFWmousebuttonfun prevMouseButtonCallback; GLFWscrollfun prevScrollCallback; GLFWwindowfocusfun prevWindowFocusCallback; TypeSafeInt_B(InputEventHash); TypeSafeInt_B(InputEventType); TypeSafeInt_B(InputCursorEntered); TypeSafeInt_B(InputKeyboardKeyAction); TypeSafeInt_B(InputMouseButtonAction); TypeSafeInt_B(InputWindowFocused); DynArray UnhandledPkeInputEvents{0, nullptr}; void PkeInput_Tick() { } void CursorEnterCallback(GLFWwindow *window, int entered) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_CURSOR_ENTER; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = InputCursorEntered{static_cast(entered)}; ev.keyboardKeyAction = PKE_INPUT_KEYBOARD_KEY_ACTION_UNSET; ev.mouseButtonAction = PKE_INPUT_MOUSE_BUTTON_ACTION_UNSET; ev.windowFocused = PKE_INPUT_WINDOW_FOCUSED_UNSET; ev.x = 0; ev.y = 0; ev.button = 0; ev.scanCode = 0; ev.mods = 0; if (prevCursorEnterCallback) { prevCursorEnterCallback(window, entered); } } void CursorPosCallback(GLFWwindow *window, double xPos, double yPos) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_CURSOR_POS; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = PKE_INPUT_CURSOR_ENTERED_UNSET; ev.keyboardKeyAction = PKE_INPUT_KEYBOARD_KEY_ACTION_UNSET; ev.mouseButtonAction = PKE_INPUT_MOUSE_BUTTON_ACTION_UNSET; ev.windowFocused = PKE_INPUT_WINDOW_FOCUSED_UNSET; ev.x = xPos; ev.y = yPos; ev.button = 0; ev.scanCode = 0; ev.mods = 0; if (prevCursorPosCallback) { prevCursorPosCallback(window, xPos, yPos); } } void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_KEY; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = PKE_INPUT_CURSOR_ENTERED_UNSET; ev.keyboardKeyAction = InputKeyboardKeyAction{static_cast(action)}; ev.mouseButtonAction = PKE_INPUT_MOUSE_BUTTON_ACTION_UNSET; ev.windowFocused = PKE_INPUT_WINDOW_FOCUSED_UNSET; ev.x = 0; ev.y = 0; ev.button = key; ev.scanCode = scancode; ev.mods = mods; if (prevKeyCallback) { prevKeyCallback(window, key, scancode, action, mods); } } void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_MOUSE_BUTTON; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = PKE_INPUT_CURSOR_ENTERED_UNSET; ev.keyboardKeyAction = PKE_INPUT_KEYBOARD_KEY_ACTION_UNSET; ev.mouseButtonAction = InputMouseButtonAction{static_cast(action)}; ev.windowFocused = PKE_INPUT_WINDOW_FOCUSED_UNSET; ev.x = 0; ev.y = 0; ev.button = button; ev.scanCode = 0; ev.mods = mods; if (prevMouseButtonCallback) { prevMouseButtonCallback(window, button, action, mods); } } void ScrollCallback(GLFWwindow *window, double xOffset, double yOffset) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_SCROLL; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = PKE_INPUT_CURSOR_ENTERED_UNSET; ev.keyboardKeyAction = PKE_INPUT_KEYBOARD_KEY_ACTION_UNSET; ev.mouseButtonAction = PKE_INPUT_MOUSE_BUTTON_ACTION_UNSET; ev.windowFocused = PKE_INPUT_WINDOW_FOCUSED_UNSET; ev.x = xOffset; ev.y = yOffset; ev.button = 0; ev.scanCode = 0; ev.mods = 0; if (prevScrollCallback) { prevScrollCallback(window, xOffset, yOffset); } } void WindowFocusCallback(GLFWwindow *window, int focused) { auto &ev = UnhandledPkeInputEvents.Push(); ev.type = PKE_INPUT_EVENT_TYPE_WINDOW_FOCUS; ev.timePoint = pkeSettings.steadyClock.now(); ev.cursorEntered = PKE_INPUT_CURSOR_ENTERED_UNSET; ev.keyboardKeyAction = PKE_INPUT_KEYBOARD_KEY_ACTION_UNSET; ev.mouseButtonAction = PKE_INPUT_MOUSE_BUTTON_ACTION_UNSET; ev.windowFocused = InputWindowFocused{static_cast(focused)}; ev.x = 0; ev.y = 0; ev.button = 0; ev.scanCode = 0; ev.mods = 0; if (prevWindowFocusCallback) { prevWindowFocusCallback(window, focused); } } void PkeInput_Init() { prevCursorEnterCallback = glfwSetCursorEnterCallback(window, CursorEnterCallback); prevCursorPosCallback = glfwSetCursorPosCallback(window, CursorPosCallback); prevKeyCallback = glfwSetKeyCallback(window, KeyCallback); prevMouseButtonCallback = glfwSetMouseButtonCallback(window, MouseButtonCallback); prevScrollCallback = glfwSetScrollCallback(window, ScrollCallback); prevWindowFocusCallback = glfwSetWindowFocusCallback(window, WindowFocusCallback); } void PkeInput_Teardown() { UnhandledPkeInputEvents.~DynArray(); if (prevWindowFocusCallback) { glfwSetWindowFocusCallback(window, prevWindowFocusCallback); } if (prevScrollCallback) { glfwSetScrollCallback(window, prevScrollCallback); } if (prevMouseButtonCallback) { glfwSetMouseButtonCallback(window, prevMouseButtonCallback); } if (prevKeyCallback) { glfwSetKeyCallback(window, prevKeyCallback); } if (prevCursorPosCallback) { glfwSetCursorPosCallback(window, prevCursorPosCallback); } if (prevCursorEnterCallback) { glfwSetCursorEnterCallback(window, prevCursorEnterCallback); } }