From 371c348f772349dfc61334d071e570705fdda9b4 Mon Sep 17 00:00:00 2001 From: Patrick Dawson Date: Tue, 19 Sep 2023 20:02:26 +0200 Subject: [PATCH] support ImGui 1.89.9 --- Dear ImGui for Godot Demo.csproj | 2 +- .../ImGuiGodot/Internal/CanvasRenderer.cs | 8 ++++---- addons/imgui-godot/ImGuiGodot/Internal/Fonts.cs | 3 +-- .../imgui-godot/ImGuiGodot/Internal/RdRenderer.cs | 12 ++++++------ .../ImGuiGodot/Internal/RdRendererThreadSafe.cs | 14 +++++++++----- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Dear ImGui for Godot Demo.csproj b/Dear ImGui for Godot Demo.csproj index baa96b3..849c5f4 100644 --- a/Dear ImGui for Godot Demo.csproj +++ b/Dear ImGui for Godot Demo.csproj @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/addons/imgui-godot/ImGuiGodot/Internal/CanvasRenderer.cs b/addons/imgui-godot/ImGuiGodot/Internal/CanvasRenderer.cs index ad85c45..2322db7 100644 --- a/addons/imgui-godot/ImGuiGodot/Internal/CanvasRenderer.cs +++ b/addons/imgui-godot/ImGuiGodot/Internal/CanvasRenderer.cs @@ -65,9 +65,9 @@ private void RenderOne(Rid vprid, ImDrawDataPtr drawData) // allocate our CanvasItem pool as needed int neededNodes = 0; - for (int i = 0; i < drawData.CmdListsCount; ++i) + for (int i = 0; i < drawData.CmdLists.Size; ++i) { - var cmdBuf = drawData.CmdListsRange[i].CmdBuffer; + var cmdBuf = drawData.CmdLists[i].CmdBuffer; neededNodes += cmdBuf.Size; for (int j = 0; j < cmdBuf.Size; ++j) { @@ -96,9 +96,9 @@ private void RenderOne(Rid vprid, ImDrawDataPtr drawData) drawData.ScaleClipRects(ImGui.GetIO().DisplayFramebufferScale); int nodeN = 0; - for (int n = 0; n < drawData.CmdListsCount; ++n) + for (int n = 0; n < drawData.CmdLists.Size; ++n) { - ImDrawListPtr cmdList = drawData.CmdListsRange[n]; + ImDrawListPtr cmdList = drawData.CmdLists[n]; int nVert = cmdList.VtxBuffer.Size; diff --git a/addons/imgui-godot/ImGuiGodot/Internal/Fonts.cs b/addons/imgui-godot/ImGuiGodot/Internal/Fonts.cs index a4e15d3..6cd0cf1 100644 --- a/addons/imgui-godot/ImGuiGodot/Internal/Fonts.cs +++ b/addons/imgui-godot/ImGuiGodot/Internal/Fonts.cs @@ -114,8 +114,7 @@ private static unsafe void ResetStyle() style.TabRounding = defaultStyle.TabRounding; style.TabMinWidthForCloseButton = defaultStyle.TabMinWidthForCloseButton; style.SeparatorTextPadding = defaultStyle.SeparatorTextPadding; - // TODO: 1.89.8 - // style.DockingSeparatorSize = defaultStyle.DockingSeparatorSize; + style.DockingSeparatorSize = defaultStyle.DockingSeparatorSize; style.DisplayWindowPadding = defaultStyle.DisplayWindowPadding; style.DisplaySafeAreaPadding = defaultStyle.DisplaySafeAreaPadding; style.MouseCursorScale = defaultStyle.MouseCursorScale; diff --git a/addons/imgui-godot/ImGuiGodot/Internal/RdRenderer.cs b/addons/imgui-godot/ImGuiGodot/Internal/RdRenderer.cs index 2b7c6ed..19ff59b 100644 --- a/addons/imgui-godot/ImGuiGodot/Internal/RdRenderer.cs +++ b/addons/imgui-godot/ImGuiGodot/Internal/RdRenderer.cs @@ -180,9 +180,9 @@ private void SetupBuffers(ImDrawDataPtr drawData) byte[] idxBuf = _bufPool.Rent(idxBufSize); int vertBufSize = drawData.TotalVtxCount * vertSize; byte[] vertBuf = _bufPool.Rent(vertBufSize); - for (int i = 0; i < drawData.CmdListsCount; ++i) + for (int i = 0; i < drawData.CmdLists.Size; ++i) { - ImDrawListPtr cmdList = drawData.CmdListsRange[i]; + ImDrawListPtr cmdList = drawData.CmdLists[i]; int vertBytes = cmdList.VtxBuffer.Size * vertSize; Marshal.Copy(cmdList.VtxBuffer.Data, vertBuf, globalVtxOffset, vertBytes); @@ -227,9 +227,9 @@ private void SetupBuffers(ImDrawDataPtr drawData) protected static void ReplaceTextureRids(ImDrawDataPtr drawData) { - for (int i = 0; i < drawData.CmdListsCount; ++i) + for (int i = 0; i < drawData.CmdLists.Size; ++i) { - ImDrawListPtr cmdList = drawData.CmdListsRange[i]; + ImDrawListPtr cmdList = drawData.CmdLists[i]; for (int cmdi = 0; cmdi < cmdList.CmdBuffer.Size; ++cmdi) { ImDrawCmdPtr drawCmd = cmdList.CmdBuffer[cmdi]; @@ -326,9 +326,9 @@ protected void RenderOne(Rid fb, ImDrawDataPtr drawData) int globalIdxOffset = 0; int globalVtxOffset = 0; - for (int i = 0; i < drawData.CmdListsCount; ++i) + for (int i = 0; i < drawData.CmdLists.Size; ++i) { - ImDrawListPtr cmdList = drawData.CmdListsRange[i]; + ImDrawListPtr cmdList = drawData.CmdLists[i]; for (int cmdi = 0; cmdi < cmdList.CmdBuffer.Size; ++cmdi) { diff --git a/addons/imgui-godot/ImGuiGodot/Internal/RdRendererThreadSafe.cs b/addons/imgui-godot/ImGuiGodot/Internal/RdRendererThreadSafe.cs index 4c83866..7a725b6 100644 --- a/addons/imgui-godot/ImGuiGodot/Internal/RdRendererThreadSafe.cs +++ b/addons/imgui-godot/ImGuiGodot/Internal/RdRendererThreadSafe.cs @@ -14,6 +14,9 @@ internal sealed class ClonedDrawData : IDisposable public unsafe ClonedDrawData(ImDrawDataPtr inp) { + // deep swap is difficult because ImGui still owns the draw lists + // TODO: revisit when Godot's threaded renderer is stable + long ddsize = Marshal.SizeOf(); // start with a shallow copy @@ -21,10 +24,12 @@ public unsafe ClonedDrawData(ImDrawDataPtr inp) Buffer.MemoryCopy(inp.NativePtr, Data.NativePtr, ddsize, ddsize); // clone the draw data - Data.NativePtr->CmdLists = (ImDrawList**)ImGui.MemAlloc((uint)(Marshal.SizeOf() * inp.CmdListsCount)); - for (int i = 0; i < inp.CmdListsCount; ++i) + int numLists = inp.CmdLists.Size; + IntPtr cmdListPtrs = ImGui.MemAlloc((uint)(Marshal.SizeOf() * numLists)); + Data.NativePtr->CmdLists = new ImVector(numLists, numLists, cmdListPtrs); + for (int i = 0; i < inp.CmdLists.Size; ++i) { - Data.NativePtr->CmdLists[i] = inp.CmdListsRange[i].CloneOutput().NativePtr; + Data.CmdLists[i] = (IntPtr)inp.CmdLists[i].CloneOutput().NativePtr; } } @@ -35,9 +40,8 @@ public unsafe void Dispose() for (int i = 0; i < Data.CmdListsCount; ++i) { - Data.CmdListsRange[i].Destroy(); + Data.CmdLists[i].Destroy(); } - ImGui.MemFree(Data.CmdLists); Data.Destroy(); Data = new(null); }