diff --git a/imgui.ini b/imgui.ini index d0ea262..443cf48 100644 --- a/imgui.ini +++ b/imgui.ini @@ -4,5 +4,5 @@ Size=400,400 [Window][Control] Pos=50,64 -Size=271,202 +Size=393,284 diff --git a/src/camera.cpp b/src/camera.cpp index d2078ae..1858b02 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -11,8 +11,12 @@ Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data) { f32 cos_elevation = glm::cos(elevation_radians); camera->view_direction = glm::normalize(Vector3(sin_azimuth * cos_elevation, sin_elevation, -cos_azimuth * cos_elevation)); + camera->right_direction = glm::normalize(glm::cross(camera->view_direction, camera->world_up_vector)); + camera->up_direction = glm::normalize(glm::cross(camera->right_direction, camera->view_direction)); - Matrix4 look_at = glm::lookAt(camera->world_position, camera->world_position + camera->view_direction, camera->world_up_vector); + render_data->camera_world_position += render_data->move_forward * render_data->tick_diff * camera->view_direction + render_data->move_right * render_data->tick_diff * camera->right_direction + render_data->move_up * render_data->tick_diff * camera->up_direction; + + Matrix4 look_at = glm::lookAt(render_data->camera_world_position, render_data->camera_world_position + camera->view_direction, camera->world_up_vector); return look_at; } diff --git a/src/camera.h b/src/camera.h index 96d1bfe..6a80127 100644 --- a/src/camera.h +++ b/src/camera.h @@ -8,6 +8,8 @@ struct Camera { Vector3 world_position = Vector3(0.5f, 0.25f, 1.0f); Vector3 view_direction = Vector3(0.0f, 0.0f, 0.0f); Vector3 world_up_vector = Vector3(0.0f, 1.0f, 0.0f); + Vector3 right_direction = Vector3(0.0f, 0.0f, 0.0f); + Vector3 up_direction = Vector3(0.0f, 0.0f, 0.0f); }; Matrix4 get_camera_view_matrix(Camera *camera, Render_Data *render_data); diff --git a/src/render_data.h b/src/render_data.h index c9bbf89..2c8ef21 100644 --- a/src/render_data.h +++ b/src/render_data.h @@ -27,4 +27,11 @@ struct Render_Data { f32 view_azimuth = 320.0f; f32 view_elevation = -15.0f; + + s32 move_forward = 0; + s32 move_right = 0; + s32 move_up = 0; + f32 tick_diff = 0.0f; + + Vector3 camera_world_position = Vector3(0.5f, 0.25f, 1.0f); }; diff --git a/src/renderer.cpp b/src/renderer.cpp index c8dcd74..db43498 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -91,10 +91,13 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height) { } void draw_renderer(Renderer *renderer) { - // FPS time + // @Todo why do we have two glfwGetTime() functions being called and setting to things that are relatively close in purpose? static f32 previous_frame_start_time = 0.0; f32 frame_start_time = glfwGetTime(); + f64 tick_time = glfwGetTime(); + renderer->render_data.tick_diff = tick_time - renderer->last_tick_time; + while(renderer->render_data.width == 0 || renderer->render_data.height == 0) { glfwGetFramebufferSize(renderer->render_data.glfw_window, &renderer->render_data.width, &renderer->render_data.height); glfwWaitEvents(); @@ -136,6 +139,9 @@ void draw_renderer(Renderer *renderer) { // Timer start_timer(&renderer->timer); + + handle_movement_keys(renderer); + create_user_interface_frame(&renderer->user_interface, &renderer->render_data); renderer->render_data.user_interface_generate_time = stop_timer(&renderer->timer); @@ -144,6 +150,7 @@ void draw_renderer(Renderer *renderer) { // FPS time renderer->render_data.frame_time = frame_start_time - previous_frame_start_time; previous_frame_start_time = frame_start_time; + renderer->last_tick_time = tick_time; } void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) { @@ -166,6 +173,35 @@ void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s3 } } +void handle_movement_keys(Renderer *renderer) { + renderer->render_data.move_forward = 0; + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_W) == GLFW_PRESS) { + renderer->render_data.move_forward += 1; + } + + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_S) == GLFW_PRESS) { + renderer->render_data.move_forward -= 1; + } + + renderer->render_data.move_right = 0; + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_D) == GLFW_PRESS) { + renderer->render_data.move_right += 1; + } + + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_A) == GLFW_PRESS) { + renderer->render_data.move_right -= 1; + } + + renderer->render_data.move_up = 0; + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_E) == GLFW_PRESS) { + renderer->render_data.move_up += 1; + } + + if (glfwGetKey(renderer->render_data.glfw_window, GLFW_KEY_Q) == GLFW_PRESS) { + renderer->render_data.move_up -= 1; + } +} + void handle_mouse_button_events(Renderer *renderer, s32 button, s32 action, s32 mods) { ImGuiIO& io = ImGui::GetIO(); if (button >= 0 && button < ImGuiMouseButton_COUNT) { @@ -228,4 +264,3 @@ void handle_mouse_position_events(Renderer *renderer, f64 x_pos, f64 y_pos) { renderer->mouse_y_position = static_cast(y_pos); } - diff --git a/src/renderer.h b/src/renderer.h index b4f1784..db07e62 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -31,6 +31,7 @@ struct Renderer { s32 mouse_x_position = 0; s32 mouse_y_position = 0; Timer timer; + f64 last_tick_time = 0.0; }; @@ -42,5 +43,6 @@ void cleanup_renderer(Renderer *renderer); // Event handling void handle_key_events(Renderer *renderer, s32 key, s32 scancode, s32 action, s32 mods); +void handle_movement_keys(Renderer *renderer); 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/user_interface.cpp b/src/user_interface.cpp index 800ab3d..9cc61ca 100644 --- a/src/user_interface.cpp +++ b/src/user_interface.cpp @@ -78,6 +78,17 @@ void create_user_interface_frame(User_Interface *user_interface, Render_Data *re ImGui::SameLine(); ImGui::SliderInt("##FOV", &render_data->field_of_view, 40, 150); + // Camera information + ImGui::Text("View Azimuth:"); + ImGui::SameLine(); + ImGui::Text("%s", std::to_string(render_data->view_azimuth).c_str()); + ImGui::Text("View Elevation:"); + ImGui::Text("%s", std::to_string(render_data->view_elevation).c_str()); + ImGui::Separator(); + ImGui::Text("Camera Position:"); + ImGui::SameLine(); + ImGui::Text("%f, %f, %f", render_data->camera_world_position.x, render_data->camera_world_position.y, render_data->camera_world_position.z); + ImGui::End(); }