diff --git a/include/vkcv/Window.hpp b/include/vkcv/Window.hpp index d2b5854bce056bc50f8c08c55e6bcdd771bfc13b..7dc6c1b7dc8fef4d5de7de5b0a9976bf714e6ac2 100644 --- a/include/vkcv/Window.hpp +++ b/include/vkcv/Window.hpp @@ -74,13 +74,6 @@ namespace vkcv { */ static void onCharEvent(GLFWwindow *callbackWindow, unsigned int c); - /** - * @brief A callback function for handling gamepad re-connection. - * @param gamepadIndex The gamepad index. - * @param gamepadEvent The gamepad connection event. - */ - static void onGamepadConnection(int gamepadIndex, int gamepadEvent); - /** * @brief A callback function for gamepad input events. * @param gamepadIndex The gamepad index. diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp index d539994dc0071dd52764477a86ff202955c1b8f3..0117cce45bac9a9bd06306c6eb5e3b1c0cc15869 100644 --- a/modules/camera/src/vkcv/camera/CameraManager.cpp +++ b/modules/camera/src/vkcv/camera/CameraManager.cpp @@ -84,7 +84,6 @@ namespace vkcv::camera { } } - // todo: fix event catch speed void CameraManager::gamepadCallback(int gamepadIndex) { // handle camera switching GLFWgamepadstate gamepadState; diff --git a/src/vkcv/Window.cpp b/src/vkcv/Window.cpp index 53761e12caa234a6c465d640cc178e5ac36134cd..807c959a89962dd8c1ad5086e50c84f36f0d5028 100644 --- a/src/vkcv/Window.cpp +++ b/src/vkcv/Window.cpp @@ -28,9 +28,6 @@ namespace vkcv { glfwSetKeyCallback(m_window, Window::onKeyEvent); glfwSetScrollCallback(m_window, Window::onMouseScrollEvent); glfwSetCharCallback(m_window, Window::onCharEvent); - - glfwSetJoystickCallback(Window::onGamepadConnection); - glfwSetJoystickUserPointer(GLFW_JOYSTICK_1, this); } Window::~Window() { @@ -60,8 +57,7 @@ namespace vkcv { } void Window::pollEvents() { - onGamepadEvent(GLFW_JOYSTICK_1); - + for (auto glfwWindow : s_Windows) { auto window = static_cast<Window *>(glfwGetWindowUserPointer(glfwWindow)); @@ -70,9 +66,11 @@ namespace vkcv { window->e_resize.unlock(); window->e_key.unlock(); window->e_mouseScroll.unlock(); + window->e_gamepad.unlock(); } glfwPollEvents(); + onGamepadEvent(GLFW_JOYSTICK_1); for (auto glfwWindow : s_Windows) { auto window = static_cast<Window *>(glfwGetWindowUserPointer(glfwWindow)); @@ -82,6 +80,7 @@ namespace vkcv { window->e_resize.lock(); window->e_key.lock(); window->e_mouseScroll.lock(); + window->e_gamepad.lock(); } } @@ -133,20 +132,14 @@ namespace vkcv { } } - void Window::onGamepadConnection(int gamepadIndex, int gamepadEvent) { - if (gamepadEvent == GLFW_CONNECTED) { - auto window = static_cast<Window *>(glfwGetWindowUserPointer(s_Windows[0])); // todo check for correct window - - if (window != nullptr) { - glfwSetJoystickUserPointer(gamepadIndex, window); - } - } - } - void Window::onGamepadEvent(int gamepadIndex) { - auto window = static_cast<Window *>(glfwGetJoystickUserPointer(gamepadIndex)); + int activeWindowIndex = std::find_if(s_Windows.begin(), + s_Windows.end(), + [](GLFWwindow* window){return glfwGetWindowAttrib(window, GLFW_FOCUSED);}) + - s_Windows.begin(); + auto window = static_cast<Window *>(glfwGetWindowUserPointer(s_Windows[activeWindowIndex])); - if ( window != nullptr && glfwJoystickPresent(gamepadIndex)) { + if (window != nullptr && glfwJoystickPresent(gamepadIndex)) { window->e_gamepad(gamepadIndex); } }