Rename and mouse cursor support

This commit is contained in:
max 2024-07-10 21:50:04 +02:00
parent 1eb899b240
commit 2c839d8fad
6 changed files with 89 additions and 67 deletions

View File

@ -39,7 +39,7 @@ public static class Engine
private const string WindowTitle = "Nerfed"; private const string WindowTitle = "Nerfed";
//.. //..
private static Gui.Controller Controller; private static Gui.GuiController Controller;
internal static void Run(string[] args) internal static void Run(string[] args)
{ {
@ -67,7 +67,7 @@ internal static void Run(string[] args)
AudioDevice = new AudioDevice(); AudioDevice = new AudioDevice();
Controller = new Gui.Controller(GraphicsDevice, MainWindow, Color.DarkOliveGreen); Controller = new Gui.GuiController(GraphicsDevice, MainWindow, Color.DarkOliveGreen);
Controller.OnGui += () => { Controller.OnGui += () => {
ImGuiNET.ImGui.ShowDemoWindow(); ImGuiNET.ImGui.ShowDemoWindow();
}; };

View File

@ -3,10 +3,13 @@
namespace Nerfed.Runtime.Gui; namespace Nerfed.Runtime.Gui;
public static unsafe class Clipboard public static unsafe class GuiClipboard
{ {
private static IntPtr clipboard; private static IntPtr clipboard;
private static readonly Dictionary<Delegate, IntPtr> pinned = new(); private static readonly Dictionary<Delegate, IntPtr> pinned = new Dictionary<Delegate, IntPtr>();
public static readonly IntPtr GetFnPtr = GetPointerTo(Get);
public static readonly IntPtr SetFnPtr = GetPointerTo(Set);
private static unsafe void Set(void* userdata, byte* text) private static unsafe void Set(void* userdata, byte* text)
{ {
@ -36,13 +39,12 @@ private static unsafe void Set(void* userdata, byte* text)
private static IntPtr GetPointerTo<T>(T fn) where T : Delegate private static IntPtr GetPointerTo<T>(T fn) where T : Delegate
{ {
if (pinned.TryGetValue(fn, out nint ptr)) if (pinned.TryGetValue(fn, out nint ptr))
{
return ptr; return ptr;
}
ptr = Marshal.GetFunctionPointerForDelegate(fn); ptr = Marshal.GetFunctionPointerForDelegate(fn);
pinned.Add(fn, ptr); pinned.Add(fn, ptr);
return ptr; return ptr;
} }
public static readonly IntPtr GetFnPtr = GetPointerTo(Get);
public static readonly IntPtr SetFnPtr = GetPointerTo(Set);
} }

View File

@ -9,7 +9,7 @@
namespace Nerfed.Runtime.Gui; namespace Nerfed.Runtime.Gui;
internal class Controller : IDisposable internal class GuiController : IDisposable
{ {
public event Action OnGui; public event Action OnGui;
@ -36,7 +36,7 @@ internal class Controller : IDisposable
private readonly Shader imGuiVertexShader; private readonly Shader imGuiVertexShader;
private readonly Shader imGuiFragmentShader; private readonly Shader imGuiFragmentShader;
private readonly Sampler imGuiSampler; private readonly Sampler imGuiSampler;
private readonly TextureStorage textureStorage = new TextureStorage(); private readonly GuiTextureStorage textureStorage = new GuiTextureStorage();
private readonly Dictionary<Window, GCHandle> windows = new Dictionary<Window, GCHandle>(16); private readonly Dictionary<Window, GCHandle> windows = new Dictionary<Window, GCHandle>(16);
private Texture fontTexture = null; private Texture fontTexture = null;
@ -46,7 +46,7 @@ internal class Controller : IDisposable
private Graphics.Buffer imGuiIndexBuffer = null; private Graphics.Buffer imGuiIndexBuffer = null;
private bool frameBegun = false; private bool frameBegun = false;
public Controller(GraphicsDevice graphicsDevice, Window mainWindow, Color clearColor, ImGuiConfigFlags configFlags = ImGuiConfigFlags.NavEnableKeyboard | ImGuiConfigFlags.DockingEnable | ImGuiConfigFlags.ViewportsEnable) public GuiController(GraphicsDevice graphicsDevice, Window mainWindow, Color clearColor, ImGuiConfigFlags configFlags = ImGuiConfigFlags.NavEnableKeyboard | ImGuiConfigFlags.DockingEnable | ImGuiConfigFlags.ViewportsEnable)
{ {
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
this.graphicsDevice = graphicsDevice; this.graphicsDevice = graphicsDevice;
@ -104,10 +104,10 @@ public Controller(GraphicsDevice graphicsDevice, Window mainWindow, Color clearC
if (!OperatingSystem.IsWindows()) if (!OperatingSystem.IsWindows())
{ {
io.SetClipboardTextFn = Clipboard.SetFnPtr; io.SetClipboardTextFn = GuiClipboard.SetFnPtr;
io.GetClipboardTextFn = Clipboard.GetFnPtr; io.GetClipboardTextFn = GuiClipboard.GetFnPtr;
} }
ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO(); ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO();
ImGuiViewportPtr mainViewport = platformIO.Viewports[0]; ImGuiViewportPtr mainViewport = platformIO.Viewports[0];
mainViewport.PlatformHandle = mainWindow.Handle; mainViewport.PlatformHandle = mainWindow.Handle;
@ -143,7 +143,7 @@ public Controller(GraphicsDevice graphicsDevice, Window mainWindow, Color clearC
ImGuiNative.ImGuiPlatformIO_Set_Platform_GetWindowSize(platformIO.NativePtr, Marshal.GetFunctionPointerForDelegate(getWindowSize)); ImGuiNative.ImGuiPlatformIO_Set_Platform_GetWindowSize(platformIO.NativePtr, Marshal.GetFunctionPointerForDelegate(getWindowSize));
} }
//io.BackendFlags |= ImGuiBackendFlags.HasMouseCursors; io.BackendFlags |= ImGuiBackendFlags.HasMouseCursors;
io.BackendFlags |= ImGuiBackendFlags.HasSetMousePos; io.BackendFlags |= ImGuiBackendFlags.HasSetMousePos;
io.BackendFlags |= ImGuiBackendFlags.PlatformHasViewports; io.BackendFlags |= ImGuiBackendFlags.PlatformHasViewports;
io.BackendFlags |= ImGuiBackendFlags.RendererHasViewports; io.BackendFlags |= ImGuiBackendFlags.RendererHasViewports;
@ -159,6 +159,7 @@ public void Update(float deltaTime)
UpdatePerFrameImGuiData(deltaTime); UpdatePerFrameImGuiData(deltaTime);
UpdateInput(); UpdateInput();
UpdateCursor();
UpdateMonitors(); UpdateMonitors();
frameBegun = true; frameBegun = true;
@ -247,6 +248,41 @@ private void UpdateInput()
} }
} }
private void UpdateCursor()
{
ImGuiIOPtr io = ImGui.GetIO();
if ((io.ConfigFlags & ImGuiConfigFlags.NoMouseCursorChange) != 0)
{
return;
}
ImGuiMouseCursor imGuiCursor = ImGui.GetMouseCursor();
if (imGuiCursor == ImGuiMouseCursor.None || io.MouseDrawCursor)
{
SDL2.SDL.SDL_ShowCursor(0);
}
else
{
nint sdlCursor = imGuiCursor switch
{
ImGuiMouseCursor.Arrow => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_ARROW),
ImGuiMouseCursor.TextInput => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_IBEAM),
ImGuiMouseCursor.ResizeAll => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_SIZEALL),
ImGuiMouseCursor.ResizeNS => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_SIZENS),
ImGuiMouseCursor.ResizeEW => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_SIZEWE),
ImGuiMouseCursor.ResizeNESW => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_SIZENESW),
ImGuiMouseCursor.ResizeNWSE => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_SIZENWSE),
ImGuiMouseCursor.Hand => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_HAND),
ImGuiMouseCursor.NotAllowed => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_NO),
_ => SDL2.SDL.SDL_CreateSystemCursor(SDL2.SDL.SDL_SystemCursor.SDL_SYSTEM_CURSOR_ARROW),
};
SDL2.SDL.SDL_SetCursor(sdlCursor);
SDL2.SDL.SDL_ShowCursor(1);
}
}
private unsafe void UpdateMonitors() private unsafe void UpdateMonitors()
{ {
ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO(); ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO();
@ -304,7 +340,7 @@ public void Render()
{ {
RenderCommandLists(commandBuffer, swapchainTexture, vp.DrawData); RenderCommandLists(commandBuffer, swapchainTexture, vp.DrawData);
graphicsDevice.Submit(commandBuffer); graphicsDevice.Submit(commandBuffer);
graphicsDevice.Wait(); //graphicsDevice.Wait();
} }
} }
} }

