2019-03-11 11:11:39 +08:00
// ImGui
2019-03-11 12:12:31 +08:00
# include "imgui.h"
2019-03-11 11:11:39 +08:00
# 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 ;
}