diff --git a/src/render_data.h b/src/render_data.h index 1f3cc5e..3cb54a9 100644 --- a/src/render_data.h +++ b/src/render_data.h @@ -20,4 +20,6 @@ struct Render_Data { s32 width = 0; s32 height = 0; s32 triangle_count = 0; + f32 frame_time = 0.0f; + f32 user_interface_generate_time = 0.0f; }; diff --git a/src/renderer.cpp b/src/renderer.cpp index bca22a9..2d7960f 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -73,6 +73,9 @@ bool init_renderer(Renderer *renderer, u32 width, u32 height) { init_user_interface(&renderer->user_interface, &renderer->render_data); + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + return true; } @@ -89,6 +92,10 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height) { } void draw_renderer(Renderer *renderer) { + // FPS time + static f32 previous_frame_start_time = 0.0; + f32 frame_start_time = glfwGetTime(); + 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(); @@ -100,9 +107,6 @@ void draw_renderer(Renderer *renderer) { glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glEnable(GL_CULL_FACE); - glEnable(GL_DEPTH_TEST); - 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); @@ -134,8 +138,17 @@ void draw_renderer(Renderer *renderer) { unbind_frame_buffer(&renderer->frame_buffer); draw_frame_buffer(&renderer->frame_buffer); + + // Timer + start_timer(&renderer->timer); create_user_interface_frame(&renderer->user_interface, &renderer->render_data); + renderer->render_data.user_interface_generate_time = stop_timer(&renderer->timer); + render_user_interface(&renderer->user_interface); + + // FPS time + renderer->render_data.frame_time = frame_start_time - previous_frame_start_time; + previous_frame_start_time = frame_start_time; } void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) { diff --git a/src/renderer.h b/src/renderer.h index 3f8a7f1..0bb839c 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -7,6 +7,7 @@ #include #include "render_data.h" #include "user_interface.h" +#include "timer.h" struct Frame_Buffer { @@ -51,6 +52,7 @@ struct Renderer { Matrix4 projection_matrix = Matrix4(1.0f); User_Interface user_interface; Render_Data render_data; + Timer timer; }; diff --git a/src/timer.cpp b/src/timer.cpp new file mode 100644 index 0000000..a5a8c7d --- /dev/null +++ b/src/timer.cpp @@ -0,0 +1,22 @@ +#include "timer.h" + +void start_timer(Timer *timer) { + if (timer->running) { + return; + } + + timer->running = true; + timer->start_time = std::chrono::steady_clock::now(); +} + +f32 stop_timer(Timer *timer) { + if (!timer->running) { + return 0; + } + + timer->running = false; + auto stop_time = std::chrono::steady_clock::now(); + f32 timer_milliseconds = std::chrono::duration_cast(stop_time - timer->start_time).count() / 1000.0f; + + return timer_milliseconds; +} diff --git a/src/timer.h b/src/timer.h new file mode 100644 index 0000000..33fc52b --- /dev/null +++ b/src/timer.h @@ -0,0 +1,12 @@ +#pragma once + +#include "basic.h" +#include + +struct Timer { + bool running = false; + std::chrono::time_point start_time{}; +}; + +void start_timer(Timer *timer); +f32 stop_timer(Timer *timer); diff --git a/src/user_interface.cpp b/src/user_interface.cpp index a4bdb92..ca77b37 100644 --- a/src/user_interface.cpp +++ b/src/user_interface.cpp @@ -19,6 +19,24 @@ void create_user_interface_frame(User_Interface *user_interface, Render_Data *re ImGuiWindowFlags imgui_window_flags = 0; ImGui::SetNextWindowBgAlpha(0.8f); ImGui::Begin("Control", nullptr, imgui_window_flags); + static f32 new_fps = 0.0f; + if (render_data->frame_time > 0.0) { + new_fps = 1.0f / render_data->frame_time; + } + user_interface->frames_per_second = (user_interface->averaging_alpha * user_interface->frames_per_second) + (1.0f - user_interface->averaging_alpha) * new_fps; + + ImGui::Text("FPS:"); + ImGui::SameLine(); + ImGui::Text(std::to_string(user_interface->frames_per_second).c_str()); + ImGui::Separator(); + + ImGui::Text("UI generation time:"); + ImGui::SameLine(); + ImGui::Text(std::to_string(render_data->user_interface_generate_time).c_str()); + ImGui::SameLine(); + ImGui::Text("ms"); + ImGui::Separator(); + ImGui::Text("Triangles:"); ImGui::SameLine(); ImGui::Text(std::to_string(render_data->triangle_count).c_str()); diff --git a/src/user_interface.h b/src/user_interface.h index 81f29bb..1fdc3aa 100644 --- a/src/user_interface.h +++ b/src/user_interface.h @@ -3,6 +3,8 @@ #include "render_data.h" struct User_Interface { + f32 frames_per_second = 0.0f; + f32 averaging_alpha = 0.96f; }; bool init_user_interface(User_Interface *user_interface, Render_Data *render_data); diff --git a/src/window.cpp b/src/window.cpp index b2cbd73..6245ab2 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -45,8 +45,9 @@ bool init(Window *window, u32 width, u32 height, string title) { glfwSetWindowSizeCallback(window->glfw_window, handle_window_resize_events); glfwSetWindowCloseCallback(window->glfw_window, handle_close); glfwSetKeyCallback(window->glfw_window, handle_key_events); - glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events); - glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events); + // 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); window->model = new Model(); init_model(window->model);