Add base mouse capturing

This commit is contained in:
Nathan Chapman 2025-07-13 21:09:06 -06:00
parent f4328b0b6e
commit fc45db4653
4 changed files with 71 additions and 45 deletions

View File

@ -1,5 +1,6 @@
#include "renderer.h" #include "renderer.h"
#include "logger.h" #include "logger.h"
#include <imgui/imgui_impl_glfw.h>
bool init_renderer(Renderer *renderer, u32 width, u32 height) { 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<s32>(x_pos) - renderer->mouse_x_position;
s32 mouse_move_rel_y = static_cast<s32>(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<s32>(x_pos);
renderer->mouse_y_position = static_cast<s32>(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);
}
}
}

View File

@ -26,6 +26,10 @@ struct Renderer {
Matrix4 projection_matrix = Matrix4(1.0f); Matrix4 projection_matrix = Matrix4(1.0f);
User_Interface user_interface; User_Interface user_interface;
Render_Data render_data; Render_Data render_data;
Camera camera;
bool mouse_lock = false;
s32 mouse_x_position = 0;
s32 mouse_y_position = 0;
Timer timer; Timer timer;
}; };
@ -35,4 +39,8 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height);
void draw_renderer(Renderer *renderer); void draw_renderer(Renderer *renderer);
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data); void upload_renderer_data(Renderer *renderer, Mesh *vertex_data);
void cleanup_renderer(Renderer *renderer); void cleanup_renderer(Renderer *renderer);
// Event handling
void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s32 mods); 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);

View File

@ -83,49 +83,6 @@ void cleanup(Window *window) {
glfwTerminate(); glfwTerminate();
} }
void handle_mouse_position_events(GLFWwindow *gl_window, f64 x_pos, f64 y_pos) {
Window *window = static_cast<Window *>(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<Window *>(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) { void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height) {
Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window)); Window *window = static_cast<Window *>(glfwGetWindowUserPointer(gl_window));

View File

@ -13,7 +13,5 @@ bool init_window(Window *window, u32 width, u32 height, string title);
void main_loop(Window *window); void main_loop(Window *window);
void cleanup(Window *window); void cleanup(Window *window);
void handle_close(GLFWwindow *gl_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); void handle_window_resize_events(GLFWwindow *gl_window, s32 width, s32 height);