View File

@ -0,0 +1,33 @@
using Nerfed.Runtime.Graphics;
using System.Numerics;
using System.Runtime.InteropServices;
namespace Nerfed.Runtime.Gui;
[StructLayout(LayoutKind.Sequential)]
public struct Position2DTextureColorVertex(Vector2 position, Vector2 texcoord, Color color) : IVertexType
{
public Vector2 Position = position;
public Vector2 TexCoord = texcoord;
public Color Color = color;
public static VertexElementFormat[] Formats { get; } = new VertexElementFormat[3]
{
VertexElementFormat.Vector2,
VertexElementFormat.Vector2,
VertexElementFormat.Color
};
public static uint[] Offsets { get; } = new uint[3]
{
0,
8,
16
};
}
[StructLayout(LayoutKind.Sequential)]
public struct TransformVertexUniform(Matrix4x4 projectionMatrix)
{
public Matrix4x4 ProjectionMatrix = projectionMatrix;
}

View File

@ -2,7 +2,7 @@
namespace Nerfed.Runtime.Gui; namespace Nerfed.Runtime.Gui;
public class TextureStorage public class GuiTextureStorage
{ {
private readonly Dictionary<IntPtr, WeakReference<Texture>> pointerToTexture = new Dictionary<IntPtr, WeakReference<Texture>>(); private readonly Dictionary<IntPtr, WeakReference<Texture>> pointerToTexture = new Dictionary<IntPtr, WeakReference<Texture>>();
@ -17,12 +17,12 @@ public IntPtr Add(Texture texture)
public Texture GetTexture(IntPtr pointer) public Texture GetTexture(IntPtr pointer)
{ {
if (!pointerToTexture.ContainsKey(pointer)) if (!pointerToTexture.TryGetValue(pointer, out WeakReference<Texture> value))
{ {
return null; return null;
} }
WeakReference<Texture> result = pointerToTexture[pointer]; WeakReference<Texture> result = value;
if (!result.TryGetTarget(out Texture texture)) if (!result.TryGetTarget(out Texture texture))
{ {

View File

@ -1,49 +0,0 @@
using Nerfed.Runtime.Graphics;
using System.Numerics;
using System.Runtime.InteropServices;
namespace Nerfed.Runtime.Gui;
[StructLayout(LayoutKind.Sequential)]
public struct Position2DTextureColorVertex : IVertexType
{
public Vector2 Position;
public Vector2 TexCoord;
public Color Color;
public Position2DTextureColorVertex(
Vector2 position,
Vector2 texcoord,
Color color
)
{
Position = position;
TexCoord = texcoord;
Color = color;
}
public static VertexElementFormat[] Formats { get; } = new VertexElementFormat[3]
{
VertexElementFormat.Vector2,
VertexElementFormat.Vector2,
VertexElementFormat.Color
};
public static uint[] Offsets => new uint[3]
{
0,
8,
16
};
}
[StructLayout(LayoutKind.Sequential)]
public struct TransformVertexUniform
{
public Matrix4x4 ProjectionMatrix;
public TransformVertexUniform(Matrix4x4 projectionMatrix)
{
ProjectionMatrix = projectionMatrix;
}
}