mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-12 02:00:58 +01:00
Examples: Win32+DirectX: moved helper functions below main.
This commit is contained in:
parent
b5d57a6615
commit
6767b0a1b0
@ -15,100 +15,32 @@ static ID3D10Device* g_pd3dDevice = NULL;
|
|||||||
static IDXGISwapChain* g_pSwapChain = NULL;
|
static IDXGISwapChain* g_pSwapChain = NULL;
|
||||||
static ID3D10RenderTargetView* g_mainRenderTargetView = NULL;
|
static ID3D10RenderTargetView* g_mainRenderTargetView = NULL;
|
||||||
|
|
||||||
void CreateRenderTarget()
|
// Forward declarations of helper functions
|
||||||
{
|
bool CreateDeviceD3D(HWND hWnd);
|
||||||
ID3D10Texture2D* pBackBuffer;
|
void CleanupDeviceD3D();
|
||||||
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
void CreateRenderTarget();
|
||||||
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView);
|
void CleanupRenderTarget();
|
||||||
pBackBuffer->Release();
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupRenderTarget()
|
|
||||||
{
|
|
||||||
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT CreateDeviceD3D(HWND hWnd)
|
|
||||||
{
|
|
||||||
// Setup swap chain
|
|
||||||
DXGI_SWAP_CHAIN_DESC sd;
|
|
||||||
ZeroMemory(&sd, sizeof(sd));
|
|
||||||
sd.BufferCount = 2;
|
|
||||||
sd.BufferDesc.Width = 0;
|
|
||||||
sd.BufferDesc.Height = 0;
|
|
||||||
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
sd.BufferDesc.RefreshRate.Numerator = 60;
|
|
||||||
sd.BufferDesc.RefreshRate.Denominator = 1;
|
|
||||||
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
|
||||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
|
||||||
sd.OutputWindow = hWnd;
|
|
||||||
sd.SampleDesc.Count = 1;
|
|
||||||
sd.SampleDesc.Quality = 0;
|
|
||||||
sd.Windowed = TRUE;
|
|
||||||
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
|
||||||
|
|
||||||
UINT createDeviceFlags = 0;
|
|
||||||
//createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;
|
|
||||||
if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
CreateRenderTarget();
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupDeviceD3D()
|
|
||||||
{
|
|
||||||
CleanupRenderTarget();
|
|
||||||
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
|
||||||
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
||||||
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_SIZE:
|
|
||||||
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
|
||||||
{
|
|
||||||
CleanupRenderTarget();
|
|
||||||
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
|
|
||||||
CreateRenderTarget();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case WM_SYSCOMMAND:
|
|
||||||
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Main code
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Create application window
|
// Create application window
|
||||||
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
||||||
RegisterClassEx(&wc);
|
::RegisterClassEx(&wc);
|
||||||
HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX10 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX10 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
||||||
|
|
||||||
// Initialize Direct3D
|
// Initialize Direct3D
|
||||||
if (CreateDeviceD3D(hwnd) < 0)
|
if (!CreateDeviceD3D(hwnd))
|
||||||
{
|
{
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the window
|
// Show the window
|
||||||
ShowWindow(hwnd, SW_SHOWDEFAULT);
|
::ShowWindow(hwnd, SW_SHOWDEFAULT);
|
||||||
UpdateWindow(hwnd);
|
::UpdateWindow(hwnd);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
@ -139,6 +71,7 @@ int main(int, char**)
|
|||||||
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
||||||
//IM_ASSERT(font != NULL);
|
//IM_ASSERT(font != NULL);
|
||||||
|
|
||||||
|
// Our state
|
||||||
bool show_demo_window = true;
|
bool show_demo_window = true;
|
||||||
bool show_another_window = false;
|
bool show_another_window = false;
|
||||||
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
||||||
@ -153,10 +86,10 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
::TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
::DispatchMessage(&msg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,8 +150,86 @@ int main(int, char**)
|
|||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
DestroyWindow(hwnd);
|
::DestroyWindow(hwnd);
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
|
||||||
|
bool CreateDeviceD3D(HWND hWnd)
|
||||||
|
{
|
||||||
|
// Setup swap chain
|
||||||
|
DXGI_SWAP_CHAIN_DESC sd;
|
||||||
|
ZeroMemory(&sd, sizeof(sd));
|
||||||
|
sd.BufferCount = 2;
|
||||||
|
sd.BufferDesc.Width = 0;
|
||||||
|
sd.BufferDesc.Height = 0;
|
||||||
|
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
sd.BufferDesc.RefreshRate.Numerator = 60;
|
||||||
|
sd.BufferDesc.RefreshRate.Denominator = 1;
|
||||||
|
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||||
|
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||||
|
sd.OutputWindow = hWnd;
|
||||||
|
sd.SampleDesc.Count = 1;
|
||||||
|
sd.SampleDesc.Quality = 0;
|
||||||
|
sd.Windowed = TRUE;
|
||||||
|
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||||
|
|
||||||
|
UINT createDeviceFlags = 0;
|
||||||
|
//createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG;
|
||||||
|
if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CreateRenderTarget();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupDeviceD3D()
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
||||||
|
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateRenderTarget()
|
||||||
|
{
|
||||||
|
ID3D10Texture2D* pBackBuffer;
|
||||||
|
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
||||||
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView);
|
||||||
|
pBackBuffer->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupRenderTarget()
|
||||||
|
{
|
||||||
|
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Win32 message handler
|
||||||
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
|
||||||
|
CreateRenderTarget();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
::PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ::DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
@ -15,103 +15,32 @@ static ID3D11DeviceContext* g_pd3dDeviceContext = NULL;
|
|||||||
static IDXGISwapChain* g_pSwapChain = NULL;
|
static IDXGISwapChain* g_pSwapChain = NULL;
|
||||||
static ID3D11RenderTargetView* g_mainRenderTargetView = NULL;
|
static ID3D11RenderTargetView* g_mainRenderTargetView = NULL;
|
||||||
|
|
||||||
void CreateRenderTarget()
|
// Forward declarations of helper functions
|
||||||
{
|
bool CreateDeviceD3D(HWND hWnd);
|
||||||
ID3D11Texture2D* pBackBuffer;
|
void CleanupDeviceD3D();
|
||||||
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
void CreateRenderTarget();
|
||||||
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView);
|
void CleanupRenderTarget();
|
||||||
pBackBuffer->Release();
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupRenderTarget()
|
|
||||||
{
|
|
||||||
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT CreateDeviceD3D(HWND hWnd)
|
|
||||||
{
|
|
||||||
// Setup swap chain
|
|
||||||
DXGI_SWAP_CHAIN_DESC sd;
|
|
||||||
ZeroMemory(&sd, sizeof(sd));
|
|
||||||
sd.BufferCount = 2;
|
|
||||||
sd.BufferDesc.Width = 0;
|
|
||||||
sd.BufferDesc.Height = 0;
|
|
||||||
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
sd.BufferDesc.RefreshRate.Numerator = 60;
|
|
||||||
sd.BufferDesc.RefreshRate.Denominator = 1;
|
|
||||||
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
|
||||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
|
||||||
sd.OutputWindow = hWnd;
|
|
||||||
sd.SampleDesc.Count = 1;
|
|
||||||
sd.SampleDesc.Quality = 0;
|
|
||||||
sd.Windowed = TRUE;
|
|
||||||
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
|
||||||
|
|
||||||
UINT createDeviceFlags = 0;
|
|
||||||
//createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
|
||||||
D3D_FEATURE_LEVEL featureLevel;
|
|
||||||
const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };
|
|
||||||
if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
CreateRenderTarget();
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupDeviceD3D()
|
|
||||||
{
|
|
||||||
CleanupRenderTarget();
|
|
||||||
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
|
||||||
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; }
|
|
||||||
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
||||||
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_SIZE:
|
|
||||||
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
|
||||||
{
|
|
||||||
CleanupRenderTarget();
|
|
||||||
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
|
|
||||||
CreateRenderTarget();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case WM_SYSCOMMAND:
|
|
||||||
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Main code
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Create application window
|
// Create application window
|
||||||
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
||||||
RegisterClassEx(&wc);
|
::RegisterClassEx(&wc);
|
||||||
HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX11 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX11 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
||||||
|
|
||||||
// Initialize Direct3D
|
// Initialize Direct3D
|
||||||
if (CreateDeviceD3D(hwnd) < 0)
|
if (!CreateDeviceD3D(hwnd))
|
||||||
{
|
{
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the window
|
// Show the window
|
||||||
ShowWindow(hwnd, SW_SHOWDEFAULT);
|
::ShowWindow(hwnd, SW_SHOWDEFAULT);
|
||||||
UpdateWindow(hwnd);
|
::UpdateWindow(hwnd);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
@ -157,10 +86,10 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
::TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
::DispatchMessage(&msg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,8 +150,89 @@ int main(int, char**)
|
|||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
DestroyWindow(hwnd);
|
::DestroyWindow(hwnd);
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
|
||||||
|
bool CreateDeviceD3D(HWND hWnd)
|
||||||
|
{
|
||||||
|
// Setup swap chain
|
||||||
|
DXGI_SWAP_CHAIN_DESC sd;
|
||||||
|
ZeroMemory(&sd, sizeof(sd));
|
||||||
|
sd.BufferCount = 2;
|
||||||
|
sd.BufferDesc.Width = 0;
|
||||||
|
sd.BufferDesc.Height = 0;
|
||||||
|
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
sd.BufferDesc.RefreshRate.Numerator = 60;
|
||||||
|
sd.BufferDesc.RefreshRate.Denominator = 1;
|
||||||
|
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
|
||||||
|
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||||
|
sd.OutputWindow = hWnd;
|
||||||
|
sd.SampleDesc.Count = 1;
|
||||||
|
sd.SampleDesc.Quality = 0;
|
||||||
|
sd.Windowed = TRUE;
|
||||||
|
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
|
||||||
|
|
||||||
|
UINT createDeviceFlags = 0;
|
||||||
|
//createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||||
|
D3D_FEATURE_LEVEL featureLevel;
|
||||||
|
const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, };
|
||||||
|
if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CreateRenderTarget();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupDeviceD3D()
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
||||||
|
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; }
|
||||||
|
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateRenderTarget()
|
||||||
|
{
|
||||||
|
ID3D11Texture2D* pBackBuffer;
|
||||||
|
g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer));
|
||||||
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView);
|
||||||
|
pBackBuffer->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupRenderTarget()
|
||||||
|
{
|
||||||
|
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Win32 message handler
|
||||||
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
|
||||||
|
CreateRenderTarget();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
::PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ::DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
@ -36,255 +36,35 @@ static HANDLE g_hSwapChainWaitableObject = NULL;
|
|||||||
static ID3D12Resource* g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {};
|
static ID3D12Resource* g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {};
|
||||||
static D3D12_CPU_DESCRIPTOR_HANDLE g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {};
|
static D3D12_CPU_DESCRIPTOR_HANDLE g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {};
|
||||||
|
|
||||||
void CreateRenderTarget()
|
// Forward declarations of helper functions
|
||||||
{
|
bool CreateDeviceD3D(HWND hWnd);
|
||||||
ID3D12Resource* pBackBuffer;
|
void CleanupDeviceD3D();
|
||||||
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
void CreateRenderTarget();
|
||||||
{
|
void CleanupRenderTarget();
|
||||||
g_pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBackBuffer));
|
void WaitForLastSubmittedFrame();
|
||||||
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, g_mainRenderTargetDescriptor[i]);
|
FrameContext* WaitForNextFrameResources();
|
||||||
g_mainRenderTargetResource[i] = pBackBuffer;
|
void ResizeSwapChain(HWND hWnd, int width, int height);
|
||||||
}
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
}
|
|
||||||
|
|
||||||
void WaitForLastSubmittedFrame()
|
|
||||||
{
|
|
||||||
FrameContext* frameCtxt = &g_frameContext[g_frameIndex % NUM_FRAMES_IN_FLIGHT];
|
|
||||||
|
|
||||||
UINT64 fenceValue = frameCtxt->FenceValue;
|
|
||||||
if (fenceValue == 0)
|
|
||||||
return; // No fence was signaled
|
|
||||||
|
|
||||||
frameCtxt->FenceValue = 0;
|
|
||||||
if (g_fence->GetCompletedValue() >= fenceValue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent);
|
|
||||||
WaitForSingleObject(g_fenceEvent, INFINITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
FrameContext* WaitForNextFrameResources()
|
|
||||||
{
|
|
||||||
UINT nextFrameIndex = g_frameIndex + 1;
|
|
||||||
g_frameIndex = nextFrameIndex;
|
|
||||||
|
|
||||||
HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, NULL };
|
|
||||||
DWORD numWaitableObjects = 1;
|
|
||||||
|
|
||||||
FrameContext* frameCtxt = &g_frameContext[nextFrameIndex % NUM_FRAMES_IN_FLIGHT];
|
|
||||||
UINT64 fenceValue = frameCtxt->FenceValue;
|
|
||||||
if (fenceValue != 0) // means no fence was signaled
|
|
||||||
{
|
|
||||||
frameCtxt->FenceValue = 0;
|
|
||||||
g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent);
|
|
||||||
waitableObjects[1] = g_fenceEvent;
|
|
||||||
numWaitableObjects = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
WaitForMultipleObjects(numWaitableObjects, waitableObjects, TRUE, INFINITE);
|
|
||||||
|
|
||||||
return frameCtxt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResizeSwapChain(HWND hWnd, int width, int height)
|
|
||||||
{
|
|
||||||
DXGI_SWAP_CHAIN_DESC1 sd;
|
|
||||||
g_pSwapChain->GetDesc1(&sd);
|
|
||||||
sd.Width = width;
|
|
||||||
sd.Height = height;
|
|
||||||
|
|
||||||
IDXGIFactory4* dxgiFactory = NULL;
|
|
||||||
g_pSwapChain->GetParent(IID_PPV_ARGS(&dxgiFactory));
|
|
||||||
|
|
||||||
g_pSwapChain->Release();
|
|
||||||
CloseHandle(g_hSwapChainWaitableObject);
|
|
||||||
|
|
||||||
IDXGISwapChain1* swapChain1 = NULL;
|
|
||||||
dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1);
|
|
||||||
swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain));
|
|
||||||
swapChain1->Release();
|
|
||||||
dxgiFactory->Release();
|
|
||||||
|
|
||||||
g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS);
|
|
||||||
|
|
||||||
g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject();
|
|
||||||
assert(g_hSwapChainWaitableObject != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupRenderTarget()
|
|
||||||
{
|
|
||||||
WaitForLastSubmittedFrame();
|
|
||||||
|
|
||||||
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
|
||||||
if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT CreateDeviceD3D(HWND hWnd)
|
|
||||||
{
|
|
||||||
// Setup swap chain
|
|
||||||
DXGI_SWAP_CHAIN_DESC1 sd;
|
|
||||||
{
|
|
||||||
ZeroMemory(&sd, sizeof(sd));
|
|
||||||
sd.BufferCount = NUM_BACK_BUFFERS;
|
|
||||||
sd.Width = 0;
|
|
||||||
sd.Height = 0;
|
|
||||||
sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
|
||||||
sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
|
|
||||||
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
|
||||||
sd.SampleDesc.Count = 1;
|
|
||||||
sd.SampleDesc.Quality = 0;
|
|
||||||
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
|
|
||||||
sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
|
|
||||||
sd.Scaling = DXGI_SCALING_STRETCH;
|
|
||||||
sd.Stereo = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DX12_ENABLE_DEBUG_LAYER)
|
|
||||||
{
|
|
||||||
ID3D12Debug* dx12Debug = NULL;
|
|
||||||
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&dx12Debug))))
|
|
||||||
{
|
|
||||||
dx12Debug->EnableDebugLayer();
|
|
||||||
dx12Debug->Release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
|
|
||||||
if (D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
{
|
|
||||||
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
|
||||||
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
|
|
||||||
desc.NumDescriptors = NUM_BACK_BUFFERS;
|
|
||||||
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
|
|
||||||
desc.NodeMask = 1;
|
|
||||||
if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dRtvDescHeap)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
SIZE_T rtvDescriptorSize = g_pd3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
|
||||||
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = g_pd3dRtvDescHeap->GetCPUDescriptorHandleForHeapStart();
|
|
||||||
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
|
||||||
{
|
|
||||||
g_mainRenderTargetDescriptor[i] = rtvHandle;
|
|
||||||
rtvHandle.ptr += rtvDescriptorSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
|
||||||
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
|
||||||
desc.NumDescriptors = 1;
|
|
||||||
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
|
||||||
if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dSrvDescHeap)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
D3D12_COMMAND_QUEUE_DESC desc = {};
|
|
||||||
desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
|
||||||
desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
|
|
||||||
desc.NodeMask = 1;
|
|
||||||
if (g_pd3dDevice->CreateCommandQueue(&desc, IID_PPV_ARGS(&g_pd3dCommandQueue)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++)
|
|
||||||
if (g_pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&g_frameContext[i].CommandAllocator)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, NULL, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK ||
|
|
||||||
g_pd3dCommandList->Close() != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
if (g_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&g_fence)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
g_fenceEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
||||||
if (g_fenceEvent == NULL)
|
|
||||||
return E_FAIL;
|
|
||||||
|
|
||||||
{
|
|
||||||
IDXGIFactory4* dxgiFactory = NULL;
|
|
||||||
IDXGISwapChain1* swapChain1 = NULL;
|
|
||||||
if (CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)) != S_OK ||
|
|
||||||
dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1) != S_OK ||
|
|
||||||
swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)) != S_OK)
|
|
||||||
return E_FAIL;
|
|
||||||
swapChain1->Release();
|
|
||||||
dxgiFactory->Release();
|
|
||||||
g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS);
|
|
||||||
g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
CreateRenderTarget();
|
|
||||||
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CleanupDeviceD3D()
|
|
||||||
{
|
|
||||||
CleanupRenderTarget();
|
|
||||||
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
|
||||||
if (g_hSwapChainWaitableObject != NULL) { CloseHandle(g_hSwapChainWaitableObject); }
|
|
||||||
for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++)
|
|
||||||
if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = NULL; }
|
|
||||||
if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = NULL; }
|
|
||||||
if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = NULL; }
|
|
||||||
if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = NULL; }
|
|
||||||
if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = NULL; }
|
|
||||||
if (g_fence) { g_fence->Release(); g_fence = NULL; }
|
|
||||||
if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = NULL; }
|
|
||||||
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
|
||||||
}
|
|
||||||
|
|
||||||
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
||||||
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_SIZE:
|
|
||||||
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
|
||||||
{
|
|
||||||
ImGui_ImplDX12_InvalidateDeviceObjects();
|
|
||||||
CleanupRenderTarget();
|
|
||||||
ResizeSwapChain(hWnd, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
|
|
||||||
CreateRenderTarget();
|
|
||||||
ImGui_ImplDX12_CreateDeviceObjects();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case WM_SYSCOMMAND:
|
|
||||||
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Main code
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Create application window
|
// Create application window
|
||||||
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
||||||
RegisterClassEx(&wc);
|
::RegisterClassEx(&wc);
|
||||||
HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX12 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX12 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
||||||
|
|
||||||
// Initialize Direct3D
|
// Initialize Direct3D
|
||||||
if (CreateDeviceD3D(hwnd) < 0)
|
if (!CreateDeviceD3D(hwnd))
|
||||||
{
|
{
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the window
|
// Show the window
|
||||||
ShowWindow(hwnd, SW_SHOWDEFAULT);
|
::ShowWindow(hwnd, SW_SHOWDEFAULT);
|
||||||
UpdateWindow(hwnd);
|
::UpdateWindow(hwnd);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
@ -318,6 +98,7 @@ int main(int, char**)
|
|||||||
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
||||||
//IM_ASSERT(font != NULL);
|
//IM_ASSERT(font != NULL);
|
||||||
|
|
||||||
|
// Our state
|
||||||
bool show_demo_window = true;
|
bool show_demo_window = true;
|
||||||
bool show_another_window = false;
|
bool show_another_window = false;
|
||||||
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
||||||
@ -332,10 +113,10 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
::TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
::DispatchMessage(&msg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,8 +204,241 @@ int main(int, char**)
|
|||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
DestroyWindow(hwnd);
|
::DestroyWindow(hwnd);
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
|
||||||
|
bool CreateDeviceD3D(HWND hWnd)
|
||||||
|
{
|
||||||
|
// Setup swap chain
|
||||||
|
DXGI_SWAP_CHAIN_DESC1 sd;
|
||||||
|
{
|
||||||
|
ZeroMemory(&sd, sizeof(sd));
|
||||||
|
sd.BufferCount = NUM_BACK_BUFFERS;
|
||||||
|
sd.Width = 0;
|
||||||
|
sd.Height = 0;
|
||||||
|
sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT;
|
||||||
|
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
|
||||||
|
sd.SampleDesc.Count = 1;
|
||||||
|
sd.SampleDesc.Quality = 0;
|
||||||
|
sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
|
||||||
|
sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
|
||||||
|
sd.Scaling = DXGI_SCALING_STRETCH;
|
||||||
|
sd.Stereo = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DX12_ENABLE_DEBUG_LAYER)
|
||||||
|
{
|
||||||
|
ID3D12Debug* dx12Debug = NULL;
|
||||||
|
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&dx12Debug))))
|
||||||
|
{
|
||||||
|
dx12Debug->EnableDebugLayer();
|
||||||
|
dx12Debug->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
|
||||||
|
if (D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
{
|
||||||
|
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
||||||
|
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
|
||||||
|
desc.NumDescriptors = NUM_BACK_BUFFERS;
|
||||||
|
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
|
||||||
|
desc.NodeMask = 1;
|
||||||
|
if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dRtvDescHeap)) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
SIZE_T rtvDescriptorSize = g_pd3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = g_pd3dRtvDescHeap->GetCPUDescriptorHandleForHeapStart();
|
||||||
|
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
||||||
|
{
|
||||||
|
g_mainRenderTargetDescriptor[i] = rtvHandle;
|
||||||
|
rtvHandle.ptr += rtvDescriptorSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
||||||
|
desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
||||||
|
desc.NumDescriptors = 1;
|
||||||
|
desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
||||||
|
if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dSrvDescHeap)) != S_OK)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
D3D12_COMMAND_QUEUE_DESC desc = {};
|
||||||
|
desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
||||||
|
desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
|
||||||
|
desc.NodeMask = 1;
|
||||||
|
if (g_pd3dDevice->CreateCommandQueue(&desc, IID_PPV_ARGS(&g_pd3dCommandQueue)) != S_OK)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++)
|
||||||
|
if (g_pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&g_frameContext[i].CommandAllocator)) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, NULL, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK ||
|
||||||
|
g_pd3dCommandList->Close() != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (g_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&g_fence)) != S_OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
g_fenceEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||||
|
if (g_fenceEvent == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
{
|
||||||
|
IDXGIFactory4* dxgiFactory = NULL;
|
||||||
|
IDXGISwapChain1* swapChain1 = NULL;
|
||||||
|
if (CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)) != S_OK ||
|
||||||
|
dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1) != S_OK ||
|
||||||
|
swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)) != S_OK)
|
||||||
|
return false;
|
||||||
|
swapChain1->Release();
|
||||||
|
dxgiFactory->Release();
|
||||||
|
g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS);
|
||||||
|
g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateRenderTarget();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupDeviceD3D()
|
||||||
|
{
|
||||||
|
CleanupRenderTarget();
|
||||||
|
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
|
||||||
|
if (g_hSwapChainWaitableObject != NULL) { CloseHandle(g_hSwapChainWaitableObject); }
|
||||||
|
for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++)
|
||||||
|
if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = NULL; }
|
||||||
|
if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = NULL; }
|
||||||
|
if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = NULL; }
|
||||||
|
if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = NULL; }
|
||||||
|
if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = NULL; }
|
||||||
|
if (g_fence) { g_fence->Release(); g_fence = NULL; }
|
||||||
|
if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = NULL; }
|
||||||
|
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateRenderTarget()
|
||||||
|
{
|
||||||
|
ID3D12Resource* pBackBuffer;
|
||||||
|
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
||||||
|
{
|
||||||
|
g_pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBackBuffer));
|
||||||
|
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, g_mainRenderTargetDescriptor[i]);
|
||||||
|
g_mainRenderTargetResource[i] = pBackBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupRenderTarget()
|
||||||
|
{
|
||||||
|
WaitForLastSubmittedFrame();
|
||||||
|
|
||||||
|
for (UINT i = 0; i < NUM_BACK_BUFFERS; i++)
|
||||||
|
if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaitForLastSubmittedFrame()
|
||||||
|
{
|
||||||
|
FrameContext* frameCtxt = &g_frameContext[g_frameIndex % NUM_FRAMES_IN_FLIGHT];
|
||||||
|
|
||||||
|
UINT64 fenceValue = frameCtxt->FenceValue;
|
||||||
|
if (fenceValue == 0)
|
||||||
|
return; // No fence was signaled
|
||||||
|
|
||||||
|
frameCtxt->FenceValue = 0;
|
||||||
|
if (g_fence->GetCompletedValue() >= fenceValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent);
|
||||||
|
WaitForSingleObject(g_fenceEvent, INFINITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
FrameContext* WaitForNextFrameResources()
|
||||||
|
{
|
||||||
|
UINT nextFrameIndex = g_frameIndex + 1;
|
||||||
|
g_frameIndex = nextFrameIndex;
|
||||||
|
|
||||||
|
HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, NULL };
|
||||||
|
DWORD numWaitableObjects = 1;
|
||||||
|
|
||||||
|
FrameContext* frameCtxt = &g_frameContext[nextFrameIndex % NUM_FRAMES_IN_FLIGHT];
|
||||||
|
UINT64 fenceValue = frameCtxt->FenceValue;
|
||||||
|
if (fenceValue != 0) // means no fence was signaled
|
||||||
|
{
|
||||||
|
frameCtxt->FenceValue = 0;
|
||||||
|
g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent);
|
||||||
|
waitableObjects[1] = g_fenceEvent;
|
||||||
|
numWaitableObjects = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
WaitForMultipleObjects(numWaitableObjects, waitableObjects, TRUE, INFINITE);
|
||||||
|
|
||||||
|
return frameCtxt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResizeSwapChain(HWND hWnd, int width, int height)
|
||||||
|
{
|
||||||
|
DXGI_SWAP_CHAIN_DESC1 sd;
|
||||||
|
g_pSwapChain->GetDesc1(&sd);
|
||||||
|
sd.Width = width;
|
||||||
|
sd.Height = height;
|
||||||
|
|
||||||
|
IDXGIFactory4* dxgiFactory = NULL;
|
||||||
|
g_pSwapChain->GetParent(IID_PPV_ARGS(&dxgiFactory));
|
||||||
|
|
||||||
|
g_pSwapChain->Release();
|
||||||
|
CloseHandle(g_hSwapChainWaitableObject);
|
||||||
|
|
||||||
|
IDXGISwapChain1* swapChain1 = NULL;
|
||||||
|
dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1);
|
||||||
|
swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain));
|
||||||
|
swapChain1->Release();
|
||||||
|
dxgiFactory->Release();
|
||||||
|
|
||||||
|
g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS);
|
||||||
|
|
||||||
|
g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject();
|
||||||
|
assert(g_hSwapChainWaitableObject != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Win32 message handler
|
||||||
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
||||||
|
{
|
||||||
|
ImGui_ImplDX12_InvalidateDeviceObjects();
|
||||||
|
CleanupRenderTarget();
|
||||||
|
ResizeSwapChain(hWnd, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam));
|
||||||
|
CreateRenderTarget();
|
||||||
|
ImGui_ImplDX12_CreateDeviceObjects();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
::PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ::DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
@ -14,86 +14,31 @@ static LPDIRECT3D9 g_pD3D = NULL;
|
|||||||
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
|
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
|
||||||
static D3DPRESENT_PARAMETERS g_d3dpp = {};
|
static D3DPRESENT_PARAMETERS g_d3dpp = {};
|
||||||
|
|
||||||
HRESULT CreateDeviceD3D(HWND hWnd)
|
// Forward declarations of helper functions
|
||||||
{
|
bool CreateDeviceD3D(HWND hWnd);
|
||||||
if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
|
void CleanupDeviceD3D();
|
||||||
return E_FAIL;
|
void ResetDevice();
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
// 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)
|
|
||||||
{
|
|
||||||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
switch (msg)
|
|
||||||
{
|
|
||||||
case WM_SIZE:
|
|
||||||
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
|
||||||
{
|
|
||||||
g_d3dpp.BackBufferWidth = LOWORD(lParam);
|
|
||||||
g_d3dpp.BackBufferHeight = HIWORD(lParam);
|
|
||||||
ResetDevice();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case WM_SYSCOMMAND:
|
|
||||||
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Main code
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Create application window
|
// Create application window
|
||||||
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };
|
||||||
RegisterClassEx(&wc);
|
::RegisterClassEx(&wc);
|
||||||
HWND hwnd = CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX9 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX9 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
|
||||||
|
|
||||||
// Initialize Direct3D
|
// Initialize Direct3D
|
||||||
if (CreateDeviceD3D(hwnd) < 0)
|
if (!CreateDeviceD3D(hwnd))
|
||||||
{
|
{
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show the window
|
// Show the window
|
||||||
ShowWindow(hwnd, SW_SHOWDEFAULT);
|
::ShowWindow(hwnd, SW_SHOWDEFAULT);
|
||||||
UpdateWindow(hwnd);
|
::UpdateWindow(hwnd);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
@ -139,10 +84,10 @@ int main(int, char**)
|
|||||||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
|
||||||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
|
||||||
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
|
||||||
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
|
||||||
{
|
{
|
||||||
TranslateMessage(&msg);
|
::TranslateMessage(&msg);
|
||||||
DispatchMessage(&msg);
|
::DispatchMessage(&msg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,8 +158,73 @@ int main(int, char**)
|
|||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
|
||||||
CleanupDeviceD3D();
|
CleanupDeviceD3D();
|
||||||
DestroyWindow(hwnd);
|
::DestroyWindow(hwnd);
|
||||||
UnregisterClass(wc.lpszClassName, wc.hInstance);
|
::UnregisterClass(wc.lpszClassName, wc.hInstance);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper functions
|
||||||
|
|
||||||
|
bool CreateDeviceD3D(HWND hWnd)
|
||||||
|
{
|
||||||
|
if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// 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 false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Win32 message handler
|
||||||
|
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_SIZE:
|
||||||
|
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
|
||||||
|
{
|
||||||
|
g_d3dpp.BackBufferWidth = LOWORD(lParam);
|
||||||
|
g_d3dpp.BackBufferHeight = HIWORD(lParam);
|
||||||
|
ResetDevice();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
case WM_DESTROY:
|
||||||
|
::PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return ::DefWindowProc(hWnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user