You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
5.8 KiB
133 lines
5.8 KiB
using System; |
|
using System.Linq; |
|
using System.Numerics; |
|
using Veldrid; |
|
using Veldrid.Sdl2; |
|
using Veldrid.StartupUtilities; |
|
|
|
using static ImGuiNET.ImGuiNative; |
|
|
|
namespace ImGuiNET |
|
{ |
|
class Program |
|
{ |
|
private static Sdl2Window _window; |
|
private static GraphicsDevice _gd; |
|
private static CommandList _cl; |
|
private static ImGuiController _controller; |
|
private static MemoryEditor _memoryEditor; |
|
|
|
// UI state |
|
private static float _f = 0.0f; |
|
private static int _counter = 0; |
|
private static int _dragInt = 0; |
|
private static Vector3 _clearColor = new Vector3(0.45f, 0.55f, 0.6f); |
|
private static bool _showDemoWindow = true; |
|
private static bool _showAnotherWindow = false; |
|
private static bool _showMemoryEditor = false; |
|
private static byte[] _memoryEditorData; |
|
|
|
static void SetThing(out float i, float val) { i = val; } |
|
|
|
static void Main(string[] args) |
|
{ |
|
// Create window, GraphicsDevice, and all resources necessary for the demo. |
|
VeldridStartup.CreateWindowAndGraphicsDevice( |
|
new WindowCreateInfo(50, 50, 1280, 720, WindowState.Normal, "ImGui.NET Sample Program"), |
|
new GraphicsDeviceOptions(true, null, true), |
|
GraphicsBackend.Vulkan, |
|
out _window, |
|
out _gd); |
|
_window.Resized += () => |
|
{ |
|
_gd.MainSwapchain.Resize((uint)_window.Width, (uint)_window.Height); |
|
_controller.WindowResized(_window.Width, _window.Height); |
|
}; |
|
_cl = _gd.ResourceFactory.CreateCommandList(); |
|
_controller = new ImGuiController(_gd, _gd.MainSwapchain.Framebuffer.OutputDescription, _window.Width, _window.Height); |
|
_memoryEditor = new MemoryEditor(); |
|
Random random = new Random(); |
|
_memoryEditorData = Enumerable.Range(0, 1024).Select(i => (byte)random.Next(255)).ToArray(); |
|
|
|
// Main application loop |
|
while (_window.Exists) |
|
{ |
|
InputSnapshot snapshot = _window.PumpEvents(); |
|
if (!_window.Exists) { break; } |
|
_controller.Update(1f / 60f, snapshot); // Feed the input events to our ImGui controller, which passes them through to ImGui. |
|
|
|
SubmitUI(); |
|
|
|
_cl.Begin(); |
|
_cl.SetFramebuffer(_gd.MainSwapchain.Framebuffer); |
|
_cl.ClearColorTarget(0, new RgbaFloat(_clearColor.X, _clearColor.Y, _clearColor.Z, 1f)); |
|
_controller.Render(_gd, _cl); |
|
_cl.End(); |
|
_gd.SubmitCommands(_cl); |
|
_gd.SwapBuffers(_gd.MainSwapchain); |
|
} |
|
|
|
// Clean up Veldrid resources |
|
_gd.WaitForIdle(); |
|
_controller.Dispose(); |
|
_cl.Dispose(); |
|
_gd.Dispose(); |
|
} |
|
|
|
private static unsafe void SubmitUI() |
|
{ |
|
// Demo code adapted from the official Dear ImGui demo program: |
|
// https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx11/main.cpp#L172 |
|
|
|
// 1. Show a simple window. |
|
// Tip: if we don't call ImGui.BeginWindow()/ImGui.EndWindow() the widgets automatically appears in a window called "Debug". |
|
{ |
|
ImGui.Text("Hello, world!"); // Display some text (you can use a format string too) |
|
ImGui.SliderFloat("float", ref _f, 0, 1, _f.ToString("0.000"), 1); // Edit 1 float using a slider from 0.0f to 1.0f |
|
//ImGui.ColorEdit3("clear color", ref _clearColor); // Edit 3 floats representing a color |
|
|
|
ImGui.Text($"Mouse position: {ImGui.GetMousePos()}"); |
|
|
|
ImGui.Checkbox("Demo Window", ref _showDemoWindow); // Edit bools storing our windows open/close state |
|
ImGui.Checkbox("Another Window", ref _showAnotherWindow); |
|
ImGui.Checkbox("Memory Editor", ref _showMemoryEditor); |
|
if (ImGui.Button("Button")) // Buttons return true when clicked (NB: most widgets return true when edited/activated) |
|
_counter++; |
|
ImGui.SameLine(0, -1); |
|
ImGui.Text($"counter = {_counter}"); |
|
|
|
ImGui.DragInt("Draggable Int", ref _dragInt); |
|
|
|
float framerate = ImGui.GetIO().Framerate; |
|
ImGui.Text($"Application average {1000.0f / framerate:0.##} ms/frame ({framerate:0.#} FPS)"); |
|
} |
|
|
|
// 2. Show another simple window. In most cases you will use an explicit Begin/End pair to name your windows. |
|
if (_showAnotherWindow) |
|
{ |
|
ImGui.Begin("Another Window", ref _showAnotherWindow); |
|
ImGui.Text("Hello from another window!"); |
|
if (ImGui.Button("Close Me")) |
|
_showAnotherWindow = false; |
|
ImGui.End(); |
|
} |
|
|
|
// 3. Show the ImGui demo window. Most of the sample code is in ImGui.ShowDemoWindow(). Read its code to learn more about Dear ImGui! |
|
if (_showDemoWindow) |
|
{ |
|
// Normally user code doesn't need/want to call this because positions are saved in .ini file anyway. |
|
// Here we just want to make the demo initial state a bit more friendly! |
|
ImGui.SetNextWindowPos(new Vector2(650, 20), ImGuiCond.FirstUseEver); |
|
ImGui.ShowDemoWindow(ref _showDemoWindow); |
|
} |
|
|
|
ImGuiIOPtr io = ImGui.GetIO(); |
|
SetThing(out io.DeltaTime, 2f); |
|
|
|
if (_showMemoryEditor) |
|
{ |
|
_memoryEditor.Draw("Memory Editor", _memoryEditorData, _memoryEditorData.Length); |
|
} |
|
} |
|
} |
|
}
|
|
|