working on window handling
This commit is contained in:
parent
2c839d8fad
commit
42b978e8c9
@ -19,7 +19,6 @@ public static class Engine
|
||||
private static Stopwatch gameTimer;
|
||||
private static long previousTicks = 0;
|
||||
private static TimeSpan accumulatedUpdateTime = TimeSpan.Zero;
|
||||
|
||||
private static TimeSpan accumulatedDrawTime = TimeSpan.Zero;
|
||||
|
||||
// must be a power of 2 so we can do a bitmask optimization when checking worst case
|
||||
@ -65,6 +64,10 @@ internal static void Run(string[] args)
|
||||
throw new Exception("Failed to claim window");
|
||||
}
|
||||
|
||||
MainWindow.OnCloseEvent += (w) => {
|
||||
quit = true;
|
||||
};
|
||||
|
||||
AudioDevice = new AudioDevice();
|
||||
|
||||
Controller = new Gui.GuiController(GraphicsDevice, MainWindow, Color.DarkOliveGreen);
|
||||
|
@ -37,7 +37,8 @@ internal class GuiController : IDisposable
|
||||
private readonly Shader imGuiFragmentShader;
|
||||
private readonly Sampler imGuiSampler;
|
||||
private readonly GuiTextureStorage textureStorage = new GuiTextureStorage();
|
||||
private readonly Dictionary<Window, GCHandle> windows = new Dictionary<Window, GCHandle>(16);
|
||||
private readonly Dictionary<Window, GCHandle> windowToHandle = new Dictionary<Window, GCHandle>(16);
|
||||
private readonly Dictionary<ImGuiViewportPtr, Window> imguiToWindow = new Dictionary<ImGuiViewportPtr, Window>(16);
|
||||
|
||||
private Texture fontTexture = null;
|
||||
private uint vertexCount = 0;
|
||||
@ -49,7 +50,6 @@ internal class GuiController : IDisposable
|
||||
public GuiController(GraphicsDevice graphicsDevice, Window mainWindow, Color clearColor, ImGuiConfigFlags configFlags = ImGuiConfigFlags.NavEnableKeyboard | ImGuiConfigFlags.DockingEnable | ImGuiConfigFlags.ViewportsEnable)
|
||||
{
|
||||
this.mainWindow = mainWindow;
|
||||
this.graphicsDevice = graphicsDevice;
|
||||
this.clearColor = clearColor;
|
||||
|
||||
resourceUploader = new ResourceUploader(graphicsDevice);
|
||||
@ -100,7 +100,6 @@ public GuiController(GraphicsDevice graphicsDevice, Window mainWindow, Color cle
|
||||
BuildFontAtlas();
|
||||
|
||||
io.ConfigFlags = configFlags;
|
||||
//io.MouseDrawCursor = true;
|
||||
|
||||
if (!OperatingSystem.IsWindows())
|
||||
{
|
||||
@ -167,11 +166,6 @@ public void Update(float deltaTime)
|
||||
|
||||
OnGui?.Invoke();
|
||||
|
||||
{ // Debug
|
||||
ImGuiIOPtr io = ImGui.GetIO();
|
||||
ImGui.Text($"mouse pos: {io.MousePos}");
|
||||
}
|
||||
|
||||
ImGui.EndFrame();
|
||||
}
|
||||
|
||||
@ -557,21 +551,21 @@ private void CreateWindow(ImGuiViewportPtr vp)
|
||||
|
||||
private void DestroyWindow(ImGuiViewportPtr vp)
|
||||
{
|
||||
if (vp.PlatformUserData == IntPtr.Zero) return;
|
||||
//Window window = (Window)GCHandle.FromIntPtr(vp.PlatformUserData).Target;
|
||||
|
||||
Window window = (Window)GCHandle.FromIntPtr(vp.PlatformUserData).Target;
|
||||
if(imguiToWindow.TryGetValue(vp, out Window window))
|
||||
{
|
||||
graphicsDevice.UnclaimWindow(window);
|
||||
|
||||
if (windows.TryGetValue(window, out GCHandle handle))
|
||||
if (windowToHandle.TryGetValue(window, out GCHandle handle))
|
||||
{
|
||||
handle.Free();
|
||||
windows.Remove(window);
|
||||
windowToHandle.Remove(window);
|
||||
}
|
||||
|
||||
//graphicsDevice.Wait();
|
||||
imguiToWindow.Remove(vp);
|
||||
window.Dispose();
|
||||
|
||||
vp.PlatformUserData = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
private void AddWindow(Window window, ImGuiViewportPtr vp, GCHandle handle)
|
||||
@ -592,14 +586,12 @@ private void AddWindow(Window window, ImGuiViewportPtr vp, GCHandle handle)
|
||||
for (int i = 0; i < platformIO.Viewports.Capacity; i++)
|
||||
{
|
||||
ImGuiViewportPtr vp = platformIO.Viewports[i];
|
||||
if(win == (Window)GCHandle.FromIntPtr(vp.PlatformUserData).Target)
|
||||
{
|
||||
DestroyWindow(vp);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
windows.Add(window, handle);
|
||||
windowToHandle.Add(window, handle);
|
||||
imguiToWindow.Add(vp, window);
|
||||
}
|
||||
|
||||
private void ShowWindow(ImGuiViewportPtr vp)
|
||||
@ -697,7 +689,7 @@ public void Dispose()
|
||||
imGuiSampler?.Dispose();
|
||||
resourceUploader?.Dispose();
|
||||
|
||||
foreach (KeyValuePair<Window, GCHandle> window in windows)
|
||||
foreach (KeyValuePair<Window, GCHandle> window in windowToHandle)
|
||||
{
|
||||
if (window.Key == mainWindow) continue;
|
||||
|
||||
@ -705,6 +697,7 @@ public void Dispose()
|
||||
window.Key.Dispose();
|
||||
window.Value.Free();
|
||||
}
|
||||
windows.Clear();
|
||||
windowToHandle.Clear();
|
||||
imguiToWindow.Clear();
|
||||
}
|
||||
}
|
@ -136,9 +136,9 @@ private void ProcessMovedChangedEvent(ref SDL.SDL_WindowEvent ev)
|
||||
|
||||
private void ProcessCloseEvent(ref SDL.SDL_WindowEvent ev)
|
||||
{
|
||||
OnCloseEvent?.Invoke(this);
|
||||
Engine.GraphicsDevice.UnclaimWindow(this);
|
||||
Dispose();
|
||||
OnCloseEvent?.Invoke(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
Loading…
Reference in New Issue
Block a user