From 96bed6351ead304e315f18dfcfb78b0cb518d873 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Mon, 25 Sep 2023 17:28:43 -0400 Subject: [PATCH] Enabled imgui viewports --- Nuake/src/Resource/Prefab.cpp | 6 +++- Nuake/src/Vendors/imgui/imgui_impl_glfw.cpp | 12 ++++++-- Nuake/src/Vendors/imgui/imgui_impl_glfw.h | 9 ++++-- .../src/Vendors/imgui/imgui_impl_opengl3.cpp | 28 +++++++++++-------- Nuake/src/Vendors/imgui/imgui_impl_opengl3.h | 9 ++++-- Nuake/src/Window.cpp | 13 +++++++++ premake5.lua | 13 +++++++-- 7 files changed, 66 insertions(+), 24 deletions(-) diff --git a/Nuake/src/Resource/Prefab.cpp b/Nuake/src/Resource/Prefab.cpp index 4f5ae5bb..5d912843 100644 --- a/Nuake/src/Resource/Prefab.cpp +++ b/Nuake/src/Resource/Prefab.cpp @@ -20,7 +20,11 @@ namespace Nuake if (FileSystem::FileExists(path, false)) { std::string prefabTextContent = FileSystem::ReadFile(path); - newPrefab->Deserialize(json::parse(prefabTextContent)); + + if (!prefabTextContent.empty()) + { + newPrefab->Deserialize(json::parse(prefabTextContent)); + } } return newPrefab; diff --git a/Nuake/src/Vendors/imgui/imgui_impl_glfw.cpp b/Nuake/src/Vendors/imgui/imgui_impl_glfw.cpp index e5f0e648..ebd80f6c 100644 --- a/Nuake/src/Vendors/imgui/imgui_impl_glfw.cpp +++ b/Nuake/src/Vendors/imgui/imgui_impl_glfw.cpp @@ -16,8 +16,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) @@ -703,6 +706,9 @@ void ImGui_ImplGlfw_Shutdown() if (bd->InstalledCallbacks) ImGui_ImplGlfw_RestoreCallbacks(bd->Window); +#ifdef __EMSCRIPTEN__ + emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, nullptr, false, nullptr); +#endif for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) glfwDestroyCursor(bd->MouseCursors[cursor_n]); @@ -1288,4 +1294,4 @@ static void ImGui_ImplGlfw_ShutdownPlatformInterface() #pragma clang diagnostic pop #endif -#endif // #ifndef IMGUI_DISABLE +#endif // #ifndef IMGUI_DISABLE \ No newline at end of file diff --git a/Nuake/src/Vendors/imgui/imgui_impl_glfw.h b/Nuake/src/Vendors/imgui/imgui_impl_glfw.h index 241a9710..8a8adfdd 100644 --- a/Nuake/src/Vendors/imgui/imgui_impl_glfw.h +++ b/Nuake/src/Vendors/imgui/imgui_impl_glfw.h @@ -16,8 +16,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp #pragma once #include "imgui.h" // IMGUI_IMPL_API @@ -52,4 +55,4 @@ IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c); IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event); -#endif // #ifndef IMGUI_DISABLE +#endif // #ifndef IMGUI_DISABLE \ No newline at end of file diff --git a/Nuake/src/Vendors/imgui/imgui_impl_opengl3.cpp b/Nuake/src/Vendors/imgui/imgui_impl_opengl3.cpp index 69eee412..54ce3f9e 100644 --- a/Nuake/src/Vendors/imgui/imgui_impl_opengl3.cpp +++ b/Nuake/src/Vendors/imgui/imgui_impl_opengl3.cpp @@ -15,8 +15,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // CHANGELOG // (minor and older changes stripped away, please see git history for details) @@ -443,10 +446,10 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid #endif const float ortho_projection[4][4] = { - { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, - { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 2.0f / (R - L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f / (T - B), 0.0f, 0.0f }, { 0.0f, 0.0f, -1.0f, 0.0f }, - { (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f }, + { (R + L) / (L - R), (T + B) / (B - T), 0.0f, 1.0f }, }; glUseProgram(bd->ShaderHandle); glUniform1i(bd->AttribLocationTex, 0); @@ -468,8 +471,8 @@ static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_wid GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxPos)); GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxUV)); GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxColor)); - GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); - GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); } @@ -492,7 +495,8 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program); GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture); #ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER - GLuint last_sampler; if (bd->GlVersion >= 330 || bd->GlProfileIsES3) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } + GLuint last_sampler; if (bd->GlVersion >= 330 || bd->GlProfileIsES3) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } + else { last_sampler = 0; } #endif GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); #ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY @@ -604,7 +608,7 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) GL_CALL(glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset)); else #endif - GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); + GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); } } } @@ -935,9 +939,9 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects() void ImGui_ImplOpenGL3_DestroyDeviceObjects() { ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); - if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; } + if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; } if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; } - if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; } + if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; } ImGui_ImplOpenGL3_DestroyFontsTexture(); } @@ -978,4 +982,4 @@ static void ImGui_ImplOpenGL3_ShutdownPlatformInterface() #pragma clang diagnostic pop #endif -#endif // #ifndef IMGUI_DISABLE +#endif // #ifndef IMGUI_DISABLE \ No newline at end of file diff --git a/Nuake/src/Vendors/imgui/imgui_impl_opengl3.h b/Nuake/src/Vendors/imgui/imgui_impl_opengl3.h index ab46a8af..c3c0fc50 100644 --- a/Nuake/src/Vendors/imgui/imgui_impl_opengl3.h +++ b/Nuake/src/Vendors/imgui/imgui_impl_opengl3.h @@ -15,8 +15,11 @@ // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. -// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. -// Read online: https://github.com/ocornut/imgui/tree/master/docs +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp // About GLSL version: // The 'glsl_version' initialization parameter should be nullptr (default) or a "#version XXX" string. @@ -61,4 +64,4 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects(); #endif -#endif // #ifndef IMGUI_DISABLE +#endif // #ifndef IMGUI_DISABLE \ No newline at end of file diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index f47d5424..fa61ffdb 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -155,8 +155,20 @@ namespace Nuake void Window::EndDraw() { + ImGui::EndFrame(); ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) + { + GLFWwindow* backup_current_context = glfwGetCurrentContext(); + ImGui::UpdatePlatformWindows(); + ImGui::RenderPlatformWindowsDefault(); + glfwMakeContextCurrent(backup_current_context); + } + + glfwSwapBuffers(m_Window); glfwPollEvents(); } @@ -263,6 +275,7 @@ namespace Nuake io.Fonts->AddFontFromFileTTF("resources/Fonts/Poppins-Regular.ttf", 16.0); io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; + io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; ImGui::StyleColorsDark(); ImGuiStyle& s = ImGui::GetStyle(); diff --git a/premake5.lua b/premake5.lua index ae5690c4..955df603 100644 --- a/premake5.lua +++ b/premake5.lua @@ -176,9 +176,19 @@ project "NuakeRuntime" "WIN32_LEAN_AND_MEAN" } entrypoint "WinMainCRTStartup" - flags { "WinMain" } buildoptions { "-mwindows"} + filter "configurations:Dist" + kind "WindowedApp" + runtime "Release" + optimize "on" + entrypoint "WinMainCRTStartup" + flags { "WinMain" } + defines + { + "NK_DIST" + } + -- copy a file from the objects directory to the target directory postbuildcommands { --"{COPY} "Nuake/dependencies/GLFW/lib-vc2019/glfw3.dll" " .. "./bin/" .. outputdir .. "/%{prj.name}/glfw3.dll" @@ -267,7 +277,6 @@ project "Editor" "WIN32_LEAN_AND_MEAN" } entrypoint "WinMainCRTStartup" - flags { "WinMain" } -- copy a file from the objects directory to the target directory postbuildcommands {