Go over vertex generator.

This commit is contained in:
H. Utku Maden 2024-07-28 12:37:33 +03:00
parent 3856b3c66e
commit 21591c3d11
6 changed files with 36 additions and 36 deletions

@ -12,7 +12,7 @@ namespace Dashboard.OpenTK
{ {
private readonly NativeWindow _window; private readonly NativeWindow _window;
private readonly GL21Driver _glDriver; private readonly GL21Driver _glDriver;
private readonly VertexGeneratorEngine _vertexEngine; private readonly VertexDrawingEngine _vertexEngine;
public string Title public string Title
{ {
@ -57,7 +57,7 @@ namespace Dashboard.OpenTK
{ {
_window = window; _window = window;
_glDriver = new GL21Driver(); _glDriver = new GL21Driver();
_vertexEngine = new VertexGeneratorEngine(); _vertexEngine = new VertexDrawingEngine();
} }
public void Focus() public void Focus()

@ -27,7 +27,7 @@ namespace Dashboard.OpenGL
private int tx2darray; private int tx2darray;
private bool isDiposed; private bool isDiposed;
private readonly Dictionary<DrawQueue, DrawData> data = new Dictionary<DrawQueue, DrawData>(); private readonly Dictionary<DrawCallQueue, DrawData> data = new Dictionary<DrawCallQueue, DrawData>();
private readonly TextureManager textures = new TextureManager(); private readonly TextureManager textures = new TextureManager();
public bool IsInit { get; private set; } = false; public bool IsInit { get; private set; } = false;
@ -87,7 +87,7 @@ namespace Dashboard.OpenGL
if (!IsInit) throw new InvalidOperationException("Initialize the driver first."); if (!IsInit) throw new InvalidOperationException("Initialize the driver first.");
} }
public void Draw(DrawQueue queue, in QRectangle view) public void Draw(DrawCallQueue queue, in QRectangle view)
{ {
AssertInit(); AssertInit();
@ -159,7 +159,7 @@ namespace Dashboard.OpenGL
GL.Disable(GL_BLEND); GL.Disable(GL_BLEND);
} }
public void ClearDrawQueue(DrawQueue queue) public void ClearDrawQueue(DrawCallQueue queue)
{ {
AssertInit(); AssertInit();
@ -260,14 +260,14 @@ namespace Dashboard.OpenGL
private class DrawData : IDisposable private class DrawData : IDisposable
{ {
public DrawQueue Queue { get; } public DrawCallQueue Queue { get; }
public int VertexArray { get; } public int VertexArray { get; }
private readonly GL21Driver driver; private readonly GL21Driver driver;
private int vbo1, vbo2; private int vbo1, vbo2;
private int ebo1, ebo2; private int ebo1, ebo2;
public DrawData(GL21Driver driver, DrawQueue queue) public DrawData(GL21Driver driver, DrawCallQueue queue)
{ {
Queue = queue; Queue = queue;
this.driver = driver; this.driver = driver;
@ -290,13 +290,13 @@ namespace Dashboard.OpenGL
GL.BindVertexArray(VertexArray); GL.BindVertexArray(VertexArray);
GL.BindBuffer(GL_ARRAY_BUFFER, vbo); GL.BindBuffer(GL_ARRAY_BUFFER, vbo);
GL.BufferData(GL_ARRAY_BUFFER, QuikVertex.Stride * Queue.VertexCount, Queue.VertexArray, GL_STREAM_DRAW); GL.BufferData(GL_ARRAY_BUFFER, DbVertex.Stride * Queue.VertexCount, Queue.VertexArray, GL_STREAM_DRAW);
GL.VertexAttribPointer(driver.v2Position, 2, GL_FLOAT, false, QuikVertex.Stride, QuikVertex.PositionOffset); GL.VertexAttribPointer(driver.v2Position, 2, GL_FLOAT, false, DbVertex.Stride, DbVertex.PositionOffset);
GL.VertexAttribPointer(driver.fZIndex, 1, GL_UNSIGNED_INT, false, QuikVertex.Stride, QuikVertex.ZIndexOffset); GL.VertexAttribPointer(driver.fZIndex, 1, GL_UNSIGNED_INT, false, DbVertex.Stride, DbVertex.ZIndexOffset);
GL.VertexAttribPointer(driver.v2TexPos, 2, GL_FLOAT, false, QuikVertex.Stride, QuikVertex.TextureCoordinatesOffset); GL.VertexAttribPointer(driver.v2TexPos, 2, GL_FLOAT, false, DbVertex.Stride, DbVertex.TextureCoordinatesOffset);
GL.VertexAttribPointer(driver.fTexLayer, 1, GL_FLOAT, false, QuikVertex.Stride, QuikVertex.TextureLayerOffset); GL.VertexAttribPointer(driver.fTexLayer, 1, GL_FLOAT, false, DbVertex.Stride, DbVertex.TextureLayerOffset);
GL.VertexAttribPointer(driver.v4Color, 4, GL_UNSIGNED_BYTE, true, QuikVertex.Stride, QuikVertex.ColorOffset); GL.VertexAttribPointer(driver.v4Color, 4, GL_UNSIGNED_BYTE, true, DbVertex.Stride, DbVertex.ColorOffset);
GL.EnableVertexAttribArray(driver.v2Position); GL.EnableVertexAttribArray(driver.v2Position);
GL.EnableVertexAttribArray(driver.fZIndex); GL.EnableVertexAttribArray(driver.fZIndex);
GL.EnableVertexAttribArray(driver.v2TexPos); GL.EnableVertexAttribArray(driver.v2TexPos);

@ -6,7 +6,7 @@ namespace Dashboard.VertexGenerator
/// Represents a GPU vertex. /// Represents a GPU vertex.
/// </summary> /// </summary>
[DebuggerDisplay("XY={Position} RGBA={Color}, UV={TextureCoordinates}")] [DebuggerDisplay("XY={Position} RGBA={Color}, UV={TextureCoordinates}")]
public struct QuikVertex public struct DbVertex
{ {
/// <summary> /// <summary>
/// Position value. /// Position value.
@ -38,6 +38,6 @@ namespace Dashboard.VertexGenerator
public static unsafe int ColorOffset => 2 * sizeof(QVec2); public static unsafe int ColorOffset => 2 * sizeof(QVec2);
public static unsafe int ZIndexOffset => ColorOffset + sizeof(QColor); public static unsafe int ZIndexOffset => ColorOffset + sizeof(QColor);
public static unsafe int TextureLayerOffset => ZIndexOffset + sizeof(int); public static unsafe int TextureLayerOffset => ZIndexOffset + sizeof(int);
public static unsafe int Stride => sizeof(QuikVertex); public static unsafe int Stride => sizeof(DbVertex);
} }
} }

@ -6,9 +6,9 @@ using System.Runtime.CompilerServices;
namespace Dashboard.VertexGenerator namespace Dashboard.VertexGenerator
{ {
public class DrawQueue : IEnumerable<DrawCall> public class DrawCallQueue : IEnumerable<DrawCall>
{ {
private readonly RefList<QuikVertex> _vertices = new RefList<QuikVertex>(); private readonly RefList<DbVertex> _vertices = new RefList<DbVertex>();
private readonly RefList<int> _elements = new RefList<int>(); private readonly RefList<int> _elements = new RefList<int>();
private readonly List<DrawCall> _drawCalls = new List<DrawCall>(); private readonly List<DrawCall> _drawCalls = new List<DrawCall>();
private int _start; private int _start;
@ -17,7 +17,7 @@ namespace Dashboard.VertexGenerator
private QImage? _texture; private QImage? _texture;
public int ZDepth { get; private set; } public int ZDepth { get; private set; }
public QuikVertex[] VertexArray => _vertices.InternalArray; public DbVertex[] VertexArray => _vertices.InternalArray;
public int VertexCount => _vertices.Count; public int VertexCount => _vertices.Count;
public int[] ElementArray => _elements.InternalArray; public int[] ElementArray => _elements.InternalArray;
public int ElementCount => _elements.Count; public int ElementCount => _elements.Count;
@ -51,7 +51,7 @@ namespace Dashboard.VertexGenerator
public void StartDrawCall(in QRectangle bounds, QImage texture) => StartDrawCall(bounds, texture, _vertices.Count); public void StartDrawCall(in QRectangle bounds, QImage texture) => StartDrawCall(bounds, texture, _vertices.Count);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AddVertex(in QuikVertex vertex) public void AddVertex(in DbVertex vertex)
{ {
_vertices.Add(in vertex); _vertices.Add(in vertex);
} }

@ -6,7 +6,7 @@ namespace Dashboard.VertexGenerator
/// A small list which whose items can be used by reference. /// A small list which whose items can be used by reference.
/// </summary> /// </summary>
/// <typeparam name="T">Container type.</typeparam> /// <typeparam name="T">Container type.</typeparam>
public class RefList<T> internal class RefList<T>
{ {
private T[] _array = Array.Empty<T>(); private T[] _array = Array.Empty<T>();
private int _count = 0; private int _count = 0;

@ -6,9 +6,9 @@ using Dashboard.Typography;
namespace Dashboard.VertexGenerator namespace Dashboard.VertexGenerator
{ {
public class VertexGeneratorEngine : DrawingEngine public class VertexDrawingEngine : DrawingEngine
{ {
public DrawQueue DrawQueue { get; } = new DrawQueue(); public DrawCallQueue DrawQueue { get; } = new DrawCallQueue();
/// <summary> /// <summary>
/// Granularity for rounded geometry. /// Granularity for rounded geometry.
@ -18,18 +18,18 @@ namespace Dashboard.VertexGenerator
protected bool BlendTextures => protected bool BlendTextures =>
(Style["-vertex-blend-textures"] is bool value) ? value : false; (Style["-vertex-blend-textures"] is bool value) ? value : false;
protected QuikVertex StrokeVertex => new QuikVertex() protected DbVertex StrokeVertex => new DbVertex()
{ {
ZIndex = Style.ZIndex ?? this.ZIndex, ZIndex = Style.ZIndex ?? this.ZIndex,
Color = Style.StrokeColor ?? QColor.Black, Color = Style.StrokeColor ?? QColor.Black,
}; };
protected QuikVertex FillVertex => new QuikVertex() protected DbVertex FillVertex => new DbVertex()
{ {
ZIndex = Style.ZIndex ?? this.ZIndex, ZIndex = Style.ZIndex ?? this.ZIndex,
Color = Style.Color ?? QColor.White, Color = Style.Color ?? QColor.White,
}; };
protected QuikVertex ImageVertex => new QuikVertex() protected DbVertex ImageVertex => new DbVertex()
{ {
ZIndex = Style.ZIndex ?? this.ZIndex, ZIndex = Style.ZIndex ?? this.ZIndex,
Color = BlendTextures ? (Style.Color ?? QColor.White) : QColor.White, Color = BlendTextures ? (Style.Color ?? QColor.White) : QColor.White,
@ -126,8 +126,8 @@ namespace Dashboard.VertexGenerator
private LineInfo GenerateLineSegment(in QLine line) private LineInfo GenerateLineSegment(in QLine line)
{ {
QuikVertex vertex = StrokeVertex; DbVertex vertex = StrokeVertex;
QuikVertex a, b, c, d; DbVertex a, b, c, d;
QVec2 normal = line.Normal(); QVec2 normal = line.Normal();
float width = Style.StrokeWidth ?? 1; float width = Style.StrokeWidth ?? 1;
@ -171,7 +171,7 @@ namespace Dashboard.VertexGenerator
return; return;
} }
QuikVertex vertex = StrokeVertex; DbVertex vertex = StrokeVertex;
float radius = Style.StrokeWidth/2 ?? 0.5f; float radius = Style.StrokeWidth/2 ?? 0.5f;
float arc = MathF.Acos(QVec2.Dot(prevNormal, nextNormal)); float arc = MathF.Acos(QVec2.Dot(prevNormal, nextNormal));
int resolution = GetRoundingResolution(radius, arc); int resolution = GetRoundingResolution(radius, arc);
@ -240,7 +240,7 @@ namespace Dashboard.VertexGenerator
bool endCap) bool endCap)
{ {
int lastIndex, startIndex; int lastIndex, startIndex;
QuikVertex vertex = StrokeVertex; DbVertex vertex = StrokeVertex;
float radius = Style.StrokeWidth ?? 1.0f; float radius = Style.StrokeWidth ?? 1.0f;
int resolution = GetRoundingResolution(radius, MathF.PI); int resolution = GetRoundingResolution(radius, MathF.PI);
@ -380,7 +380,7 @@ namespace Dashboard.VertexGenerator
int resolution = GetRoundingResolution(radius, bezier.RasterizationArc); int resolution = GetRoundingResolution(radius, bezier.RasterizationArc);
DrawQueue.RestoreOffset(); DrawQueue.RestoreOffset();
QuikVertex v = StrokeVertex; DbVertex v = StrokeVertex;
int vbase = DrawQueue.BaseOffset; int vbase = DrawQueue.BaseOffset;
int index = 2; int index = 2;
@ -480,7 +480,7 @@ namespace Dashboard.VertexGenerator
QVec2 aPos, bPos, cPos, dPos; QVec2 aPos, bPos, cPos, dPos;
QuikVertex v = FillVertex; DbVertex v = FillVertex;
aPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom - radius); aPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom - radius);
DrawQueue.AddVertex(v); DrawQueue.AddVertex(v);
bPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom - radius); bPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom - radius);
@ -616,7 +616,7 @@ namespace Dashboard.VertexGenerator
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
*/ */
QuikVertex v = StrokeVertex; DbVertex v = StrokeVertex;
float stroke = Style.StrokeWidth ?? 1.0f; float stroke = Style.StrokeWidth ?? 1.0f;
DrawQueue.RestoreOffset(); DrawQueue.RestoreOffset();
@ -673,7 +673,7 @@ namespace Dashboard.VertexGenerator
u v w x u v w x
20: 0 1 2 3 20: 0 1 2 3
*/ */
QuikVertex v = StrokeVertex; DbVertex v = StrokeVertex;
QVec2 nPos, qPos, tPos, wPos; QVec2 nPos, qPos, tPos, wPos;
float stroke = Style.StrokeWidth ?? 1.0f; float stroke = Style.StrokeWidth ?? 1.0f;
@ -862,7 +862,7 @@ namespace Dashboard.VertexGenerator
10: 0 1 2 3 4 5 10: 0 1 2 3 4 5
*/ */
QuikVertex v = StrokeVertex; DbVertex v = StrokeVertex;
float stroke = Style.StrokeWidth ?? 1.0f; float stroke = Style.StrokeWidth ?? 1.0f;
float innerRadius = radius - stroke; float innerRadius = radius - stroke;
DrawQueue.RestoreOffset(); DrawQueue.RestoreOffset();
@ -1048,7 +1048,7 @@ namespace Dashboard.VertexGenerator
} }
DrawQueue.RestoreOffset(); DrawQueue.RestoreOffset();
QuikVertex vertex = ImageVertex; DbVertex vertex = ImageVertex;
vertex.Position = new QVec2(rect.Left, rect.Top); vertex.Position = new QVec2(rect.Left, rect.Top);
vertex.TextureCoordinates = new QVec2(uvs.Left, uvs.Top); vertex.TextureCoordinates = new QVec2(uvs.Left, uvs.Top);
@ -1084,7 +1084,7 @@ namespace Dashboard.VertexGenerator
int layer = (int)queue.Dequeue(); int layer = (int)queue.Dequeue();
DrawQueue.RestoreOffset(); DrawQueue.RestoreOffset();
QuikVertex vertex = ImageVertex; DbVertex vertex = ImageVertex;
vertex.TextureLayer = layer; vertex.TextureLayer = layer;
vertex.Position = new QVec2(rect.Top, rect.Left); vertex.Position = new QVec2(rect.Top, rect.Left);