diff --git a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf index 856b481..d2da850 100644 --- a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf +++ b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf @@ -71,13 +71,6 @@ namespace GlitchyEditor.EditWindows _hasFocus = ImGui.IsWindowFocused(); var viewportSize = ImGui.GetContentRegionAvail(); - - if(oldViewportSize != viewportSize) - { - ViewportSizeChangedEvent.Invoke(this, *(Vector2*)&oldViewportSize); - viewPortChanged = true; - oldViewportSize = viewportSize; - } if(_renderTarget != null) { @@ -85,6 +78,13 @@ namespace GlitchyEditor.EditWindows } ImGui.End(); + + if(oldViewportSize != viewportSize) + { + ViewportSizeChangedEvent.Invoke(this, *(Vector2*)&oldViewportSize); + viewPortChanged = true; + oldViewportSize = viewportSize; + } } } } diff --git a/GlitchyEngine/src/ImGui/ImGuiExtension.bf b/GlitchyEngine/src/ImGui/ImGuiExtension.bf index 2b73b3d..97e484d 100644 --- a/GlitchyEngine/src/ImGui/ImGuiExtension.bf +++ b/GlitchyEngine/src/ImGui/ImGuiExtension.bf @@ -20,5 +20,8 @@ namespace ImGui public static extern void Image(Texture2D texture, Vec2 size, Vec2 uv0 = Vec2.Zero, Vec2 uv1 = Vec2.Ones, Vec4 tint_col = Vec4.Ones, Vec4 border_col = Vec4.Zero); // Wouldn't be necesseary if RenderTarget2D was Texture2D public static extern void Image(RenderTarget2D texture, Vec2 size, Vec2 uv0 = Vec2.Zero, Vec2 uv1 = Vec2.Ones, Vec4 tint_col = Vec4.Ones, Vec4 border_col = Vec4.Zero); + + /// Releases references that accumulated calls like ImGui::Image + protected internal static extern void CleanupFrame(); } } diff --git a/GlitchyEngine/src/ImGui/ImGuiLayer.bf b/GlitchyEngine/src/ImGui/ImGuiLayer.bf index d2352e9..4934783 100644 --- a/GlitchyEngine/src/ImGui/ImGuiLayer.bf +++ b/GlitchyEngine/src/ImGui/ImGuiLayer.bf @@ -2,6 +2,8 @@ using System; using ImGui; using GlitchyEngine.Events; +using internal ImGui; + namespace GlitchyEngine.ImGui { public class ImGuiLayer : Layer @@ -207,6 +209,8 @@ namespace GlitchyEngine.ImGui ImGui.Render(); ImGuiImplDX11.RenderDrawData(ImGui.GetDrawData()); + ImGui.CleanupFrame(); + if(io.ConfigFlags.HasFlag(.ViewportsEnable)) { ImGui.UpdatePlatformWindows(); diff --git a/GlitchyEngine/src/Platform/DX11/ImGui/ImGui.bf b/GlitchyEngine/src/Platform/DX11/ImGui/ImGui.bf index 9946010..51dbe2c 100644 --- a/GlitchyEngine/src/Platform/DX11/ImGui/ImGui.bf +++ b/GlitchyEngine/src/Platform/DX11/ImGui/ImGui.bf @@ -1,4 +1,6 @@ using GlitchyEngine.Renderer; +using System.Collections; +using DirectX.D3D11; namespace ImGui { @@ -6,14 +8,32 @@ namespace ImGui extension ImGui { + static List _resourceViews = new .() ~ delete _; + public static override void Image(Texture2D texture, Vec2 size, Vec2 uv0 = Vec2.Zero, Vec2 uv1 = Vec2.Ones, Vec4 tint_col = Vec4.Ones, Vec4 border_col = Vec4.Zero) { - ImGui.Image(texture.nativeResourceView, size, uv0, uv1, tint_col, border_col); + var view = texture.nativeResourceView..AddRef(); + _resourceViews.Add(view); + + ImGui.Image(view, size, uv0, uv1, tint_col, border_col); } public static override void Image(RenderTarget2D texture, Vec2 size, Vec2 uv0 = Vec2.Zero, Vec2 uv1 = Vec2.Ones, Vec4 tint_col = Vec4.Ones, Vec4 border_col = Vec4.Zero) { - ImGui.Image(texture._nativeResourceView, size, uv0, uv1, tint_col, border_col); + var view = texture._nativeResourceView..AddRef(); + _resourceViews.Add(view); + + ImGui.Image(view, size, uv0, uv1, tint_col, border_col); + } + + protected internal static override void CleanupFrame() + { + for(var view in _resourceViews) + { + view.Release(); + } + + _resourceViews.Clear(); } } }