|
@@ -29,6 +29,48 @@ void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data);
|
|
|
void ResetDeviceWGL();
|
|
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
|
|
+
|
|
|
+static void Win32_CreateWindow(ImGuiViewport* viewport)
|
|
|
+{
|
|
|
+ assert(viewport->RendererUserData == NULL);
|
|
|
+
|
|
|
+ WGL_WindowData* data = IM_NEW(WGL_WindowData);
|
|
|
+ CreateDeviceWGL((HWND)viewport->PlatformHandle, data);
|
|
|
+ viewport->RendererUserData = data;
|
|
|
+}
|
|
|
+
|
|
|
+static void Win32_DestroyWindow(ImGuiViewport* viewport)
|
|
|
+{
|
|
|
+ if (viewport->RendererUserData != NULL)
|
|
|
+ {
|
|
|
+ WGL_WindowData* data = (WGL_WindowData*)viewport->RendererUserData;
|
|
|
+ CleanupDeviceWGL((HWND)viewport->PlatformHandle, data);
|
|
|
+ IM_DELETE(data);
|
|
|
+ viewport->RendererUserData = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void Win32_RenderWindow(ImGuiViewport* viewport, void*)
|
|
|
+{
|
|
|
+ WGL_WindowData* data = (WGL_WindowData*)viewport->RendererUserData;
|
|
|
+
|
|
|
+ if (data)
|
|
|
+ {
|
|
|
+ // Activate the platform window DC in the OpenGL rendering context
|
|
|
+ wglMakeCurrent(data->hDC, g_hRC);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void Win32_SwapBuffers(ImGuiViewport* viewport, void*)
|
|
|
+{
|
|
|
+ WGL_WindowData* data = (WGL_WindowData*)viewport->RendererUserData;
|
|
|
+
|
|
|
+ if (data)
|
|
|
+ {
|
|
|
+ SwapBuffers(data->hDC);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Main code
|
|
|
int main(int, char**)
|
|
|
{
|
|
@@ -58,15 +100,41 @@ int main(int, char**)
|
|
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
|
|
+ io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
|
|
|
+ io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows
|
|
|
|
|
|
// Setup Dear ImGui style
|
|
|
ImGui::StyleColorsDark();
|
|
|
//ImGui::StyleColorsClassic();
|
|
|
|
|
|
+ // When viewports are enabled we tweak WindowRounding/WindowBg so platform windows can look identical to regular ones.
|
|
|
+ ImGuiStyle& style = ImGui::GetStyle();
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
|
+ {
|
|
|
+ style.WindowRounding = 0.0f;
|
|
|
+ style.Colors[ImGuiCol_WindowBg].w = 1.0f;
|
|
|
+ }
|
|
|
+
|
|
|
// Setup Platform/Renderer backends
|
|
|
ImGui_ImplWin32_InitForOpenGL(hwnd);
|
|
|
ImGui_ImplOpenGL3_Init();
|
|
|
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
|
+ {
|
|
|
+ ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
+
|
|
|
+ // Store the hdc for this new window
|
|
|
+ assert(platform_io.Renderer_CreateWindow == NULL);
|
|
|
+ platform_io.Renderer_CreateWindow = Win32_CreateWindow;
|
|
|
+ assert(platform_io.Renderer_DestroyWindow == NULL);
|
|
|
+ platform_io.Renderer_DestroyWindow = Win32_DestroyWindow;
|
|
|
+ assert(platform_io.Renderer_SwapBuffers == NULL);
|
|
|
+ platform_io.Renderer_SwapBuffers = Win32_SwapBuffers;
|
|
|
+
|
|
|
+ // We need to activate the context before drawing
|
|
|
+ assert(platform_io.Platform_RenderWindow == NULL);
|
|
|
+ platform_io.Platform_RenderWindow = Win32_RenderWindow;
|
|
|
+ }
|
|
|
// Load Fonts
|
|
|
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
|
|
|
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
|
|
@@ -154,6 +222,15 @@ int main(int, char**)
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
|
|
|
|
|
+ // Update and Render additional Platform Windows
|
|
|
+ if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
|
+ {
|
|
|
+ ImGui::UpdatePlatformWindows();
|
|
|
+ ImGui::RenderPlatformWindowsDefault();
|
|
|
+ // Restore the OpenGL rendering context to the main window DC, since platform windows might have changed it.
|
|
|
+ wglMakeCurrent(g_MainWindow.hDC, g_hRC);
|
|
|
+ }
|
|
|
+
|
|
|
// Present
|
|
|
::SwapBuffers(g_MainWindow.hDC);
|
|
|
}
|