Edit example UI features

This commit is contained in:
2026-09-27 21:14:33 +02:00
parent 850a6f601b
commit b85e784d6f

View File

@@ -12,6 +12,7 @@ using namespace Fan;
struct UserData struct UserData
{ {
Window& window;
Camera& camera; Camera& camera;
float delta_time{}; float delta_time{};
bool mouse_grab{}; bool mouse_grab{};
@@ -22,6 +23,7 @@ struct UserData
float last_mouse_y{}; float last_mouse_y{};
bool first_mouse{true}; bool first_mouse{true};
bool vsync{true};
bool show_debug{}; bool show_debug{};
std::vector<Rc<Scene>> scenes{}; std::vector<Rc<Scene>> scenes{};
@@ -31,8 +33,8 @@ struct UserData
void process_input(Window& window, Camera& camera, UserData& user_data); void process_input(Window& window, Camera& camera, UserData& user_data);
void mouse_callback(double pos_x, double pos_y, void* user_data); void mouse_callback(double pos_x, double pos_y, void* user_data);
void setup_dockspace(); void setup_dockspace();
void draw_panel_window(Camera& camera, UserData& user_data); void draw_panel_window(UserData& user_data);
void draw_viewport_window(FrameBuffer& framebuffer, Window& window, UserData& user_data); void draw_viewport_window(FrameBuffer& framebuffer, UserData& user_data);
std::vector<Vertex> get_cube_vertices(); std::vector<Vertex> get_cube_vertices();
template <typename... Args> template <typename... Args>
@@ -62,7 +64,7 @@ int main()
Camera camera{{5.0f, 5.0f, 5.0f}}; Camera camera{{5.0f, 5.0f, 5.0f}};
camera.look_at({0.0f, 0.0f, 0.0f}); camera.look_at({0.0f, 0.0f, 0.0f});
UserData user_data{camera}; UserData user_data{*window, camera};
window->set_callback_user_data(&user_data); window->set_callback_user_data(&user_data);
window->set_mouse_callback(mouse_callback); window->set_mouse_callback(mouse_callback);
@@ -176,8 +178,8 @@ int main()
// UI Layer // UI Layer
setup_dockspace(); setup_dockspace();
draw_panel_window(camera, user_data); draw_panel_window(user_data);
draw_viewport_window(*framebuffer, *window, user_data); draw_viewport_window(*framebuffer, user_data);
// Scene Rendering Layer // Scene Rendering Layer
const Scene& scene = *user_data.scenes[user_data.selected_scene_index]; const Scene& scene = *user_data.scenes[user_data.selected_scene_index];
@@ -273,7 +275,7 @@ void setup_dockspace()
ImGui::DockSpaceOverViewport(dockspace_id, viewport, ImGuiDockNodeFlags_None); ImGui::DockSpaceOverViewport(dockspace_id, viewport, ImGuiDockNodeFlags_None);
} }
void draw_panel_window(Camera& camera, UserData& user_data) void draw_panel_window(UserData& user_data)
{ {
static auto logo = Texture::create("assets/logo/logo.png"); static auto logo = Texture::create("assets/logo/logo.png");
@@ -286,11 +288,11 @@ void draw_panel_window(Camera& camera, UserData& user_data)
ImGui::Separator(); ImGui::Separator();
ImGui::Text("Press INSERT to toggle camera controls"); ImGui::Text("Press INSERT to toggle camera controls");
ImGui::SliderFloat("Camera X", &camera.position.x, -10.0f, 10.0f);
ImGui::SliderFloat("Camera Y", &camera.position.y, -10.0f, 10.0f);
ImGui::SliderFloat("Camera Z", &camera.position.z, -10.0f, 10.0f);
ImGui::Separator(); ImGui::Separator();
if (ImGui::Checkbox("VSync", &user_data.vsync)) {
user_data.window.set_vsync(user_data.vsync);
}
ImGui::Checkbox("Show Debug Wireframes", &user_data.show_debug); ImGui::Checkbox("Show Debug Wireframes", &user_data.show_debug);
ImGui::Separator(); ImGui::Separator();
@@ -306,7 +308,7 @@ void draw_panel_window(Camera& camera, UserData& user_data)
ImGui::End(); ImGui::End();
} }
void draw_viewport_window(FrameBuffer& framebuffer, Window& window, UserData& user_data) void draw_viewport_window(FrameBuffer& framebuffer, UserData& user_data)
{ {
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{0.0f, 0.0f}); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{0.0f, 0.0f});
ImGui::Begin("Viewport"); ImGui::Begin("Viewport");
@@ -320,10 +322,10 @@ void draw_viewport_window(FrameBuffer& framebuffer, Window& window, UserData& us
} }
// Overlays // Overlays
float fps = window.get_delta_time() > 0.0f ? 1.0f / window.get_delta_time() : 0.0f; float fps = user_data.window.get_delta_time() > 0.0f ? 1.0f / user_data.window.get_delta_time() : 0.0f;
overlay_text(20.0f, 35.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "%s", VERSION_STRING); overlay_text(20.0f, 35.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "%s", VERSION_STRING);
overlay_text(20.0f, 52.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "FPS: %.1f", fps); overlay_text(20.0f, 52.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "FPS: %.1f", fps);
overlay_text(20.0f, 69.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "Frame time: %.2f ms", window.get_delta_time()); overlay_text(20.0f, 69.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "Frame time: %.2f ms", user_data.window.get_delta_time());
if (user_data.mouse_grab) { overlay_text(20.0f, 86.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "%s", "INPUT LOCKED"); } if (user_data.mouse_grab) { overlay_text(20.0f, 86.0f, {0.0f, 1.0f, 0.0f, 1.0f}, "%s", "INPUT LOCKED"); }
ImGui::End(); ImGui::End();