From fc45db4653259a7aae3dd40e6434b3b906ea4eae Mon Sep 17 00:00:00 2001 From: Nathan Chapman Date: Sun, 13 Jul 2025 21:09:06 -0600 Subject: [PATCH] Add base mouse capturing --- src/renderer.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ src/renderer.h | 8 ++++++ src/window.cpp | 43 --------------------------------- src/window.h | 2 -- 4 files changed, 71 insertions(+), 45 deletions(-) diff --git a/src/renderer.cpp b/src/renderer.cpp index dfff7d4..f32695a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1,5 +1,6 @@ #include "renderer.h" #include "logger.h" +#include bool init_renderer(Renderer *renderer, u32 width, u32 height) { @@ -169,3 +170,65 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3 } } +void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) { + ImGuiIO& io = ImGui::GetIO(); + io.AddMousePosEvent((f32)x_pos, (f32)y_pos); + + if (io.WantCaptureMouse) { + return; + } + + s32 mouse_move_rel_x = static_cast(x_pos) - renderer->mouse_x_position; + s32 mouse_move_rel_y = static_cast(y_pos) - renderer->mouse_y_position; + + if (renderer->mouse_lock) { + renderer->render_data.view_azimuth += mouse_move_rel_x / 10.0; + + if (renderer->render_data.view_azimuth < 0.0) { + renderer->render_data.view_azimuth += 360.0; + } + + if (renderer->render_data.view_azimuth >= 360.0) { + renderer->render_data.view_azimuth -= 360.0; + } + + renderer->render_data.view_elevation -= mouse_move_rel_y / 10.0; + + if (renderer->render_data.view_elevation > 89.0) { + renderer->render_data.view_elevation = 89.0; + } + + if (renderer->render_data.view_elevation < -89.0) { + renderer->render_data.view_elevation = -89.0; + } + } + + renderer->mouse_x_position = static_cast(x_pos); + renderer->mouse_y_position = static_cast(y_pos); +} + +void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods) { + ImGuiIO& io = ImGui::GetIO(); + if (button >= 0 && button < ImGuiMouseButton_COUNT) { + io.AddMouseButtonEvent(button, action == GLFW_PRESS); + } + + if (io.WantCaptureMouse) { + return; + } + + if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) { + renderer->mouse_lock = !renderer->mouse_lock; + + if (renderer->mouse_lock) { + glfwSetInputMode(renderer->render_data.glfw_window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + + if (glfwRawMouseMotionSupported()) { + glfwSetInputMode(renderer->render_data.glfw_window, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE); + } + } else { + glfwSetInputMode(renderer->render_data.glfw_window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + } + } +} + diff --git a/src/renderer.h b/src/renderer.h index 5c79877..b4f1784 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -26,6 +26,10 @@ struct Renderer { Matrix4 projection_matrix = Matrix4(1.0f); User_Interface user_interface; Render_Data render_data; + Camera camera; + bool mouse_lock = false; + s32 mouse_x_position = 0; + s32 mouse_y_position = 0; Timer timer; }; @@ -35,4 +39,8 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height); void draw_renderer(Renderer *renderer); void upload_renderer_data(Renderer *renderer, Mesh *vertex_data); void cleanup_renderer(Renderer *renderer); + +// Event handling void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s32 mods); +void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos); +void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods); diff --git a/src/window.cpp b/src/window.cpp index 994a84d..7b49e06 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -83,49 +83,6 @@ void cleanup(Window *window) { glfwTerminate(); } -void handle_mouse_position_events(GLFWwindow *gl_window, f64 x_pos, f64 y_pos) { - Window *window = static_cast(glfwGetWindowUserPointer(gl_window)); - log(1, "%s: Mouse is at position %lf/%lf\n", __FUNCTION__, x_pos, y_pos); -} - -void handle_mouse_button_events(GLFWwindow *gl_window, s32 button, s32 action, s32 mods) { - Window *window = static_cast(glfwGetWindowUserPointer(gl_window)); - - string action_name; - switch(action) { - case GLFW_PRESS: - action_name = "pressed"; - break; - case GLFW_RELEASE: - action_name = "released"; - break; - case GLFW_REPEAT: - action_name = "repeated"; - break; - default: - action_name = "invalid"; - break; - } - - string mouse_button_name; - switch(button) { - case GLFW_MOUSE_BUTTON_LEFT: - mouse_button_name = "left"; - break; - case GLFW_MOUSE_BUTTON_RIGHT: - mouse_button_name = "right"; - break; - case GLFW_MOUSE_BUTTON_MIDDLE: - mouse_button_name = "middle"; - break; - default: - mouse_button_name = "other"; - break; - } - - log(1, "%s: %s mouse button (%i) %s\n", __FUNCTION__, mouse_button_name.c_str(), button, action_name.c_str()); -} - void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height) { Window *window = static_cast(glfwGetWindowUserPointer(gl_window)); diff --git a/src/window.h b/src/window.h index 5089c51..df0ca28 100644 --- a/src/window.h +++ b/src/window.h @@ -13,7 +13,5 @@ bool init_window(Window *window, u32 width, u32 height, string title); void main_loop(Window *window); void cleanup(Window *window); void handle_close(GLFWwindow *gl_window); -void handle_mouse_position_events(GLFWwindow *gl_window, f64 x_pos, f64 y_pos); -void handle_mouse_button_events(GLFWwindow *gl_window, s32 button, s32 action, s32 mods); void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height);