|
@@ -10,8 +10,44 @@
|
|
|
#include <tchar.h>
|
|
|
|
|
|
// Data
|
|
|
+static LPDIRECT3D9 g_pD3D = NULL;
|
|
|
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
|
|
|
-static D3DPRESENT_PARAMETERS g_d3dpp;
|
|
|
+static D3DPRESENT_PARAMETERS g_d3dpp = {};
|
|
|
+
|
|
|
+HRESULT CreateDeviceD3D(HWND hWnd)
|
|
|
+{
|
|
|
+ if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
|
|
|
+ return E_FAIL;
|
|
|
+
|
|
|
+ // Create the D3DDevice
|
|
|
+ ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));
|
|
|
+ g_d3dpp.Windowed = TRUE;
|
|
|
+ g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
|
|
+ g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
|
|
|
+ g_d3dpp.EnableAutoDepthStencil = TRUE;
|
|
|
+ g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
|
|
|
+ g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync
|
|
|
+ //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate
|
|
|
+ if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0)
|
|
|
+ return E_FAIL;
|
|
|
+
|
|
|
+ return S_OK;
|
|
|
+}
|
|
|
+
|
|
|
+void CleanupDeviceD3D()
|
|
|
+{
|
|
|
+ if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
|
|
+ if (g_pD3D) { g_pD3D->Release(); g_pD3D = NULL; }
|
|
|
+}
|
|
|
+
|
|
|
+void ResetDevice()
|
|
|
+{
|
|
|
+ ImGui_ImplDX9_InvalidateDeviceObjects();
|
|
|
+ HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp);
|
|
|
+ if (hr == D3DERR_INVALIDCALL)
|
|
|
+ IM_ASSERT(0);
|
|
|
+ ImGui_ImplDX9_CreateDeviceObjects();
|
|
|
+}
|
|
|
|
|
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
@@ -24,13 +60,9 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
|
case WM_SIZE:
|
|
|
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
|
|
{
|
|
|
- ImGui_ImplDX9_InvalidateDeviceObjects();
|
|
|
- g_d3dpp.BackBufferWidth = LOWORD(lParam);
|
|
|
+ g_d3dpp.BackBufferWidth = LOWORD(lParam);
|
|
|
g_d3dpp.BackBufferHeight = HIWORD(lParam);
|
|
|
- HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp);
|
|
|
- if (hr == D3DERR_INVALIDCALL)
|
|
|
- IM_ASSERT(0);
|
|
|
- ImGui_ImplDX9_CreateDeviceObjects();
|
|
|
+ ResetDevice();
|
|
|
}
|
|
|
return 0;
|
|
|
case WM_SYSCOMMAND:
|
|
@@ -52,28 +84,16 @@ int main(int, char**)
|
|
|
HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX9 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
|
|
|
|
|
// Initialize Direct3D
|
|
|
- LPDIRECT3D9 pD3D;
|
|
|
- if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
|
|
|
+ if (CreateDeviceD3D(hwnd) < 0)
|
|
|
{
|
|
|
+ CleanupDeviceD3D();
|
|
|
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
|
|
- return 0;
|
|
|
+ return 1;
|
|
|
}
|
|
|
- ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));
|
|
|
- g_d3dpp.Windowed = TRUE;
|
|
|
- g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
|
|
- g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
|
|
|
- g_d3dpp.EnableAutoDepthStencil = TRUE;
|
|
|
- g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
|
|
|
- g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync
|
|
|
- //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate
|
|
|
|
|
|
- // Create the D3DDevice
|
|
|
- if (pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0)
|
|
|
- {
|
|
|
- pD3D->Release();
|
|
|
- UnregisterClass(wc.lpszClassName, wc.hInstance);
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ // Show the window
|
|
|
+ ShowWindow(hwnd, SW_SHOWDEFAULT);
|
|
|
+ UpdateWindow(hwnd);
|
|
|
|
|
|
// Setup Dear ImGui context
|
|
|
IMGUI_CHECKVERSION();
|
|
@@ -104,6 +124,7 @@ int main(int, char**)
|
|
|
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
|
|
//IM_ASSERT(font != NULL);
|
|
|
|
|
|
+ // Our state
|
|
|
bool show_demo_window = true;
|
|
|
bool show_another_window = false;
|
|
|
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
|
@@ -111,8 +132,6 @@ int main(int, char**)
|
|
|
// Main loop
|
|
|
MSG msg;
|
|
|
ZeroMemory(&msg, sizeof(msg));
|
|
|
- ShowWindow(hwnd, SW_SHOWDEFAULT);
|
|
|
- UpdateWindow(hwnd);
|
|
|
while (msg.message != WM_QUIT)
|
|
|
{
|
|
|
// Poll and handle messages (inputs, window resize, etc.)
|
|
@@ -186,19 +205,14 @@ int main(int, char**)
|
|
|
|
|
|
// Handle loss of D3D9 device
|
|
|
if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
|
|
|
- {
|
|
|
- ImGui_ImplDX9_InvalidateDeviceObjects();
|
|
|
- g_pd3dDevice->Reset(&g_d3dpp);
|
|
|
- ImGui_ImplDX9_CreateDeviceObjects();
|
|
|
- }
|
|
|
+ ResetDevice();
|
|
|
}
|
|
|
|
|
|
ImGui_ImplDX9_Shutdown();
|
|
|
ImGui_ImplWin32_Shutdown();
|
|
|
ImGui::DestroyContext();
|
|
|
|
|
|
- if (g_pd3dDevice) g_pd3dDevice->Release();
|
|
|
- if (pD3D) pD3D->Release();
|
|
|
+ CleanupDeviceD3D();
|
|
|
DestroyWindow(hwnd);
|
|
|
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
|
|
|