diff --git a/sfw/game_scene.cpp b/sfw/game_scene.cpp index 3a37363..8183648 100644 --- a/sfw/game_scene.cpp +++ b/sfw/game_scene.cpp @@ -12,6 +12,7 @@ #include "render_core/mesh_utils.h" #include "render_immediate/renderer.h" #include "render_gui/gui.h" +#include "render_gui/imgui.h" //#include "render_core/font.h" #include "core/sub_process.h" @@ -298,6 +299,8 @@ void GameScene::render() { r->draw_texture(_render_tex, Rect2(100, 100, render_tex_size.x, render_tex_size.y)); } else if (render_type == 14) { render_gui(); + } else if (render_type == 15) { + render_gui_manual(); } } void GameScene::render_immediate(bool clear_screen) { @@ -424,6 +427,68 @@ void GameScene::render_gui(bool clear_screen) { GUI::render(); } +void GameScene::render_gui_manual(bool clear_screen) { + Renderer *r = Renderer::get_singleton(); + + if (clear_screen) { + r->clear_screen(Color()); + r->camera_2d_projection_set_to_window(); + + r->camera_3d_bind(); + r->camera_3d_projection_set_to_perspective(AppWindow::get_singleton()->get_aspect()); + } + + GUI::new_frame(); + + + ImGuiIO &io = ImGui::GetIO(); + (void)io; + + // Our state + static bool show_demo_window = true; + static bool show_another_window = false; + static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) { + ImGui::ShowDemoWindow(&show_demo_window); + } + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world! This is an another demo!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float *)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + GUI::render(); +} + void GameScene::toggle_thread() { if (_thread) { _thread_running = false; diff --git a/sfw/game_scene.h b/sfw/game_scene.h index bdf0916..450b070 100644 --- a/sfw/game_scene.h +++ b/sfw/game_scene.h @@ -28,7 +28,7 @@ class GameScene : public Scene { public: enum RenderTypes { - RENDER_TYPE_MAX = 15 + RENDER_TYPE_MAX = 16 }; virtual void input_event(const Ref &event); @@ -38,6 +38,7 @@ public: virtual void render_obj(); virtual void render_immediate_3d(bool clear_screen = true); virtual void render_gui(bool clear_screen = true); + virtual void render_gui_manual(bool clear_screen = true); void toggle_thread(); static void test_thread_func(void *d);