CI windows vulkan update - #8925
Conversation
|
Thank you Vincent! I merged this as f77f68a (with changelog and minor shallow tweaks of comments) Tho I have to admit I am not 100% satisfied by this, since the process of downloading a ZIP file seems generally simpler, even though the new SDK are about ~14 MB (due to pdb). For the records can you clarify "there was issue unzipping the archive" ? Let's run with your changes for now! But in case it ends up more brittle due to past/future Vulkan SDK changes I may backtrack to use a ZIP. In theory I would find it valuable to ensure that we can change the tag to any version number, but do we know if the same build process/paths works with old VulkanSDK etc? In practice it may not matter so much.. let's see how it goes. |
|
@ocornut yeah it's not the bestest, but I tried to strike the balance between cleanness ease to update the sdk version. So I tried to avoid to have to upload a custom zip somewhere at all cost, as it's just too much friciton. I originally tried to pull down the sdk straight from https://vulkan.lunarg.com/sdk/home and 2 issues came up quickly. The headers are only in the sdk installer, and while 7zip can pull out the files from it without actually installing, I couldn't force powershell to uncompress it in place. The only zip you can get (the 14mb) only has the loader and not the headers. Arguably you could get away with just the headers, and dynamically load the loader dll, so you don't even need to get the loader and build it. Afaik the build process and tag scheme has been fairly stable for a while, but we are never guaranteed for it to not change. Although in that case, it wouldn't break CI, but just need to massage things a bit to upgrade to whatever version. |
|
This is failing: FYI i am also watching a CI run the new steps are fairly long. |
|
Oh this is a 32bit build. Those weren't running the other day when I made the PR. |
Ah yeah. |
|
Looking at this now. Official SDK don't even have a 32bit loader pre-built anymore, so going to have to build my own |
|
I'm still iterating on this, but here is a proposal:
|
|
See https://github.com/yaz0r/imgui/actions/runs/17718430439 for the result of the workflow and generated .zip |
|
Thanks for the update!
I would prefer to run this manually and occasionally anyhow. To be honest we may even be better off with a simple powershell batch file copying the same commands? There isn't a strong need to be updating often, mostly if a SDK specific problem occurs. Once we have those zip we can consider tweaking CI to build twice, one with oldest supported SDK, one with a recent one. The previously updated zip was ~434 KB (https://github.com/ocornut/imgui/files/3789205/vulkan-sdk-1.1.121.2.zip) because it only carried headers + lib, not actual dll (as we don't run on the CI server) let alone pdb. Nowadays if I strip those files it goes down to ~1.5 MB. I'd probably strip them from the copying script/batch file. |
|
@ocornut yaz0r@546a55e It moves the bulk of the logic to a standalone ps1 script. I left it as a workflow that can be triggered manually and generate a file of the format vulkan_windows_libs_$($env:VULKAN_TAG) |
|
Also, trimmed to minimal .lib files. I reverted the build step to your old zip, as I'm not sure how you uploaded it in the first place. |
4805534 to
d4f722d
Compare
|
@ocornut updated the PR with the changes |
|
Attachment: |
|
Thank you! GitHub upload urls changed so new urls look less adequate for what we are doing here, but I reckon we are not going to look at this very often, so I believe our problem is nicely solved now. Thank you very much! |
diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt
index 757c4b7..20b766d 100755
--- a/runtime/CMakeLists.txt
+++ b/runtime/CMakeLists.txt
@@ -67,7 +67,8 @@ target_link_libraries(entixruntime PRIVATE
SDL3::SDL3-shared
glad
Tracy::TracyClient
- nlohmann_json::nlohmann_json)
+ nlohmann_json::nlohmann_json
+ imgui)
target_link_libraries(entixruntime PUBLIC EnTT::EnTT glm::glm)
diff --git a/runtime/include/Core/Application.h b/runtime/include/Core/Application.h
index b534ca1..2dbf852 100755
--- a/runtime/include/Core/Application.h
+++ b/runtime/include/Core/Application.h
@@ -12,6 +12,10 @@
#include "Renderer/Context.h"
+#include "ECS/Scene.h"
+
+#include "GUI/Context.h"
+
namespace ERUNTIME_NAMESPACE
{
struct ApplicationSpecification
@@ -26,15 +30,17 @@ namespace ERUNTIME_NAMESPACE
public:
~Application();
- static Application& Instance() { return *s_instance; }
+ static Application& Get() { return *s_instance; }
void Run(int argc, char** argv);
void OnEvent(const Event& event) final;
ApplicationSpecification GetSpec() const noexcept { return k_spec; }
- Window& GetWindow() const noexcept { return *m_window; }
- Context& GetContext() const noexcept { return *m_context; }
+ Window& GetWindow() const { return *m_window; }
+ Context& GetContext() const { return *m_context; }
+ GUI::Context& GetGUIContext() const { return *m_guiContext; }
+ Scene& GetCurrentScene() const { return *m_scene; }
protected:
Application(const ApplicationSpecification& spec);
@@ -46,6 +52,9 @@ namespace ERUNTIME_NAMESPACE
Ref<Window> m_window;
Ref<Context> m_context;
+ Scope<GUI::Context> m_guiContext;
+
+ Scene* m_scene;
bool m_running;
};
diff --git a/runtime/include/Components/Base.h b/runtime/include/ECS/Components/Base.h
similarity index 100%
rename from runtime/include/Components/Base.h
rename to runtime/include/ECS/Components/Base.h
diff --git a/runtime/include/ECS/Scene.h b/runtime/include/ECS/Scene.h
new file mode 100644
index 0000000..fc8fc52
--- /dev/null
+++ b/runtime/include/ECS/Scene.h
@@ -0,0 +1,15 @@
+// -*- mode: c++; -*-
+#pragma once
+
+#include "Core/Base.h"
+#include "Core/Types.h"
+
+namespace ERUNTIME_NAMESPACE {
+ class Scene {
+ public:
+ Scene();
+ ~Scene();
+
+ void OnTick(float deltaTime);
+ };
+}
\ No newline at end of file
diff --git a/runtime/include/GUI/Context.h b/runtime/include/GUI/Context.h
new file mode 100644
index 0000000..be2bd2c
--- /dev/null
+++ b/runtime/include/GUI/Context.h
@@ -0,0 +1,36 @@
+// -*- mode: c++; -*-
+#pragma once
+
+#include "Core/Base.h"
+#include "Core/Memory.h"
+
+#include "Renderer/Context.h"
+
+#include "GUI/Window.h"
+
+#include <type_traits>
+
+namespace ERUNTIME_NAMESPACE::GUI {
+ class Context {
+ public:
+ Context(const Ref<::ERUNTIME_NAMESPACE::Context>& rendererContext);
+ ~Context();
+
+ template<typename T, typename... Args>
+ T& CreateWindow(Args&&... args)
+ {
+ static_assert(std::is_base_of<Window, T>::value, "Window must be derived from IGUI::Window class");
+
+ auto window = Scope<Window>(new T(std::forward<Args>(args)...));
+ T& windowRef = dynamic_cast<T&>(*window);
+ m_windows.push_back(std::move(window));
+ return windowRef;
+ }
+
+ void OnPreUpdate();
+ void OnPostRender();
+
+ private:
+ std::vector<Scope<Window>> m_windows;
+ };
+}
\ No newline at end of file
diff --git a/runtime/include/GUI/Window.h b/runtime/include/GUI/Window.h
new file mode 100644
index 0000000..bf600f7
--- /dev/null
+++ b/runtime/include/GUI/Window.h
@@ -0,0 +1,29 @@
+// -*- mode: c++; -*-
+#pragma once
+
+#include "Core/Base.h"
+#include "Core/String.h"
+
+namespace ERUNTIME_NAMESPACE::GUI {
+ class Window {
+ public:
+ Window(const String& name);
+
+ virtual void Draw() = 0;
+
+ void Show();
+ void Hide();
+
+ String GetName() const noexcept { return k_name; }
+
+ private:
+ friend class Context;
+
+ void BeginRender();
+ void EndRender();
+
+ const String k_name;
+ bool m_show;
+ bool m_isOpen;
+ };
+}
\ No newline at end of file
diff --git a/runtime/include/Renderer/Context.h b/runtime/include/Renderer/Context.h
index 07e33fc..cf8e417 100755
--- a/runtime/include/Renderer/Context.h
+++ b/runtime/include/Renderer/Context.h
@@ -41,6 +41,11 @@ namespace ERUNTIME_NAMESPACE
virtual void Swap() = 0;
+ // ---------------------------------------------------------------------
+ // Инициализация интерфейса при помощи контекста рендеринга
+ // ---------------------------------------------------------------------
+ virtual void InitGUI() = 0;
+
protected:
Context() = default;
};
diff --git a/runtime/source/Core/Application.cpp b/runtime/source/Core/Application.cpp
index 7fc7901..53d77d6 100755
--- a/runtime/source/Core/Application.cpp
+++ b/runtime/source/Core/Application.cpp
@@ -27,6 +27,7 @@ namespace ERUNTIME_NAMESPACE
EventBus::Instance().AddListener(this);
m_window = Ref<Window>(Window::Create(k_spec.windowSpec));
m_context = Ref<Context>(Context::Create(m_window));
+ m_guiContext = CreateScope<GUI::Context>(m_context);
}
Application::~Application()
@@ -91,15 +92,19 @@ namespace ERUNTIME_NAMESPACE
m_window->Update();
+ m_guiContext->OnPreUpdate();
+
m_context->BeginScene();
m_context->SetClearColor(0.2f, 0.2f, 0.2f);
m_context->Clear();
m_context->Submit(shader, vertex_array);
-
+
m_context->EndScene();
+ m_guiContext->OnPostRender();
+
m_context->Swap();
FrameMark;
diff --git a/runtime/source/Drivers/OpenGL/OpenGLContext.cpp b/runtime/source/Drivers/OpenGL/OpenGLContext.cpp
index 1676627..e730900 100755
--- a/runtime/source/Drivers/OpenGL/OpenGLContext.cpp
+++ b/runtime/source/Drivers/OpenGL/OpenGLContext.cpp
@@ -8,6 +8,12 @@
#include <tracy/TracyOpenGL.hpp>
+#include <imgui.h>
+#include <imgui_impl_sdl3.h>
+#include <imgui_impl_opengl3.h>
+
+static constexpr const char* GUI_GLSL_VERSION = "#version 130";
+
namespace ERUNTIME_NAMESPACE {
OpenGLContext::OpenGLContext(const Ref<Window>& window)
: m_window(window)
@@ -50,6 +56,12 @@ namespace ERUNTIME_NAMESPACE {
GL_UNSIGNED_INT, 0);
}
+ void OpenGLContext::InitGUI()
+ {
+ ImGui_ImplSDL3_InitForOpenGL(static_cast<SDL_Window*>(m_window->GetWindowHandle()), m_context);
+ ImGui_ImplOpenGL3_Init(GUI_GLSL_VERSION);
+ }
+
[[nodiscard]]
VertexArray* OpenGLContext::CreateVertexArray()
diff --git a/runtime/source/Drivers/OpenGL/OpenGLContext.h b/runtime/source/Drivers/OpenGL/OpenGLContext.h
index 190755f..ab0b849 100755
--- a/runtime/source/Drivers/OpenGL/OpenGLContext.h
+++ b/runtime/source/Drivers/OpenGL/OpenGLContext.h
@@ -37,6 +37,8 @@ namespace ERUNTIME_NAMESPACE
void Swap() final;
+ void InitGUI() final;
+
private:
Ref<Window> m_window;
SDL_GLContext m_context;
diff --git a/runtime/source/Drivers/SDL3/WindowSDL.cpp b/runtime/source/Drivers/SDL3/WindowSDL.cpp
index 927ec78..fd760c2 100755
--- a/runtime/source/Drivers/SDL3/WindowSDL.cpp
+++ b/runtime/source/Drivers/SDL3/WindowSDL.cpp
@@ -3,6 +3,9 @@
#include "Core/Assert.h"
#include "Core/EventSystem.h"
+#include <imgui.h>
+#include <imgui_impl_sdl3.h>
+
namespace ERUNTIME_NAMESPACE {
Window* Window::Create(const WindowSpecification& spec)
{
@@ -54,6 +57,7 @@ namespace ERUNTIME_NAMESPACE {
SDL_Event event;
while(SDL_PollEvent(&event))
{
+ ImGui_ImplSDL3_ProcessEvent(&event);
switch(event.type)
{
case SDL_EVENT_WINDOW_CLOSE_REQUESTED: {
diff --git a/runtime/source/ECS/Scene.cpp b/runtime/source/ECS/Scene.cpp
new file mode 100644
index 0000000..1778a5f
--- /dev/null
+++ b/runtime/source/ECS/Scene.cpp
@@ -0,0 +1,15 @@
+#include "ECS/Scene.h"
+
+namespace ERUNTIME_NAMESPACE {
+ Scene::Scene()
+ {
+ }
+
+ Scene::~Scene()
+ {
+ }
+
+ void Scene::OnTick(float deltaTime)
+ {
+ }
+}
\ No newline at end of file
diff --git a/runtime/source/GUI/Context.cpp b/runtime/source/GUI/Context.cpp
new file mode 100644
index 0000000..524e8fd
--- /dev/null
+++ b/runtime/source/GUI/Context.cpp
@@ -0,0 +1,61 @@
+#include "GUI/Context.h"
+#include "GUI/Window.h"
+
+#include <imgui.h>
+#include <imgui_impl_sdl3.h>
+#include <imgui_impl_opengl3.h>
+
+#include <SDL3/SDL.h>
+
+namespace ERUNTIME_NAMESPACE::GUI {
+ Context::Context(const Ref<::ERUNTIME_NAMESPACE::Context>& rendererContext)
+ {
+ IMGUI_CHECKVERSION();
+ ImGui::CreateContext();
+
+ 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
+ io.IniFilename = nullptr;
+
+ ImGui::StyleColorsDark();
+
+ ImGuiStyle& style = ImGui::GetStyle();
+
+ if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) {
+ style.WindowRounding = 0.0f;
+ style.Colors[ImGuiCol_WindowBg].w = 1.0f;
+ }
+
+ rendererContext->InitGUI();
+ }
+
+ Context::~Context()
+ {
+ ImGui_ImplOpenGL3_Shutdown();
+ ImGui_ImplSDL3_Shutdown();
+ ImGui::DestroyContext();
+ }
+
+ void Context::OnPreUpdate()
+ {
+ ImGui_ImplOpenGL3_NewFrame();
+ ImGui_ImplSDL3_NewFrame();
+ ImGui::NewFrame();
+
+ for(auto it = m_windows.begin(); it != m_windows.end(); it++) {
+ (*it)->BeginRender();
+ }
+ }
+
+ void Context::OnPostRender()
+ {
+ for(auto it = m_windows.rbegin(); it != m_windows.rend(); it++) {
+ (*it)->EndRender();
+ }
+ ImGui::Render();
+ ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+ }
+}
\ No newline at end of file
diff --git a/runtime/source/GUI/Window.cpp b/runtime/source/GUI/Window.cpp
new file mode 100644
index 0000000..f1563cd
--- /dev/null
+++ b/runtime/source/GUI/Window.cpp
@@ -0,0 +1,37 @@
+#include "GUI/Window.h"
+
+#include <imgui.h>
+
+namespace ERUNTIME_NAMESPACE::GUI {
+ Window::Window(const String& name)
+ : k_name(name), m_show(false), m_isOpen(false)
+ {
+ }
+
+ void Window::Show()
+ {
+ m_show = true;
+ }
+
+ void Window::Hide()
+ {
+ m_show = false;
+ }
+
+ void Window::BeginRender()
+ {
+ if(m_show) {
+ m_isOpen = m_show;
+ ImGui::Begin(GetName().c_str(), &m_isOpen);
+ }
+ }
+
+ void Window::EndRender()
+ {
+ if(m_show) {
+ this->Draw();
+ ImGui::End();
+ m_show = m_isOpen;
+ }
+ }
+}
\ No newline at end of file
diff --git a/source/main.cpp b/source/main.cpp
index 46ebdf4..6029ef6 100755
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -5,6 +5,8 @@
#include <Core/EntryPoint.h>
+#include <GUI/Window.h>
+
using namespace ERUNTIME_NAMESPACE;
static auto g_VBoxSpec = ApplicationSpecification {
@@ -17,15 +19,28 @@ static auto g_VBoxSpec = ApplicationSpecification {
},
};
+class ConsoleWindow : public GUI::Window {
+public:
+ ConsoleWindow()
+ : GUI::Window("Console")
+ {
+ // Show window at startup
+ Show();
+ }
+
+ void Draw() final
+ {
+ }
+};
+
class VBoxApplication : public Application {
public:
VBoxApplication()
: Application(g_VBoxSpec)
{
Logger::Instance().AddSink(CreateScope<StdoutLogSink>());
-
- Debug::Error(LogCategory::IO, "Failed to read file!");
- EX_LOG(Error, LogCategory::IO, "Failed to read file!");
+
+ GetGUIContext().CreateWindow<ConsoleWindow>();
}
~VBoxApplication()
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index 35ba50f..31ad16f 100755
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -1,5 +1,48 @@
+# ---------------------------------------------------------------------
+# GLAD
+# ---------------------------------------------------------------------
add_library(glad glad/src/glad.c)
set_target_properties(glad PROPERTIES POSITION_INDEPENDENT_CODE ON)
-target_include_directories(glad PUBLIC glad/include)
\ No newline at end of file
+target_include_directories(glad PUBLIC glad/include)
+
+# ---------------------------------------------------------------------
+# ImGUI (Docking Branch)
+# ---------------------------------------------------------------------
+add_library(imgui)
+
+set_target_properties(imgui PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
+target_include_directories(imgui PUBLIC
+ imgui-docking
+ imgui-docking/misc/cpp
+ imgui-docking/backends)
+
+file(
+ GLOB
+ IMGUI_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/imgui.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/imgui_draw.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/imgui_demo.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/imgui_tables.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/imgui_widgets.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/misc/cpp/imgui_stdlib.cpp
+)
+
+file(
+ GLOB
+ IMGUI_SDL_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/backends/imgui_impl_sdl3.cpp
+)
+
+file(
+ GLOB
+ IMGUI_OPENGL_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/imgui-docking/backends/imgui_impl_opengl3.cpp
+)
+
+target_sources(imgui PRIVATE
+ ${IMGUI_SOURCES}
+ ${IMGUI_SDL_SOURCES}
+ ${IMGUI_OPENGL_SOURCES})
\ No newline at end of file
diff --git a/third-party/imgui-docking/.editorconfig b/third-party/imgui-docking/.editorconfig
new file mode 100644
index 0000000..5adfefa
--- /dev/null
+++ b/third-party/imgui-docking/.editorconfig
@@ -0,0 +1,28 @@
+# See http://editorconfig.org to read about the EditorConfig format.
+# - In theory automatically supported by VS2017+ and most common IDE or text editors.
+# - In practice VS2019-VS2022 stills don't trim trailing whitespaces correctly :(
+# - Suggest installing this to trim whitespaces:
+# GitHub https://github.com/madskristensen/TrailingWhitespace
+# VS2019 https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespaceVisualizer
+# VS2022 https://marketplace.visualstudio.com/items?itemName=MadsKristensen.TrailingWhitespace64
+# (in spite of its name doesn't only visualize but also trims)
+# - Alternative for older VS2010 to VS2015: https://marketplace.visualstudio.com/items?itemName=EditorConfigTeam.EditorConfig
+
+# top-most EditorConfig file
+root = true
+
+# Default settings:
+# Use 4 spaces as indentation
+[*]
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[imstb_*]
+indent_size = 3
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
+indent_size = 4
diff --git a/third-party/imgui-docking/.gitattributes b/third-party/imgui-docking/.gitattributes
new file mode 100644
index 0000000..d48470e
--- /dev/null
+++ b/third-party/imgui-docking/.gitattributes
@@ -0,0 +1,30 @@
+* text=auto
+
+*.c text
+*.cpp text
+*.h text
+*.m text
+*.mm text
+*.md text
+*.txt text
+*.html text
+*.bat text
+*.frag text
+*.vert text
+*.mkb text
+*.icf text
+
+*.sln text eol=crlf
+*.vcxproj text eol=crlf
+*.vcxproj.filters text eol=crlf
+*.natvis text eol=crlf
+
+Makefile text eol=lf
+*.sh text eol=lf
+*.pbxproj text eol=lf
+*.storyboard text eol=lf
+*.plist text eol=lf
+
+*.png binary
+*.ttf binary
+*.lib binary
diff --git a/third-party/imgui-docking/.github/FUNDING.yml b/third-party/imgui-docking/.github/FUNDING.yml
new file mode 100644
index 0000000..df7d709
--- /dev/null
+++ b/third-party/imgui-docking/.github/FUNDING.yml
@@ -0,0 +1 @@
+custom: ['https://github.com/ocornut/imgui/wiki/Funding']
diff --git a/third-party/imgui-docking/.github/ISSUE_TEMPLATE/config.yml b/third-party/imgui-docking/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..3ba13e0
--- /dev/null
+++ b/third-party/imgui-docking/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/third-party/imgui-docking/.github/ISSUE_TEMPLATE/issue_template.yml b/third-party/imgui-docking/.github/ISSUE_TEMPLATE/issue_template.yml
new file mode 100644
index 0000000..6ed6249
--- /dev/null
+++ b/third-party/imgui-docking/.github/ISSUE_TEMPLATE/issue_template.yml
@@ -0,0 +1,92 @@
+name: "Ask a question, report a bug, request a feature, etc."
+description: "Ask any question, discuss best practices, report a bug, request a feature."
+body:
+ - type: markdown
+ attributes:
+ value: |
+ FOR FIRST-TIME USERS ISSUES COMPILING/LINKING/RUNNING, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions)
+ For anything else: **we are happy to use 'GitHub Issues' for many types of open-ended questions**. We are encouraging 'Issues' becoming a large, centralized, tagged, cross-referenced database of Dear ImGui contents.
+
+ Be mindful that messages are being sent to the e-mail box of "Watching" users. Try to proof-read your messages before sending them. Edits are not seen by those users.
+
+ **If you are using Dear ImGui as part of a job that you are being well-paid for** and your company is not a sponsor. Please be mindful that this is a Free Software and you might be about to ask volunteers to help you doing your job. Please put extra effort describing your issue or question properly. If your company is wealthy, please read [Funding](https://github.com/ocornut/imgui/wiki/Funding) and consider getting in touch.
+ - type: markdown
+ attributes:
+ value: |
+ **Prerequisites:**
+ - I have read [Frequently Asked Questions](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md).
+ - I have read [Contributing Guidelines -> General Advices](https://github.com/ocornut/imgui/blob/master/docs/CONTRIBUTING.md#getting-started--general-advice).
+ - I have read [Contributing Guidelines -> How to open an Issue](https://github.com/ocornut/imgui/blob/master/docs/CONTRIBUTING.md#how-to-open-an-issue).
+ - I have searched [Github Issues and PR](https://github.com/ocornut/imgui/issues?q=) for discussion of similar topics.
+
+ ----
+ - type: input
+ id: specs_version
+ attributes:
+ label: "Version/Branch of Dear ImGui:"
+ description: "(please specify if you have made substantial modifications to your copy)"
+ value: "Version 1.XX, Branch: XXX (master/docking/etc.)"
+ placeholder: "Version 1.XX, Branch: XXX (master/docking/etc.)"
+ validations:
+ required: true
+ - type: input
+ id: specs_backend
+ attributes:
+ label: "Back-ends:"
+ description: (or specify when using custom engine/back-ends)
+ value: "imgui_impl_XXX.cpp + imgui_impl_XXX.cpp"
+ placeholder: "imgui_impl_XXX.cpp + imgui_impl_XXX.cpp or n/a"
+ validations:
+ required: true
+ - type: input
+ id: specs_compiler_os
+ attributes:
+ label: "Compiler, OS:"
+ placeholder: "e.g. Windows 11 + MSVC 2022, macOS + Clang 12, Linux + GCC etc."
+ validations:
+ required: true
+ - type: textarea
+ id: specs_full
+ attributes:
+ label: "Full config/build information:"
+ placeholder: |
+ (If you can run, you may go to 'Demo->Tools->About Dear ImGui->Config/Build Info' to obtain detailed information that you can paste here)
+ validations:
+ required: false
+ - type: textarea
+ id: issue_description
+ attributes:
+ label: "Details:"
+ description: "Try to be explicit with your goals, your expectations and what you have tried. Be mindful of [The XY Problem](https://xyproblem.info). What you have in mind or in your code is not obvious to other people. People frequently discuss problems and suggest incorrect solutions without first clarifying their goals. When requesting a new feature, please describe the usage context (how you intend to use it, why you need it, etc.). If you tried something and it failed, show us what you tried. If you are reporting a bug, explain what's the bug, how does it occur, etc. If you are reporting a crash, please include a debugger callstack."
+ value: |
+ **My Issue/Question:**
+
+ XXX _(please provide as much context as possible)_
+ validations:
+ required: true
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: "Screenshots/Video:"
+ description: "Attach screenshots or gif/videos to clarify the context. They often convey useful information that is omitted by the description."
+ placeholder: "(You can drag files here)"
+ validations:
+ required: false
+ - type: textarea
+ id: repro_code
+ attributes:
+ label: "Minimal, Complete and Verifiable Example code:"
+ description: "Provide an [MCVE](https://stackoverflow.com/help/mcve) to demonstrate your problem. An ideal submission includes a small piece of code that anyone can paste into one of the examples applications (examples/*/main.cpp) or the demo (imgui_demo.cpp) to understand and reproduce it. Narrowing your problem to its shortest and purest form is the easiest way to understand it, explain it and fix it. Please test your shortened code to ensure it exhibits the problem. Often while creating the MCVE you will solve the problem! Many questions that are missing a standalone verifiable example are missing the actual cause of their issue in the description, which ends up wasting everyone's time."
+ value: |
+ ```cpp
+ // Here's some code anyone can copy and paste to reproduce your issue
+ ImGui::Begin("Example Bug");
+ MoreCodeToExplainMyIssue();
+ ImGui::End();
+ ```
+ validations:
+ required: false
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for taking the time to read prerequisites, filling this template and double-checking your message and your code!
diff --git a/third-party/imgui-docking/.github/pull_request_template.md b/third-party/imgui-docking/.github/pull_request_template.md
new file mode 100644
index 0000000..d40b14c
--- /dev/null
+++ b/third-party/imgui-docking/.github/pull_request_template.md
@@ -0,0 +1,10 @@
+(Click "Preview" to turn any http URL into a clickable link)
+
+1. PLEASE CAREFULLY READ: [Contributing Guidelines](https://github.com/ocornut/imgui/blob/master/docs/CONTRIBUTING.md)
+
+2. **Make sure you're using a special branch just for this pull request**. (In git, 1 PR = 1 branch. If you update the branch the PR will be updated.)
+
+3. Consider running the [imgui_test_suite](https://github.com/ocornut/imgui_test_engine) or adding new tests to test for expected behaviors.
+
+4. Clear this template before submitting your PR.
+
diff --git a/third-party/imgui-docking/.github/workflows/build.yml b/third-party/imgui-docking/.github/workflows/build.yml
new file mode 100644
index 0000000..a4d3ed4
--- /dev/null
+++ b/third-party/imgui-docking/.github/workflows/build.yml
@@ -0,0 +1,793 @@
+name: build
+
+on:
+ push:
+ pull_request:
+ workflow_run:
+ # Use a workflow as a trigger of scheduled builds. Forked repositories can disable scheduled builds by disabling
+ # "scheduled" workflow, while maintaining ability to perform local CI builds.
+ workflows:
+ - scheduled
+ - manual
+ branches:
+ - master
+ - docking
+ types:
+ - requested
+
+jobs:
+ Build-Windows:
+ runs-on: windows-2025
+ name: Build - Windows
+
+ defaults:
+ run:
+ working-directory: ${{ github.workspace }}/imgui
+
+ env:
+ VS_PATH: C:\Program Files\Microsoft Visual Studio\18\Enterprise
+ MSBUILD_PATH: C:\Program Files\Microsoft Visual Studio\18\Enterprise\MSBuild\Current\Bin\
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: ${{ github.workspace }}/imgui
+
+ # The VulkanSDK libs for Windows is manually generated using build_windows_vulkan_libs.ps1 + attached to issue #8925.
+ # (we have a .yml workflow in commit history if it becomes ever useful to create this on CI too)
+ - name: Install Dependencies
+ shell: powershell
+ run: |
+ Invoke-WebRequest -Uri "https://www.libsdl.org/release/SDL2-devel-2.32.8-VC.zip" -OutFile "SDL2-devel-2.32.8-VC.zip"
+ Expand-Archive -Path SDL2-devel-2.32.8-VC.zip
+ echo "SDL2_DIR=$(pwd)\SDL2-devel-2.32.8-VC\SDL2-2.32.8\" >>${env:GITHUB_ENV}
+
+ Invoke-WebRequest -Uri "https://www.libsdl.org/release/SDL3-devel-3.2.18-VC.zip" -OutFile "SDL3-devel-3.2.18-VC.zip"
+ Expand-Archive -Path SDL3-devel-3.2.18-VC.zip
+ echo "SDL3_DIR=$(pwd)\SDL3-devel-3.2.18-VC\SDL3-3.2.18\" >>${env:GITHUB_ENV}
+
+ Invoke-WebRequest -Uri "https://github.com/user-attachments/files/22464296/vulkan_windows_libs_1.4.326.zip" -OutFile vulkan_windows_libs_1.4.326.zip
+ Expand-Archive -Path vulkan_windows_libs_1.4.326.zip
+ echo "VULKAN_SDK=$(pwd)\vulkan_windows_libs_1.4.326\" >>${env:GITHUB_ENV}
+
+ - name: Fix Projects
+ shell: powershell
+ run: |
+ # CI workers do not supporter older Visual Studio versions. Fix projects to target newer available version.
+ gci -recurse -filter "*.vcxproj" | ForEach-Object {
+ (Get-Content $_.FullName) -Replace "<PlatformToolset>v\d{3}</PlatformToolset>","<PlatformToolset>v143</PlatformToolset>" | Set-Content -Path $_.FullName
+ (Get-Content $_.FullName) -Replace "<WindowsTargetPlatformVersion>[\d\.]+</WindowsTargetPlatformVersion>",'<WindowsTargetPlatformVersion>$(LatestTargetPlatformVersion)</WindowsTargetPlatformVersion>' | Set-Content -Path $_.FullName
+ }
+
+ # Not using matrix here because it would inflate job count too much. Check out and setup is done for every job and that makes build times way too long.
+ - name: Build example_null (extra warnings, mingw 64-bit)
+ run: mingw32-make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build example_null (mingw 64-bit, as DLL)
+ shell: bash
+ run: |
+ echo '#define IMGUI_API __declspec(dllexport)' > example_single_file.cpp
+ echo '#define IMGUI_IMPLEMENTATION' >> example_single_file.cpp
+ echo '#include "misc/single_file/imgui_single_file.h"' >> example_single_file.cpp
+ g++ -I. -Wall -Wformat -shared -o libimgui.dll -Wl,--out-implib,libimgui.a example_single_file.cpp -limm32
+ g++ -I. -Wall -Wformat -DIMGUI_API='__declspec(dllimport)' -DIMGUI_IMPL_API= -o example_null.exe examples/example_null/main.cpp -L. -limgui
+ rm -f example_null.exe libimgui.* example_single_file.*
+
+ - name: Build example_null (extra warnings, msvc 64-bit)
+ shell: cmd
+ run: |
+ cd examples\example_null
+ call "%VS_PATH%\VC\Auxiliary\Build\vcvars64.bat"
+ .\build_win32.bat /W4
+
+ - name: Build example_null (single file build)
+ shell: bash
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -Wall -Wformat -o example_single_file.exe example_single_file.cpp -limm32
+
+ - name: Build example_null (with IMGUI_DISABLE_WIN32_FUNCTIONS)
+ shell: bash
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_WIN32_FUNCTIONS
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -Wall -Wformat -o example_single_file.exe example_single_file.cpp -limm32
+
+ - name: Build example_null (as DLL)
+ shell: cmd
+ run: |
+ call "%VS_PATH%\VC\Auxiliary\Build\vcvars64.bat"
+
+ echo #define IMGUI_API __declspec(dllexport) > example_single_file.cpp
+ echo #define IMGUI_IMPLEMENTATION >> example_single_file.cpp
+ echo #include "misc/single_file/imgui_single_file.h" >> example_single_file.cpp
+
+ cl.exe /D_USRDLL /D_WINDLL /I. example_single_file.cpp /LD /FeImGui.dll /link
+ cl.exe /DIMGUI_API=__declspec(dllimport) -DIMGUI_IMPL_API= /I. ImGui.lib /Feexample_null.exe examples/example_null/main.cpp
+
+ # Win64 examples are more frequently compilted than the Win32 examples.
+ # More of the Win32 examples requires 'workflow_run' to reduce waste.
+ - name: Build Win32 example_glfw_opengl2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_glfw_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_glfw_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl2_sdlrenderer2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl2_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl2_opengl2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl2_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+
+ - name: Build Win32 example_sdl2_directx11
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl3_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+
+ - name: Build Win32 example_sdl3_sdlgpu3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_sdlgpu3/example_sdl3_sdlgpu3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl3_sdlrenderer3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_sdl3_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_vulkan/example_sdl3_vulkan.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_win32_directx9
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx9/example_win32_directx9.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_win32_directx10
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx10/example_win32_directx10.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win32 example_win32_directx11
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx11/example_win32_directx11.vcxproj /p:Platform=Win32 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ # Windows 64-bits
+ - name: Build Win64 example_glfw_opengl2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_glfw_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_glfw_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_sdl2_sdlrenderer2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_sdl2_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_sdl2_opengl2
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_sdl2_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_sdl2_directx11
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_sdl3_opengl3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_sdl3_sdlgpu3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_sdlgpu3/example_sdl3_sdlgpu3.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_sdl3_sdlrenderer3
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_sdl3_vulkan
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_sdl3_vulkan/example_sdl3_vulkan.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_win32_directx9
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx9/example_win32_directx9.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_win32_directx10
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx10/example_win32_directx10.vcxproj /p:Platform=x64 /p:Configuration=Release'
+ if: github.event_name == 'workflow_run'
+
+ - name: Build Win64 example_win32_directx11
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx11/example_win32_directx11.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ - name: Build Win64 example_win32_directx12
+ shell: cmd
+ run: '"%MSBUILD_PATH%\MSBuild.exe" examples/example_win32_directx12/example_win32_directx12.vcxproj /p:Platform=x64 /p:Configuration=Release'
+
+ Build-Linux:
+ runs-on: ubuntu-latest
+ name: Build - Linux
+
+ defaults:
+ run:
+ working-directory: ${{ github.workspace }}/imgui
+
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: ${{ github.workspace }}/imgui
+
+ - name: Install Dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libglfw3-dev libsdl2-dev gcc-multilib g++-multilib libfreetype6-dev libvulkan-dev
+
+ - name: Build example_null (extra warnings, gcc 32-bit)
+ run: |
+ make -C examples/example_null clean
+ CXXFLAGS="$CXXFLAGS -m32 -Werror" make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build example_null (extra warnings, gcc 64-bit)
+ run: |
+ make -C examples/example_null clean
+ CXXFLAGS="$CXXFLAGS -m64 -Werror" make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build example_null (extra warnings, clang 32-bit)
+ run: |
+ make -C examples/example_null clean
+ CXXFLAGS="$CXXFLAGS -m32 -Werror" CXX=clang++ make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build example_null (extra warnings, clang 64-bit)
+ run: |
+ make -C examples/example_null clean
+ CXXFLAGS="$CXXFLAGS -m64 -Werror" CXX=clang++ make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build example_null (extra warnings, empty IM_ASSERT)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IM_ASSERT(x)
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -Wextra -Werror -Wno-zero-as-null-pointer-constant -Wno-double-promotion -Wno-variadic-macros -Wno-empty-body -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (freetype)
+ run: |
+ make -C examples/example_null clean
+ make -C examples/example_null WITH_FREETYPE=1
+
+ - name: Build example_null (single file build)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with ImWchar32)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_USE_WCHAR32
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with large ImDrawIdx + custom ImTextureID)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define ImTextureID void*
+ #define ImDrawIdx unsigned int
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ cat > example_single_file.cpp <<'EOF'
+
+ // Test build ImTextureID defined as a struct
+ struct SomeType { int a = 0; int b = 0; };
+ #define ImTextureID SomeType
+ #define ImTextureID_Invalid SomeType()
+ inline bool operator==(const SomeType& lhs, const SomeType& rhs) { return lhs.a == rhs.a && lhs.b == rhs.b; }
+ inline bool operator!=(const SomeType& lhs, const SomeType& rhs) { return lhs.a != rhs.a || lhs.b != rhs.b; }
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IMGUI_DISABLE_OBSOLETE_FUNCTIONS)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IMGUI_DISABLE_OBSOLETE_KEYIO)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_OBSOLETE_KEYIO
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with C++20)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_OBSOLETE_KEYIO
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++20 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IMGUI_DISABLE_DEMO_WINDOWS and IMGUI_DISABLE_DEBUG_TOOLS)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_DEMO_WINDOWS
+ #define IMGUI_DISABLE_DEBUG_TOOLS
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IMGUI_DISABLE_FILE_FUNCTIONS)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_DISABLE_FILE_FUNCTIONS
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IMGUI_USE_BGRA_PACKED_COLOR)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_USE_BGRA_PACKED_COLOR
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (with IM_VEC2_CLASS_EXTRA and IM_VEC4_CLASS_EXTRA)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ struct MyVec2 { float x; float y; MyVec2(float x, float y) : x(x), y(y) { } };
+ struct MyVec4 { float x; float y; float z; float w;
+ MyVec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) { } };
+ #define IM_VEC2_CLASS_EXTRA \
+ ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
+ operator MyVec2() const { return MyVec2(x, y); }
+ #define IM_VEC4_CLASS_EXTRA \
+ ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
+ operator MyVec4() const { return MyVec4(x, y, z, w); }
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ g++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (C++26, Clang)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #define IMGUI_DISABLE_DEMO_WINDOWS
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ clang++ -I. -std=c++26 -Wall -Wformat -fno-exceptions -fno-threadsafe-statics -lc -lm -o example_single_file example_single_file.cpp
+
+ - name: Build example_null (without c++ runtime, Clang)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #define IMGUI_DISABLE_DEMO_WINDOWS
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ clang++ -I. -std=c++11 -Wall -Wformat -nodefaultlibs -fno-rtti -fno-exceptions -fno-threadsafe-statics -lc -lm -o example_single_file example_single_file.cpp
+
+ - name: Build example_glfw_opengl2
+ run: make -C examples/example_glfw_opengl2
+
+ - name: Build example_glfw_opengl3
+ run: make -C examples/example_glfw_opengl3
+ if: github.event_name == 'workflow_run'
+
+ - name: Build example_sdl2_opengl2
+ run: make -C examples/example_sdl2_opengl2
+ if: github.event_name == 'workflow_run'
+
+ - name: Build example_sdl2_opengl3
+ run: make -C examples/example_sdl2_opengl3
+
+ - name: Build with IMGUI_IMPL_VULKAN_NO_PROTOTYPES
+ run: g++ -c -I. -std=c++11 -DIMGUI_IMPL_VULKAN_NO_PROTOTYPES=1 backends/imgui_impl_vulkan.cpp
+
+ Build-MacOS:
+ runs-on: macos-latest
+ name: Build - MacOS
+
+ defaults:
+ run:
+ working-directory: ${{ github.workspace }}/imgui
+
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: ${{ github.workspace }}/imgui
+
+ - name: Install Dependencies
+ run: |
+ brew install glfw3 sdl2 sdl3
+
+ - name: Build example_null (extra warnings, clang 64-bit)
+ run: make -C examples/example_null WITH_EXTRA_WARNINGS=1
+
+ - name: Build macOS example_null (single file build)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ clang++ -I. -std=c++11 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build macOS example_null (single file build, c++20)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ clang++ -I. -std=c++20 -Wall -Wformat -o example_single_file example_single_file.cpp
+
+ - name: Build macOS example_null (without c++ runtime)
+ run: |
+ cat > example_single_file.cpp <<'EOF'
+
+ #define IMGUI_IMPLEMENTATION
+ #include "misc/single_file/imgui_single_file.h"
+ #include "examples/example_null/main.cpp"
+
+ EOF
+ clang++ -I. -std=c++11 -Wall -Wformat -nodefaultlibs -fno-rtti -fno-exceptions -fno-threadsafe-statics -lc -lm -o example_single_file example_single_file.cpp
+
+ - name: Build macOS example_glfw_opengl2
+ run: make -C examples/example_glfw_opengl2
+ if: github.event_name == 'workflow_run'
+
+ - name: Build macOS example_glfw_opengl3
+ run: make -C examples/example_glfw_opengl3
+ if: github.event_name == 'workflow_run'
+
+ - name: Build macOS example_glfw_metal
+ run: make -C examples/example_glfw_metal
+
+ - name: Build macOS example_sdl2_metal
+ run: make -C examples/example_sdl2_metal
+
+ - name: Build macOS example_sdl2_opengl2
+ run: make -C examples/example_sdl2_opengl2
+ if: github.event_name == 'workflow_run'
+
+ - name: Build macOS example_sdl2_opengl3
+ run: make -C examples/example_sdl2_opengl3
+ if: github.event_name == 'workflow_run'
+
+ - name: Build macOS example_sdl3_opengl3
+ run: make -C examples/example_sdl3_opengl3
+
+ - name: Build macOS example_apple_metal
+ run: xcodebuild -project examples/example_apple_metal/example_apple_metal.xcodeproj -target example_apple_metal_macos
+ if: github.event_name == 'workflow_run'
+
+ - name: Build macOS example_apple_opengl2
+ run: xcodebuild -project examples/example_apple_opengl2/example_apple_opengl2.xcodeproj -target example_osx_opengl2
+ if: github.event_name == 'workflow_run'
+
+ Build-iOS:
+ runs-on: macos-14
+ name: Build - iOS
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Build example_apple_metal
+ run: |
+ # Code signing is required, but we disable it because it is irrelevant for CI builds.
+ xcodebuild -project examples/example_apple_metal/example_apple_metal.xcodeproj -target example_apple_metal_ios CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
+
+ Build-Emscripten:
+ runs-on: ubuntu-latest
+ name: Build - Emscripten
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Install Dependencies
+ run: |
+ wget -q https://github.com/emscripten-core/emsdk/archive/master.tar.gz
+ tar -xvf master.tar.gz
+ emsdk-master/emsdk update
+ emsdk-master/emsdk install latest
+ emsdk-master/emsdk activate latest
+ sudo apt-get install build-essential
+
+ - name: Build example_sdl2_opengl3 with Emscripten
+ run: |
+ pushd emsdk-master
+ source ./emsdk_env.sh
+ popd
+ make -C examples/example_sdl2_opengl3 -f Makefile.emscripten
+
+ # This build compiles example_glfw_wgpu using Makefile.emscripten and Emscripten GLFW built-in implementation (-sUSE_GLFW=3)
+ # This ensures 2 things: the make build works, and the GLFW built-in implementation is tested
+ - name: Build example_glfw_wgpu with Emscripten/Makefile
+ run: |
+ pushd emsdk-master
+ source ./emsdk_env.sh
+ popd
+ make -C examples/example_glfw_wgpu -f Makefile.emscripten
+
+ # This build compiles example_glfw_wgpu using CMakeLists.txt and Emscripten GLFW contrib port (--use-port=contrib.glfw3)
+ # This ensures 2 things: the CMake build works, and the GLFW contrib port is tested
+ - name: Build example_glfw_wgpu with Emscripten/CMake
+ run: |
+ pushd emsdk-master
+ source ./emsdk_env.sh
+ popd
+ emcc -v
+ emcmake cmake -B build -DCMAKE_BUILD_TYPE=Release examples/example_glfw_wgpu
+ cmake --build build
+
+ Build-Android:
+ runs-on: ubuntu-latest
+ name: Build - Android
+
+ steps:
+ - uses: actions/checkout@v6
+
+ - name: Build example_android_opengl3
+ run: |
+ cd examples/example_android_opengl3/android
+ gradle assembleDebug --stacktrace
+
+ Test-Windows:
+ runs-on: windows-2025
+ name: Test - Windows
+
+ defaults:
+ run:
+ working-directory: ${{ github.workspace }}/imgui
+
+ env:
+ MSBUILD_PATH: C:\Program Files\Microsoft Visual Studio\18\Enterprise\MSBuild\Current\Bin\
+
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: ${{ github.workspace }}/imgui
+
+ - uses: actions/checkout@v6
+ continue-on-error: true
+ with:
+ fetch-depth: 1
+ repository: ocornut/imgui_test_engine
+ path: ${{ github.workspace }}/imgui_test_engine
+ submodules: true
+
+ - name: Fix Tests Projects
+ shell: powershell
+ working-directory: ${{ github.workspace }}/imgui_test_engine
+ run: |
+ # WARNING: This will need updating if toolset/sdk change in project files!
+ gci -recurse -filter "*.vcxproj" | ForEach-Object {
+ # Fix SDK and toolset for most samples.
+ (Get-Content $_.FullName) -Replace "<PlatformToolset>v110</PlatformToolset>","<PlatformToolset>v142</PlatformToolset>" | Set-Content -Path $_.FullName
+ (Get-Content $_.FullName) -Replace "<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>","<WindowsTargetPlatformVersion>10.0.20348.0</WindowsTargetPlatformVersion>" | Set-Content -Path $_.FullName
+ # Fix SDK and toolset for samples that require newer SDK/toolset. At the moment it is only dx12.
+ (Get-Content $_.FullName) -Replace "<PlatformToolset>v140</PlatformToolset>","<PlatformToolset>v142</PlatformToolset>" | Set-Content -Path $_.FullName
+ (Get-Content $_.FullName) -Replace "<WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>","<WindowsTargetPlatformVersion>10.0.20348.0</WindowsTargetPlatformVersion>" | Set-Content -Path $_.FullName
+ }
+
+ - name: Build Tests
+ shell: cmd
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: '"%MSBUILD_PATH%\MSBuild.exe" imgui_test_suite.vcxproj /p:Platform=x64 /p:Configuration=Release /p:ClFlags=/WX -maxcpucount:%NUMBER_OF_PROCESSORS%'
+
+ - name: Run Tests
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: Release/imgui_test_suite.exe -nogui -nopause -v2 -ve4 tests
+
+ - name: Check for Docking
+ id: check_docking
+ shell: bash
+ working-directory: ${{ github.workspace }}/imgui
+ run: echo "has_dock=$(grep -q "#define IMGUI_HAS_DOCK" imgui.h && echo true || echo false)" >> $GITHUB_OUTPUT
+
+ - name: Run Viewport Tests
+ if: steps.check_docking.outputs.has_dock == 'true'
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: Release/imgui_test_suite.exe -nogui -nopause -v2 -ve4 -viewport-mock viewport
+
+ Test-Linux:
+ runs-on: ubuntu-latest
+ name: Test - Linux
+
+ defaults:
+ run:
+ working-directory: ${{ github.workspace }}/imgui
+
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ path: ${{ github.workspace }}/imgui
+
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 1
+ repository: ocornut/imgui_test_engine
+ path: ${{ github.workspace }}/imgui_test_engine
+ submodules: true
+
+ - name: Build Tests
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: make -j$(nproc)
+
+ - name: Run Tests
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: ./imgui_test_suite -nogui -nopause -v2 -ve4 tests
+
+ - name: Check for Docking
+ id: check_docking
+ working-directory: ${{ github.workspace }}/imgui
+ run: echo "has_dock=$(grep -q "#define IMGUI_HAS_DOCK" imgui.h && echo true || echo false)" >> $GITHUB_OUTPUT
+
+ - name: Run Viewport Tests
+ if: steps.check_docking.outputs.has_dock == 'true'
+ working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+ run: ./imgui_test_suite -nogui -nopause -v2 -ve4 -viewport-mock viewport
+
+# Test-MacOS:
+# runs-on: macos-latest
+# name: Test - MacOS
+#
+# defaults:
+# run:
+# working-directory: ${{ github.workspace }}/imgui
+#
+# steps:
+# - uses: actions/checkout@v6
+# with:
+# path: ${{ github.workspace }}/imgui
+#
+# - uses: actions/checkout@v6
+# with:
+# fetch-depth: 1
+# repository: ocornut/imgui_test_engine
+# path: ${{ github.workspace }}/imgui_test_engine
+# submodules: true
+#
+# - name: Build Tests
+# working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+# run: make -j$(nproc)
+#
+# - name: Run Tests
+# working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+# run: ./imgui_test_suite -nogui -nopause -v2 -ve4 tests
+#
+# - name: Check for Docking
+# id: check_docking
+# working-directory: ${{ github.workspace }}/imgui
+# run: echo "has_dock=$(grep -q "#define IMGUI_HAS_DOCK" imgui.h && echo true || echo false)" >> $GITHUB_OUTPUT
+#
+# - name: Run Viewport Tests
+# if: steps.check_docking.outputs.has_dock == 'true'
+# working-directory: ${{ github.workspace }}/imgui_test_engine/imgui_test_suite
+# run: ./imgui_test_suite -nogui -nopause -v2 -ve4 -viewport-mock viewport
diff --git a/third-party/imgui-docking/.github/workflows/build_windows_vulkan_libs.ps1 b/third-party/imgui-docking/.github/workflows/build_windows_vulkan_libs.ps1
new file mode 100644
index 0000000..6658f5b
--- /dev/null
+++ b/third-party/imgui-docking/.github/workflows/build_windows_vulkan_libs.ps1
@@ -0,0 +1,38 @@
+# This is current meant to be run manually, occasionally:
+# - Run then zip the contents of vulkanArtifact/ into e.g. vulkan_windows_libs_1.4.326
+# - Upload as an attachment to https://github.com/ocornut/imgui/pull/8925 then change filename in build.yml
+# - There is a build_windows_vulkan_libs.yml in commit history that we removed thinking this is run so rarely we don't need to pollute CI UI with it.
+
+# Set default vulkan version if none provided
+if (-not $env:VULKAN_TAG) { $env:VULKAN_TAG = "1.4.326" }
+
+# Create output folder
+mkdir vulkanArtifact
+
+# Download Vulkan Headers
+
+Invoke-WebRequest -Uri "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v$($env:VULKAN_TAG).zip" -OutFile Vulkan-Headers-$($env:VULKAN_TAG).zip
+Expand-Archive -Path Vulkan-Headers-$($env:VULKAN_TAG).zip
+
+# Copy Vulkan Headers to artifact folder
+
+cp -R Vulkan-Headers-$($env:VULKAN_TAG)\Vulkan-Headers-$($env:VULKAN_TAG)\include vulkanArtifact\Include
+
+# Download Vulkan Loader
+
+Invoke-WebRequest -Uri "https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/v$($env:VULKAN_TAG).zip" -OutFile Vulkan-Loader-$($env:VULKAN_TAG).zip
+Expand-Archive -Path Vulkan-Loader-$($env:VULKAN_TAG).zip
+
+# Build Vulkan Loader x64
+
+cmake -S Vulkan-Loader-$($env:VULKAN_TAG)\Vulkan-Loader-$($env:VULKAN_TAG) -B VulkanLoader-build64 -D UPDATE_DEPS=On -A x64
+cmake --build VulkanLoader-build64
+mkdir vulkanArtifact\Lib
+copy VulkanLoader-build64\loader\Debug\vulkan-1.lib vulkanArtifact\Lib
+
+# Build Vulkan Loader win32
+
+cmake -S Vulkan-Loader-$($env:VULKAN_TAG)\Vulkan-Loader-$($env:VULKAN_TAG) -B VulkanLoader-build32 -D UPDATE_DEPS=On -A Win32
+cmake --build VulkanLoader-build32
+mkdir vulkanArtifact\Lib32
+copy VulkanLoader-build32\loader\Debug\vulkan-1.lib vulkanArtifact\Lib32
diff --git a/third-party/imgui-docking/.github/workflows/manual.yml b/third-party/imgui-docking/.github/workflows/manual.yml
new file mode 100644
index 0000000..3c472f1
--- /dev/null
+++ b/third-party/imgui-docking/.github/workflows/manual.yml
@@ -0,0 +1,12 @@
+#
+# This is a dummy workflow used to trigger full builds manually.
+#
+name: manual
+
+on: workflow_dispatch
+
+jobs:
+ manual:
+ runs-on: ubuntu-latest
+ steps:
+ - run: exit 0
diff --git a/third-party/imgui-docking/.github/workflows/scheduled.yml b/third-party/imgui-docking/.github/workflows/scheduled.yml
new file mode 100644
index 0000000..2a08578
--- /dev/null
+++ b/third-party/imgui-docking/.github/workflows/scheduled.yml
@@ -0,0 +1,15 @@
+#
+# This is a dummy workflow used to trigger scheduled builds. Forked repositories most likely should disable this
+# workflow to avoid daily builds of inactive repositories.
+#
+name: scheduled
+
+on:
+ schedule:
+ - cron: '0 9 * * *'
+
+jobs:
+ scheduled:
+ runs-on: ubuntu-latest
+ steps:
+ - run: exit 0
diff --git a/third-party/imgui-docking/.github/workflows/static-analysis.yml b/third-party/imgui-docking/.github/workflows/static-analysis.yml
new file mode 100644
index 0000000..2956283
--- /dev/null
+++ b/third-party/imgui-docking/.github/workflows/static-analysis.yml
@@ -0,0 +1,46 @@
+name: static-analysis
+
+on:
+ workflow_run:
+ # Perform static analysis together with build workflow. Build triggers of "build" workflow do not need to be repeated here.
+ workflows:
+ - build
+ types:
+ - requested
+
+jobs:
+ PVS-Studio:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 1
+
+ - name: Install Dependencies
+ env:
+ # The Secret variable setup in GitHub must be in format: "name_or_email key", on a single line
+ PVS_STUDIO_LICENSE: ${{ secrets.PVS_STUDIO_LICENSE }}
+ run: |
+ if [[ "$PVS_STUDIO_LICENSE" != "" ]];
+ then
+ wget -q https://files.viva64.com/etc/pubkey.txt
+ sudo apt-key add pubkey.txt
+ sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.viva64.com/etc/viva64.list
+ sudo apt-get update
+ sudo apt-get install -y pvs-studio
+ pvs-studio-analyzer credentials -o pvs-studio.lic $PVS_STUDIO_LICENSE
+ fi
+
+ - name: PVS-Studio static analysis
+ run: |
+ if [[ ! -f pvs-studio.lic ]];
+ then
+ echo "PVS Studio license is missing. No analysis will be performed."
+ echo "If you have a PVS Studio license please create a project secret named PVS_STUDIO_LICENSE with your license."
+ echo "You may use a free license. More information at https://www.viva64.com/en/b/0457/"
+ exit 0
+ fi
+ cd examples/example_null
+ pvs-studio-analyzer trace -- make WITH_EXTRA_WARNINGS=1
+ pvs-studio-analyzer analyze -e ../../imstb_rectpack.h -e ../../imstb_textedit.h -e ../../imstb_truetype.h -l ../../pvs-studio.lic -o pvs-studio.log
+ plog-converter -a 'GA:1,2;OP:1' -d V1071 -t errorfile -w pvs-studio.log
diff --git a/third-party/imgui-docking/.gitignore b/third-party/imgui-docking/.gitignore
new file mode 100644
index 0000000..a8b4e38
--- /dev/null
+++ b/third-party/imgui-docking/.gitignore
@@ -0,0 +1,78 @@
+## Misc artifacts
+.DS_Store
+.claude
+.vscode
+
+## Dear ImGui artifacts
+imgui.ini
+imgui*.ini
+
+## General build artifacts
+*.o
+*.obj
+*.exe
+examples/*/Debug/*
+examples/*/Release/*
+examples/*/x64/*
+examples/*.tmp
+
+## Visual Studio artifacts
+.vs
+ipch
+*.opensdf
+*.log
+*.pdb
+*.ilk
+*.user
+*.sdf
+*.suo
+*.VC.db
+*.VC.VC.opendb
+
+## Getting files created in JSON/Schemas/Catalog/ from a VS2022 update
+JSON/
+
+## Commonly used CMake directories & CMake CPM cache
+build*/
+.cache
+
+## Xcode & macOS artifacts
+project.xcworkspace
+xcuserdata
+examples/*/*.dSYM
+
+## Emscripten artifacts
+examples/*.o.tmp
+examples/*.out.js
+examples/*.out.wasm
+examples/example_glfw_opengl3/web/*
+examples/example_glfw_wgpu/web/*
+examples/example_glfw_wgpu/external/*
+examples/example_sdl2_opengl3/web/*
+examples/example_sdl2_wgpu/web/*
+examples/example_sdl3_opengl3/web/*
+examples/example_sdl3_wgpu/web/*
+
+## JetBrains IDE artifacts
+.idea
+cmake-build-*
+
+## Unix executables from our example Makefiles
+examples/example_apple_metal/example_apple_metal
+examples/example_apple_opengl2/example_apple_opengl2
+examples/example_glfw_metal/example_glfw_metal
+examples/example_glfw_opengl2/example_glfw_opengl2
+examples/example_glfw_opengl3/example_glfw_opengl3
+examples/example_glfw_vulkan/example_glfw_vulkan
+examples/example_glut_opengl2/example_glut_opengl2
+examples/example_null/example_null
+examples/example_sdl2_metal/example_sdl2_metal
+examples/example_sdl2_opengl2/example_sdl2_opengl2
+examples/example_sdl2_opengl3/example_sdl2_opengl3
+examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2
+examples/example_sdl2_vulkan/example_sdl2_vulkan
+examples/example_sdl3_metal/example_sdl3_metal
+examples/example_sdl3_opengl3/example_sdl3_opengl3
+examples/example_sdl3_sdlgpu3/example_sdl3_sdlgpu3
+examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3
+examples/example_sdl3_vulkan/example_sdl3_vulkan
diff --git a/third-party/imgui-docking/LICENSE.txt b/third-party/imgui-docking/LICENSE.txt
new file mode 100644
index 0000000..d5ba315
--- /dev/null
+++ b/third-party/imgui-docking/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2026 Omar Cornut
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the followin…
This reworks the way vulkan sdk is pulled, to hopefully simplify the burden of updating vulkan sdk
Also provide help for #8778
The general idea is to grab the minimal bits we need from the khronos repo with a specific tag. We only pull 2 things:
This treats the vulkan-header as the "vulkan sdk" folder, as it allow us to not have to copy out all the headers after unzip.
The loader require a minimal build to generate the .lib/dll required. This is done by just invoking cmake in the vulkan-load folder, and copying those out to the "vulkan sdk" folder.
For convenience, a $vulkanVersion is provided to target whatever release of the sdk we want to build against, and simplify the burden of updating.
Note: an initial attempt was done by pulling the sdk zip from lunarg, but that turned into a much longer download process, and there was issue unzipping the archive. This is way faster to just download the header/loader and use that for builds.