87 lines
2.7 KiB
C#
87 lines
2.7 KiB
C#
using ImGuiNET;
|
|
using Nerfed.Runtime.Graphics;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Nerfed.Runtime.Gui
|
|
{
|
|
internal class GuiViewportWindow
|
|
{
|
|
public Window Window => window;
|
|
|
|
private readonly GCHandle gcHandle;
|
|
private readonly GraphicsDevice graphicsDevice;
|
|
private readonly ImGuiViewportPtr vp;
|
|
private readonly Window window;
|
|
|
|
public GuiViewportWindow(GraphicsDevice graphicsDevice, ImGuiViewportPtr vp, Window window)
|
|
{
|
|
this.graphicsDevice = graphicsDevice;
|
|
this.vp = vp;
|
|
this.window = window;
|
|
|
|
gcHandle = GCHandle.Alloc(this);
|
|
|
|
if (!window.Claimed)
|
|
{
|
|
graphicsDevice.ClaimWindow(window, SwapchainComposition.SDR, PresentMode.Immediate); // What PresentMode do we need?
|
|
}
|
|
|
|
vp.PlatformUserData = (IntPtr)gcHandle;
|
|
}
|
|
|
|
public GuiViewportWindow(GraphicsDevice graphicsDevice, ImGuiViewportPtr vp)
|
|
{
|
|
this.graphicsDevice = graphicsDevice;
|
|
this.vp = vp;
|
|
|
|
gcHandle = GCHandle.Alloc(this);
|
|
|
|
// TODO: Handle all flags.
|
|
ScreenMode screenMode = ScreenMode.Windowed;
|
|
bool systemResizable = true;
|
|
|
|
if ((vp.Flags & ImGuiViewportFlags.NoDecoration) == ImGuiViewportFlags.NoDecoration)
|
|
{
|
|
screenMode = ScreenMode.WindowedBorderless;
|
|
systemResizable = false;
|
|
}
|
|
|
|
WindowCreateInfo info = new WindowCreateInfo("Window Title", (uint)vp.Pos.X, (uint)vp.Pos.Y, screenMode, systemResizable, false);
|
|
|
|
window = new Window(graphicsDevice, info);
|
|
graphicsDevice.ClaimWindow(window, SwapchainComposition.SDR, PresentMode.Immediate); // What PresentMode do we need?
|
|
|
|
window.OnMovedEvent += HandleOnMovedEvent;
|
|
window.OnResizedEvent += HandleOnResizedEvent;
|
|
window.OnCloseEvent += HandleOnCloseEvent;
|
|
|
|
vp.PlatformUserData = (IntPtr)gcHandle;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
window.OnMovedEvent -= HandleOnMovedEvent;
|
|
window.OnResizedEvent -= HandleOnResizedEvent;
|
|
window.OnCloseEvent -= HandleOnCloseEvent;
|
|
|
|
graphicsDevice.UnclaimWindow(window);
|
|
window.Dispose();
|
|
gcHandle.Free();
|
|
}
|
|
|
|
private void HandleOnMovedEvent(Window window, int x, int y)
|
|
{
|
|
vp.PlatformRequestMove = true;
|
|
}
|
|
|
|
private void HandleOnResizedEvent(Window window, uint w, uint h)
|
|
{
|
|
vp.PlatformRequestResize = true;
|
|
}
|
|
|
|
private void HandleOnCloseEvent(Window window)
|
|
{
|
|
vp.PlatformRequestClose = true;
|
|
}
|
|
}
|
|
} |