Rename and mouse cursor support
This commit is contained in:
parent
1eb899b240
commit
2c839d8fad
@ -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();
|
||||||
};
|
};
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
33
Nerfed.Runtime/Gui/GuiStructs.cs
Normal file
33
Nerfed.Runtime/Gui/GuiStructs.cs
Normal 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;
|
||||||
|
}
|
@ -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))
|
||||||
{
|
{
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user