From cb70f3b32251da325762f9a7169a0dc50400928b Mon Sep 17 00:00:00 2001 From: Nathan Chapman Date: Tue, 15 Jul 2025 19:39:34 -0600 Subject: [PATCH] Implement base camera --- imgui.ini | 4 ++-- src/camera.cpp | 1 + src/camera.h | 1 - src/renderer.cpp | 55 +++++++++++++++++++++++------------------------- src/window.cpp | 12 ++++++++--- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/imgui.ini b/imgui.ini index 7f0a520..d0ea262 100644 --- a/imgui.ini +++ b/imgui.ini @@ -3,6 +3,6 @@ Pos=60,60 Size=400,400 [Window][Control] -Pos=60,60 -Size=213,82 +Pos=50,64 +Size=271,202 diff --git a/src/camera.cpp b/src/camera.cpp index b75eb22..d2078ae 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -1,4 +1,5 @@ #include "camera.h" +#include Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) { f32 azimuth_radians = glm::radians(render_data->view_azimuth); diff --git a/src/camera.h b/src/camera.h index a619cc2..96d1bfe 100644 --- a/src/camera.h +++ b/src/camera.h @@ -2,7 +2,6 @@ #include "basic.h" #include -#include "renderer.h" #include "render_data.h" struct Camera { diff --git a/src/renderer.cpp b/src/renderer.cpp index f32695a..c8dcd74 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -106,10 +106,6 @@ void draw_renderer(Renderer *renderer) { glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - Vector3 camera_position = Vector3(0.4f, 0.3f, 1.0f); - Vector3 camera_look_at_position = Vector3(0.0f, 0.0f, 0.0f); - Vector3 camera_up_vector = Vector3(0.0f, 1.0f, 0.0f); - renderer->projection_matrix = glm::perspective(glm::radians(static_cast(renderer->render_data.field_of_view)), static_cast(renderer->render_data.width) / static_cast(renderer->render_data.height), 0.1f, 10.0f); f32 dt = glfwGetTime(); @@ -123,7 +119,7 @@ void draw_renderer(Renderer *renderer) { model = glm::rotate(Matrix4(1.0f), -dt, Vector3(0.0f, 0.0f, 1.0f)); } - renderer->view_matrix = glm::lookAt(camera_position, camera_look_at_position, camera_up_vector) * model; + renderer->view_matrix = get_camera_view_matrix(&renderer->camera, &renderer->render_data); upload_uniform_buffer_data(&renderer->uniform_buffer, renderer->view_matrix, renderer->projection_matrix); @@ -170,6 +166,31 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3 } } +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); + } + } +} + 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); @@ -207,28 +228,4 @@ void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_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/window.cpp b/src/window.cpp index 7b49e06..6a055cb 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -52,9 +52,15 @@ bool init_window(Window *window, u32 width, u32 height, string title) { handle_key_events(renderer, key, scancode, action, mods); }); - // Have to disable so ImGui will accept mouse events - // glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events); - // glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events); + glfwSetMouseButtonCallback(window->glfw_window, [](GLFWwindow *glfw_window, s32 button, s32 action, s32 mods) { + Renderer* renderer = static_cast(glfwGetWindowUserPointer(glfw_window)); + handle_mouse_button_events(renderer, button, action, mods); + }); + + glfwSetCursorPosCallback(window->glfw_window, [](GLFWwindow *glfw_window, f64 x_pos, f64 y_pos) { + Renderer* renderer = static_cast(glfwGetWindowUserPointer(glfw_window)); + handle_mouse_position_events(renderer, x_pos, y_pos); + }); window->model = new Model(); init_model(window->model);