Go over vertex generator.
This commit is contained in:
parent
3856b3c66e
commit
21591c3d11
@ -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;
|
||||||
|
32
Dashboard/VertexGenerator/VertexCommandEngine.cs → Dashboard/VertexGenerator/VertexDrawingEngine.cs
32
Dashboard/VertexGenerator/VertexCommandEngine.cs → Dashboard/VertexGenerator/VertexDrawingEngine.cs
@ -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);
|
Loading…
Reference in New Issue
Block a user