using Dashboard.ImmediateDraw; using Dashboard.Media; using Dashboard.PAL; using OpenTK.Graphics.OpenGL4; using OpenTK.Mathematics; using OpenTK.Windowing.Desktop; using OpenTK.Windowing.GraphicsLibraryFramework; using System; using System.Collections.Generic; namespace Dashboard.OpenTK { public class OpenTKPlatform : IDbPlatform { private readonly List _ports = new List(); // These shall remain a sad nop for now. public string? Title { get; set; } public Media.Image? Icon { get; set; } = null; public event EventHandler? EventRaised; public NativeWindowSettings DefaultSettings { get; set; } = NativeWindowSettings.Default; public IReadOnlyList Ports => _ports; private bool IsGLInitialized = false; public IDashHandle CreatePort() { NativeWindow window = new NativeWindow(DefaultSettings); OpenTKPort port = new OpenTKPort(window); _ports.Add(port); if (!IsGLInitialized) { window.Context.MakeCurrent(); GL.LoadBindings(new GLFWBindingsContext()); IsGLInitialized = true; } window.Closing += (ea) => { Environment.Exit(0); }; return port; } public void Dispose() { // FIXME: dispose pattern here! // Copy the array to prevent collection modification exceptions. foreach (OpenTKPort port in _ports.ToArray()) { port.Dispose(); } } public void ProcessEvents(bool block) { NativeWindow.ProcessWindowEvents(block); } public void DestroyPort(IDashHandle port) => ((OpenTKPort)port).Dispose(); public string PortGetTitle(IDashHandle port) => ((OpenTKPort)port).Title; public void PortSetTitle(IDashHandle port, string title) => ((OpenTKPort)port).Title = title; public Vector2 PortGetSize(IDashHandle port) => ((OpenTKPort)port).Size; public void PortSetSize(IDashHandle port, Vector2 size) => ((OpenTKPort)port).Size = size; public Vector2 PortGetPosition(IDashHandle port) => ((OpenTKPort)port).Position; public void PortSetPosition(IDashHandle port, Vector2 position) => ((OpenTKPort)port).Position = position; public bool PortIsValid(IDashHandle port) => ((OpenTKPort)port).IsValid; public void PortSubscribeEvent(IDashHandle port, EventHandler handler) => ((OpenTKPort)port).EventRaised += handler; public void PortUnsubscribeEvent(IDashHandle port, EventHandler handler) => ((OpenTKPort)port).EventRaised -= handler; public void PortFocus(IDashHandle port) => ((OpenTKPort)port).Focus(); public void PortShow(IDashHandle port, bool shown = true) => ((OpenTKPort)port).Show(shown); public void PortPaint(IDashHandle port, DrawList commands) => ((OpenTKPort)port).Paint(commands); public void GetMaximumImage(out int width, out int height) { GL.GetInteger(GetPName.MaxTextureSize, out int value); width = height = value; } public void GetMaximumImage(out int width, out int height, out int depth) { GetMaximumImage(out width, out height); GL.GetInteger(GetPName.MaxArrayTextureLayers, out int value); depth = value; } } }