Magic_Game/project/ImGuiSample/main.cpp

144 lines
3.7 KiB
C++

// ImGui
#include "imgui.h"
#include "imgui_impl_win32.h"
#include "imgui_impl_dx11.h"
#include <tchar.h>
// 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;
}