// ImGui #include "imgui/imgui.h" #include "imgui_impl_win32.h" #include "imgui_impl_dx11.h" #include // easy2d #include "easy2d.h" using namespace easy2d; const int WINDOW_WIDTH = 1280; const int WINDOW_HEIGHT = 800; E2D_DECLARE_SMART_PTR(ImGuiScene); class ImGuiScene : public Scene { bool show_demo_window = true; bool show_another_window = false; Color clear_color = Color(0.45f, 0.55f, 0.6f, 1.f); public: void OnEnter() override { // Setup Dear ImGui context IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); //ImGui::StyleColorsClassic(); // Setup Platform/Renderer bindings ImGui_ImplWin32_Init(Window::Instance().GetHandle()); ImGui_ImplDX11_Init( Renderer::Instance().GetDeviceResources()->GetD3DDevice(), Renderer::Instance().GetDeviceResources()->GetD3DDeviceContext() ); } void OnRender() override { // Start the Dear ImGui frame ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); // 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 created a named window. { static float f = 0.0f; static int counter = 0; ImGui::Begin("Hello, world!"); // 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 / ImGui::GetIO().Framerate, ImGui::GetIO().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(); } // Rendering ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); Renderer::Instance().SetClearColor(clear_color); } void OnExit() override { ImGui_ImplDX11_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); } }; extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND, UINT, WPARAM, LPARAM); class ImGuiApp : public Application { public: ImGuiApp() { Options options; options.title = L"ImGui Demo"; options.width = WINDOW_WIDTH; options.height = WINDOW_HEIGHT; options.clear_color = Color(0.45f, 0.55f, 0.6f, 1.f); Init(options); SetPreMessageProc(ImGui_ImplWin32_WndProcHandler); } void OnStart() override { ImGuiScenePtr scene = new ImGuiScene; EnterScene(scene); } }; int main() { try { ImGuiApp app; app.Run(); } catch (std::exception& e) { ::MessageBoxA(nullptr, e.what(), "An exception has occurred!", MB_ICONERROR | MB_OK); } return 0; }