108 lines
2.8 KiB
C#
108 lines
2.8 KiB
C#
using System;
|
|
using OpenTK.Mathematics;
|
|
using OpenTK.Windowing.Desktop;
|
|
using OpenTK.Graphics.OpenGL4;
|
|
using Dashboard.OpenGL;
|
|
using Dashboard.ImmediateDraw;
|
|
using Dashboard.PAL;
|
|
using Dashboard.VertexGenerator;
|
|
|
|
namespace Dashboard.OpenTK
|
|
{
|
|
public class OpenTKPort : IDashHandle
|
|
{
|
|
private readonly NativeWindow _window;
|
|
private readonly GL21Driver _glDriver;
|
|
private readonly VertexDrawingEngine _vertexEngine;
|
|
|
|
public string Title
|
|
{
|
|
get => _window.Title;
|
|
set => _window.Title = value;
|
|
}
|
|
|
|
public Vector2 Size
|
|
{
|
|
get
|
|
{
|
|
Vector2i size = _window.ClientSize;
|
|
return new Vector2(size.X, size.Y);
|
|
}
|
|
set
|
|
{
|
|
// OpenTK being OpenTK as usual, you can't set the client size.
|
|
Vector2i extents = _window.Size - _window.ClientSize;
|
|
Vector2i size = extents + new Vector2i((int)value.X, (int)value.Y);
|
|
_window.Size = size;
|
|
}
|
|
}
|
|
public Vector2 Position
|
|
{
|
|
get
|
|
{
|
|
Vector2i location = _window.Location;
|
|
return new Vector2(location.X, location.Y);
|
|
}
|
|
set
|
|
{
|
|
Vector2i location = new Vector2i((int)value.X, (int)value.Y);
|
|
_window.Location = location;
|
|
}
|
|
}
|
|
|
|
public bool IsValid => !isDisposed;
|
|
|
|
public event EventHandler? EventRaised;
|
|
|
|
public OpenTKPort(NativeWindow window)
|
|
{
|
|
_window = window;
|
|
_glDriver = new GL21Driver();
|
|
_vertexEngine = new VertexDrawingEngine();
|
|
}
|
|
|
|
public void Focus()
|
|
{
|
|
_window.Focus();
|
|
}
|
|
|
|
public void Paint(DrawList queue)
|
|
{
|
|
Rectangle view = new Rectangle(Size, new Vector2(0, 0));
|
|
|
|
_vertexEngine.Reset();
|
|
_vertexEngine.ProcessCommands(view, queue);
|
|
|
|
if (!_window.Context.IsCurrent)
|
|
_window.Context.MakeCurrent();
|
|
|
|
if (!_glDriver.IsInit)
|
|
_glDriver.Init();
|
|
|
|
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
|
|
_glDriver.Draw(_vertexEngine.DrawQueue, view);
|
|
|
|
_window.Context.SwapBuffers();
|
|
}
|
|
|
|
public void Show(bool shown = true)
|
|
{
|
|
_window.IsVisible = shown;
|
|
}
|
|
|
|
private bool isDisposed;
|
|
private void Dispose(bool disposing)
|
|
{
|
|
if (isDisposed) return;
|
|
|
|
if (disposing)
|
|
{
|
|
_window?.Dispose();
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
isDisposed = true;
|
|
}
|
|
public void Dispose() => Dispose(true);
|
|
}
|
|
} |