Rename geometry types with Q prefix instead of Quik.
This commit is contained in:
parent
fe71028573
commit
41b7bebba5
@ -64,15 +64,15 @@ namespace Quik.FreeType
|
||||
entry.Atlas = new Atlas(_owner.Context.TextureManager, _library);
|
||||
_textures.Add(entry.Atlas);
|
||||
}
|
||||
entry.Atlas.AttachGlyph(_face.Glyph, out QuikRectangle uvs);
|
||||
entry.Atlas.AttachGlyph(_face.Glyph, out QRectangle uvs);
|
||||
|
||||
entry.Metrics = new QuikGlyph(
|
||||
character,
|
||||
uvs,
|
||||
new QuikVec2(_face.Glyph.Metrics.Width / 64f, _face.Glyph.Metrics.Height / 64f),
|
||||
new QuikVec2(_face.Glyph.Metrics.HorizontalBearingX / 64f, _face.Glyph.Metrics.HorizontalBearingY / 64f),
|
||||
new QuikVec2(_face.Glyph.Metrics.VerticalBearingX / 64f , _face.Glyph.Metrics.VerticalBearingY / 64f),
|
||||
new QuikVec2(_face.Glyph.Metrics.HorizontalAdvance / 64f, _face.Glyph.Metrics.VerticalAdvance / 64f));
|
||||
new QVec2(_face.Glyph.Metrics.Width / 64f, _face.Glyph.Metrics.Height / 64f),
|
||||
new QVec2(_face.Glyph.Metrics.HorizontalBearingX / 64f, _face.Glyph.Metrics.HorizontalBearingY / 64f),
|
||||
new QVec2(_face.Glyph.Metrics.VerticalBearingX / 64f , _face.Glyph.Metrics.VerticalBearingY / 64f),
|
||||
new QVec2(_face.Glyph.Metrics.HorizontalAdvance / 64f, _face.Glyph.Metrics.VerticalAdvance / 64f));
|
||||
|
||||
_entries[character] = entry;
|
||||
|
||||
@ -104,7 +104,7 @@ namespace Quik.FreeType
|
||||
{
|
||||
public QuikTexture Texture;
|
||||
|
||||
private QuikVec2 _pointer = new QuikVec2();
|
||||
private QVec2 _pointer = new QVec2();
|
||||
private float _verticalAdvance = 0;
|
||||
private FTLibrary _ft;
|
||||
private FTBitmap _bitmap;
|
||||
@ -112,7 +112,7 @@ namespace Quik.FreeType
|
||||
public Atlas(IQuikTextureManager textureManager, FTLibrary ft)
|
||||
{
|
||||
Texture = textureManager.CreateTexture(
|
||||
new QuikVec2(4096, 4096),
|
||||
new QVec2(4096, 4096),
|
||||
false,
|
||||
QuikImageFormat.RgbaU8);
|
||||
|
||||
@ -126,14 +126,14 @@ namespace Quik.FreeType
|
||||
return true;
|
||||
}
|
||||
|
||||
public void AttachGlyph(in FTGlyphSlot slot, out QuikRectangle UVs)
|
||||
public void AttachGlyph(in FTGlyphSlot slot, out QRectangle UVs)
|
||||
{
|
||||
FT.BitmapConvert(_ft, slot.Bitmap, ref _bitmap, 1);
|
||||
|
||||
QuikRectangle position =
|
||||
new QuikRectangle(
|
||||
_pointer + new QuikVec2(_bitmap.Width + 1, _bitmap.Rows + 1),
|
||||
_pointer + new QuikVec2(1, 1));
|
||||
QRectangle position =
|
||||
new QRectangle(
|
||||
_pointer + new QVec2(_bitmap.Width + 1, _bitmap.Rows + 1),
|
||||
_pointer + new QVec2(1, 1));
|
||||
|
||||
Texture.SubImage(
|
||||
_bitmap.Buffer,
|
||||
@ -145,7 +145,7 @@ namespace Quik.FreeType
|
||||
_pointer.X += _bitmap.Width + 2;
|
||||
_verticalAdvance = Math.Max(_verticalAdvance, slot.Bitmap.Rows + 2);
|
||||
|
||||
UVs = new QuikRectangle(
|
||||
UVs = new QRectangle(
|
||||
position.Right / 4096,
|
||||
position.Bottom / 4096,
|
||||
position.Left / 4096,
|
||||
|
@ -2,6 +2,8 @@ using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Quik.OpenGL;
|
||||
using Quik.VertexGenerator;
|
||||
using Matrix4 = OpenTK.Mathematics.Matrix4;
|
||||
using static Quik.OpenGL.GLEnum;
|
||||
|
||||
namespace Quik.OpenTK
|
||||
@ -86,9 +88,16 @@ namespace Quik.OpenTK
|
||||
{
|
||||
location = GL.GetAttribLocation(_sp, name);
|
||||
}
|
||||
|
||||
_vbo = GL.GenBuffer();
|
||||
_ebo = GL.GenBuffer();
|
||||
_vao = GL.GenVertexArray();
|
||||
}
|
||||
|
||||
private readonly int _sp;
|
||||
private readonly int _vao;
|
||||
private readonly int _vbo;
|
||||
private readonly int _ebo;
|
||||
|
||||
private const string _nameM4View = "m4View";
|
||||
private readonly int _locM4View;
|
||||
@ -122,6 +131,38 @@ namespace Quik.OpenTK
|
||||
SdfAuxEnable = 1 << 3,
|
||||
}
|
||||
|
||||
public void Draw(DrawQueue queue)
|
||||
{
|
||||
GL.UseProgram(_sp);
|
||||
GL.BindVertexArray(_vao);
|
||||
|
||||
GL.BindBuffer(GL_ARRAY_BUFFER, _vbo);
|
||||
GL.BufferData(GL_ARRAY_BUFFER, queue.VertexCount * QuikVertex.Stride, queue.VertexArray, GL_STREAM_DRAW);
|
||||
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
|
||||
GL.BufferData(GL_ELEMENT_ARRAY_BUFFER, queue.ElementCount * sizeof(int), queue.ElementArray, GL_STREAM_DRAW);
|
||||
|
||||
GL.VertexAttribPointer(_locV2Position, 2, GL_FLOAT, false, QuikVertex.Stride, QuikVertex.PositionOffset);
|
||||
GL.VertexAttribPointer(_locV2Texture, 2, GL_FLOAT, false, QuikVertex.Stride, QuikVertex.TextureCoordinatesOffset);
|
||||
GL.VertexAttribPointer(_locV4Color, 4, GL_UNSIGNED_BYTE, false, QuikVertex.Stride, QuikVertex.ColorOffset);
|
||||
GL.EnableVertexAttribArray(_locV2Position);
|
||||
GL.EnableVertexAttribArray(_locV2Texture);
|
||||
GL.EnableVertexAttribArray(_locV4Color);
|
||||
|
||||
GL.Enable(GL_BLEND);
|
||||
GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
Matrix4 m = Matrix4.Identity;
|
||||
GL.UniformMatrix4(_locM4Model, false, ref m.Row0.X);
|
||||
|
||||
foreach (DrawCall call in queue)
|
||||
{
|
||||
GL.BindTexture(GL_TEXTURE_2D, ((OpenGLTexture)call.Texture)?.TextureId ?? 0);
|
||||
m = Matrix4.CreateOrthographicOffCenter(0, call.Bounds.Right, 0, call.Bounds.Top, 1.0f, -1.0f);
|
||||
GL.UniformMatrix4(_locM4View, false, ref m.Row0.X);
|
||||
GL.DrawElements(GL_TRIANGLES, call.Count, GL_UNSIGNED_INT, call.Start);
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isDisposed = false;
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
|
@ -13,7 +13,7 @@ namespace Quik.OpenTK
|
||||
private int _height;
|
||||
private bool _mipmaps;
|
||||
|
||||
internal OpenGLTexture(OpenGLTextureManager manager, QuikImageFormat format, QuikVec2 size, bool mipmaps)
|
||||
internal OpenGLTexture(OpenGLTextureManager manager, QuikImageFormat format, QVec2 size, bool mipmaps)
|
||||
{
|
||||
Manager = manager;
|
||||
_mipmaps = mipmaps;
|
||||
@ -61,7 +61,7 @@ namespace Quik.OpenTK
|
||||
public override bool Mipmaps => _mipmaps;
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Image(IntPtr data, QuikImageFormat format, QuikVec2 size, int level, int alignment = 4)
|
||||
public override void Image(IntPtr data, QuikImageFormat format, QVec2 size, int level, int alignment = 4)
|
||||
{
|
||||
GL.BindTexture(GL_TEXTURE_2D, TextureId);
|
||||
GL.PixelStore(GL_UNPACK_ALIGNMENT, alignment);
|
||||
@ -69,7 +69,7 @@ namespace Quik.OpenTK
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void SubImage(IntPtr data, QuikImageFormat format, QuikRectangle location, int level, int alignment = 4)
|
||||
public override void SubImage(IntPtr data, QuikImageFormat format, QRectangle location, int level, int alignment = 4)
|
||||
{
|
||||
GL.BindTexture(GL_TEXTURE_2D, TextureId);
|
||||
GL.PixelStore(GL_UNPACK_ALIGNMENT, alignment);
|
||||
|
@ -9,7 +9,7 @@ namespace Quik.OpenTK
|
||||
|
||||
private List<int> _reclaimList = new List<int>();
|
||||
|
||||
public QuikTexture CreateTexture(QuikVec2 size, bool mipmaps, QuikImageFormat format)
|
||||
public QuikTexture CreateTexture(QVec2 size, bool mipmaps, QuikImageFormat format)
|
||||
{
|
||||
return new OpenGLTexture(this, format, size, mipmaps);
|
||||
}
|
||||
|
@ -9,14 +9,14 @@ namespace Quik.CommandMachine
|
||||
private readonly Stack<int> _zStack = new Stack<int>();
|
||||
public int ZIndex => _zIndex;
|
||||
|
||||
private QuikRectangle _viewport;
|
||||
private readonly Stack<QuikRectangle> _viewportStack = new Stack<QuikRectangle>();
|
||||
private QRectangle _viewport;
|
||||
private readonly Stack<QRectangle> _viewportStack = new Stack<QRectangle>();
|
||||
private readonly Stack<object> _matrixStack = new Stack<object>();
|
||||
|
||||
private Command _customCommandBase = Command.CustomCommandBase;
|
||||
private readonly List<QuikCommandHandler> _customCommands = new List<QuikCommandHandler>();
|
||||
|
||||
public QuikRectangle Viewport => _viewport;
|
||||
public QRectangle Viewport => _viewport;
|
||||
|
||||
// TODO: Make a real matrix class.
|
||||
public float[] ActiveTransforms { get; }
|
||||
@ -35,7 +35,7 @@ namespace Quik.CommandMachine
|
||||
return id;
|
||||
}
|
||||
|
||||
public void ProcessCommands(QuikRectangle bounds, CommandQueue queue)
|
||||
public void ProcessCommands(QRectangle bounds, CommandQueue queue)
|
||||
{
|
||||
if (!queue.Peek().IsCommand)
|
||||
throw new ArgumentException("The first element in the queue must be a command frame.");
|
||||
@ -72,13 +72,13 @@ namespace Quik.CommandMachine
|
||||
_viewportStack.Push(_viewport);
|
||||
break;
|
||||
case Command.IntersectViewport:
|
||||
_viewport = QuikRectangle.Intersect((QuikRectangle)queue.Dequeue(), _viewport);
|
||||
_viewport = QRectangle.Intersect((QRectangle)queue.Dequeue(), _viewport);
|
||||
break;
|
||||
case Command.StoreViewport:
|
||||
_viewport = (QuikRectangle)queue.Dequeue();
|
||||
_viewport = (QRectangle)queue.Dequeue();
|
||||
break;
|
||||
case Command.PopViewport:
|
||||
_viewport = _viewportStack.TryPop(out QuikRectangle viewport) ? viewport : bounds;
|
||||
_viewport = _viewportStack.TryPop(out QRectangle viewport) ? viewport : bounds;
|
||||
break;
|
||||
case Command.PushZ:
|
||||
_zStack.Push(_zIndex);
|
||||
@ -111,7 +111,7 @@ namespace Quik.CommandMachine
|
||||
_zIndex = 0;
|
||||
_zStack.Clear();
|
||||
|
||||
_viewport = new QuikRectangle(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue);
|
||||
_viewport = new QRectangle(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue);
|
||||
_viewportStack.Clear();
|
||||
|
||||
_matrixStack.Clear();
|
||||
|
@ -33,13 +33,13 @@ namespace Quik.CommandMachine
|
||||
Enqueue(Command.PushViewport);
|
||||
}
|
||||
|
||||
public void IntersectViewport(in QuikRectangle viewport)
|
||||
public void IntersectViewport(in QRectangle viewport)
|
||||
{
|
||||
Enqueue(Command.IntersectViewport);
|
||||
Enqueue(viewport);
|
||||
}
|
||||
|
||||
public void StoreViewport(in QuikRectangle viewport)
|
||||
public void StoreViewport(in QRectangle viewport)
|
||||
{
|
||||
Enqueue(Command.StoreViewport);
|
||||
Enqueue(viewport);
|
||||
@ -93,21 +93,21 @@ namespace Quik.CommandMachine
|
||||
Enqueue(Command.PopZ);
|
||||
}
|
||||
|
||||
public void Line(in QuikLine line)
|
||||
public void Line(in QLine line)
|
||||
{
|
||||
Enqueue(Command.Line);
|
||||
Enqueue(line);
|
||||
}
|
||||
|
||||
public void Line(params QuikLine[] lines)
|
||||
public void Line(params QLine[] lines)
|
||||
{
|
||||
Enqueue(Command.Line);
|
||||
Enqueue((Frame)lines.Length);
|
||||
foreach (QuikLine line in lines)
|
||||
foreach (QLine line in lines)
|
||||
Enqueue(line);
|
||||
}
|
||||
|
||||
public void Bezier(in QuikBezier bezier)
|
||||
public void Bezier(in QBezier bezier)
|
||||
{
|
||||
Frame a, b;
|
||||
Frame.Create(bezier, out a, out b);
|
||||
@ -117,14 +117,14 @@ namespace Quik.CommandMachine
|
||||
Enqueue(b);
|
||||
}
|
||||
|
||||
public void Bezier(params QuikBezier[] beziers)
|
||||
public void Bezier(params QBezier[] beziers)
|
||||
{
|
||||
Frame a, b;
|
||||
|
||||
Enqueue(Command.Bezier);
|
||||
Enqueue((Frame)beziers.Length);
|
||||
|
||||
foreach (QuikBezier bezier in beziers)
|
||||
foreach (QBezier bezier in beziers)
|
||||
{
|
||||
Frame.Create(bezier, out a, out b);
|
||||
Enqueue(a);
|
||||
@ -132,21 +132,21 @@ namespace Quik.CommandMachine
|
||||
}
|
||||
}
|
||||
|
||||
public void Rectangle(in QuikRectangle rectangle)
|
||||
public void Rectangle(in QRectangle rectangle)
|
||||
{
|
||||
Enqueue(Command.Rectangle);
|
||||
Enqueue(rectangle);
|
||||
}
|
||||
|
||||
public void Rectangle(QuikRectangle[] rectangles)
|
||||
public void Rectangle(QRectangle[] rectangles)
|
||||
{
|
||||
Enqueue(Command.Rectangle);
|
||||
Enqueue((Frame)rectangles.Length);
|
||||
foreach (QuikRectangle rectangle in rectangles)
|
||||
foreach (QRectangle rectangle in rectangles)
|
||||
Enqueue(rectangle);
|
||||
}
|
||||
|
||||
public void Ellipse(in QuikEllipse ellipse)
|
||||
public void Ellipse(in QEllipse ellipse)
|
||||
{
|
||||
Frame a, b;
|
||||
Frame.Create(ellipse, out a, out b);
|
||||
@ -156,12 +156,12 @@ namespace Quik.CommandMachine
|
||||
Enqueue(b);
|
||||
}
|
||||
|
||||
public void Ellipse(params QuikEllipse[] ellipses)
|
||||
public void Ellipse(params QEllipse[] ellipses)
|
||||
{
|
||||
Frame a, b;
|
||||
Enqueue(Command.Ellipse);
|
||||
Enqueue((Frame)ellipses.Length);
|
||||
foreach (QuikEllipse ellipse in ellipses)
|
||||
foreach (QEllipse ellipse in ellipses)
|
||||
{
|
||||
Frame.Create(ellipse, out a, out b);
|
||||
Enqueue(a);
|
||||
@ -169,7 +169,7 @@ namespace Quik.CommandMachine
|
||||
}
|
||||
}
|
||||
|
||||
public void Triangle(in QuikTriangle triangle)
|
||||
public void Triangle(in QTriangle triangle)
|
||||
{
|
||||
Enqueue(Command.Triangle);
|
||||
Enqueue(triangle.A);
|
||||
@ -177,11 +177,11 @@ namespace Quik.CommandMachine
|
||||
Enqueue(triangle.C);
|
||||
}
|
||||
|
||||
public void Triangle(params QuikTriangle[] triangles)
|
||||
public void Triangle(params QTriangle[] triangles)
|
||||
{
|
||||
Enqueue(Command.Triangle);
|
||||
Enqueue((Frame)triangles.Length);
|
||||
foreach (QuikTriangle triangle in triangles)
|
||||
foreach (QTriangle triangle in triangles)
|
||||
{
|
||||
Enqueue(triangle.A);
|
||||
Enqueue(triangle.B);
|
||||
@ -189,17 +189,17 @@ namespace Quik.CommandMachine
|
||||
}
|
||||
}
|
||||
|
||||
public void Polygon(params QuikVec2[] polygon)
|
||||
public void Polygon(params QVec2[] polygon)
|
||||
{
|
||||
Enqueue(Command.Polygon);
|
||||
Enqueue((Frame)polygon.Length);
|
||||
foreach (QuikVec2 vertex in polygon)
|
||||
foreach (QVec2 vertex in polygon)
|
||||
{
|
||||
Enqueue(vertex);
|
||||
}
|
||||
}
|
||||
|
||||
public void Image(QuikTexture texture, in QuikRectangle rectangle)
|
||||
public void Image(QuikTexture texture, in QRectangle rectangle)
|
||||
{
|
||||
Enqueue(Command.Image);
|
||||
Enqueue((Frame)(int)ImageCommandFlags.Single);
|
||||
@ -207,7 +207,7 @@ namespace Quik.CommandMachine
|
||||
Enqueue(rectangle);
|
||||
}
|
||||
|
||||
public void Image(QuikTexture texture, in QuikRectangle rectangle, in QuikRectangle uv)
|
||||
public void Image(QuikTexture texture, in QRectangle rectangle, in QRectangle uv)
|
||||
{
|
||||
Enqueue(Command.Image);
|
||||
Enqueue((Frame)(int)(ImageCommandFlags.Single | ImageCommandFlags.UVs));
|
||||
@ -216,7 +216,7 @@ namespace Quik.CommandMachine
|
||||
Enqueue(uv);
|
||||
}
|
||||
|
||||
public void Image(QuikTexture texture, QuikRectangle[] rectangles, bool interleavedUV = false)
|
||||
public void Image(QuikTexture texture, QRectangle[] rectangles, bool interleavedUV = false)
|
||||
{
|
||||
ImageCommandFlags flags = interleavedUV ? ImageCommandFlags.UVs : ImageCommandFlags.None;
|
||||
|
||||
@ -224,13 +224,13 @@ namespace Quik.CommandMachine
|
||||
Enqueue(new Frame((int)flags, rectangles.Length / 2));
|
||||
Enqueue(new Frame(texture));
|
||||
|
||||
foreach (QuikRectangle rectangle in rectangles)
|
||||
foreach (QRectangle rectangle in rectangles)
|
||||
{
|
||||
Enqueue(rectangle);
|
||||
}
|
||||
}
|
||||
|
||||
public void Image(QuikTexture texture, QuikRectangle[] rectangles, QuikRectangle[] uvs)
|
||||
public void Image(QuikTexture texture, QRectangle[] rectangles, QRectangle[] uvs)
|
||||
{
|
||||
int count = Math.Min(rectangles.Length, uvs.Length);
|
||||
Enqueue(Command.Image);
|
||||
|
@ -229,34 +229,34 @@ namespace Quik.CommandMachine
|
||||
public static explicit operator int(in Frame frame) => frame._i1;
|
||||
public static explicit operator float(in Frame frame) => frame._f1;
|
||||
public static explicit operator Command(in Frame frame) => (Command)frame._i1;
|
||||
public static explicit operator QuikVec2(in Frame frame) =>
|
||||
frame.IsFloat ? new QuikVec2(frame._f1, frame._f2) : new QuikVec2(frame._i1, frame._i2);
|
||||
public static explicit operator QuikColor(in Frame frame) =>
|
||||
new QuikColor((byte)frame._i1, (byte)frame._i2, (byte)frame._i3, (byte)frame._i4);
|
||||
public static explicit operator QuikRectangle(in Frame frame) =>
|
||||
public static explicit operator QVec2(in Frame frame) =>
|
||||
frame.IsFloat ? new QVec2(frame._f1, frame._f2) : new QVec2(frame._i1, frame._i2);
|
||||
public static explicit operator QColor(in Frame frame) =>
|
||||
new QColor((byte)frame._i1, (byte)frame._i2, (byte)frame._i3, (byte)frame._i4);
|
||||
public static explicit operator QRectangle(in Frame frame) =>
|
||||
frame.IsFloat ?
|
||||
new QuikRectangle(frame._f1, frame._f2, frame._f3, frame._f4) :
|
||||
new QuikRectangle(frame._i1, frame._i2, frame._i3, frame._i4);
|
||||
public static explicit operator QuikLine(in Frame frame) =>
|
||||
new QRectangle(frame._f1, frame._f2, frame._f3, frame._f4) :
|
||||
new QRectangle(frame._i1, frame._i2, frame._i3, frame._i4);
|
||||
public static explicit operator QLine(in Frame frame) =>
|
||||
frame.IsFloat ?
|
||||
new QuikLine(frame._f1, frame._f2, frame._f3, frame._f4) :
|
||||
new QuikLine(frame._i1, frame._i2, frame._i3, frame._i4);
|
||||
new QLine(frame._f1, frame._f2, frame._f3, frame._f4) :
|
||||
new QLine(frame._i1, frame._i2, frame._i3, frame._i4);
|
||||
|
||||
public static explicit operator Frame(int i) => new Frame(i);
|
||||
public static explicit operator Frame(float f) => new Frame(f);
|
||||
public static implicit operator Frame(Command cmd) => new Frame(cmd);
|
||||
public static implicit operator Frame(in QuikVec2 vector) => new Frame(vector.X, vector.Y);
|
||||
public static implicit operator Frame(in QuikColor color) => new Frame(color.R, color.G, color.B, color.A);
|
||||
public static implicit operator Frame(in QuikRectangle rect) => new Frame(rect.Max.X, rect.Max.Y, rect.Min.X, rect.Min.Y);
|
||||
public static implicit operator Frame(in QuikLine line) => new Frame(line.Start.X, line.Start.Y, line.End.X, line.Start.Y);
|
||||
public static implicit operator Frame(in QVec2 vector) => new Frame(vector.X, vector.Y);
|
||||
public static implicit operator Frame(in QColor color) => new Frame(color.R, color.G, color.B, color.A);
|
||||
public static implicit operator Frame(in QRectangle rect) => new Frame(rect.Max.X, rect.Max.Y, rect.Min.X, rect.Min.Y);
|
||||
public static implicit operator Frame(in QLine line) => new Frame(line.Start.X, line.Start.Y, line.End.X, line.Start.Y);
|
||||
|
||||
public static void Create(in QuikBezier bezier, out Frame a, out Frame b)
|
||||
public static void Create(in QBezier bezier, out Frame a, out Frame b)
|
||||
{
|
||||
a = new Frame(bezier.Start.X, bezier.Start.Y, bezier.End.X, bezier.End.Y);
|
||||
b = new Frame(bezier.ControlA.X, bezier.ControlA.Y, bezier.ControlB.X, bezier.ControlB.Y);
|
||||
}
|
||||
|
||||
public static void Create(in QuikEllipse ellipse, out Frame a, out Frame b)
|
||||
public static void Create(in QEllipse ellipse, out Frame a, out Frame b)
|
||||
{
|
||||
a = new Frame(ellipse.Center.X, ellipse.Center.Y);
|
||||
b = new Frame(ellipse.AxisA.X, ellipse.AxisA.Y, ellipse.AxisB.X, ellipse.AxisB.Y);
|
||||
|
@ -1,3 +1,4 @@
|
||||
using Quik.CommandMachine;
|
||||
using Quik.Typography;
|
||||
|
||||
namespace Quik.Controls
|
||||
@ -60,46 +61,47 @@ namespace Quik.Controls
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnPaint(QuikDraw draw)
|
||||
protected override void OnPaint(CommandQueue draw)
|
||||
{
|
||||
QuikRectangle bounds = AbsoluteBounds;
|
||||
QRectangle bounds = AbsoluteBounds;
|
||||
|
||||
switch (_class)
|
||||
{
|
||||
default:
|
||||
case ButtonClass.Normal:
|
||||
draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
StrokeStyle = NormalStroke,
|
||||
FillStyle = NormalFill
|
||||
});
|
||||
break;
|
||||
case ButtonClass.Hover:
|
||||
draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
StrokeStyle = HoverStroke,
|
||||
FillStyle = HoverFill
|
||||
});
|
||||
break;
|
||||
case ButtonClass.Active:
|
||||
draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
StrokeStyle = ActiveStroke,
|
||||
FillStyle = ActiveFill
|
||||
});
|
||||
draw.Rectangle(bounds);
|
||||
// draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
// StrokeStyle = NormalStroke,
|
||||
// FillStyle = NormalFill
|
||||
// });
|
||||
break;
|
||||
// case ButtonClass.Hover:
|
||||
// draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
// StrokeStyle = HoverStroke,
|
||||
// FillStyle = HoverFill
|
||||
// });
|
||||
// break;
|
||||
// case ButtonClass.Active:
|
||||
// draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
|
||||
// StrokeStyle = ActiveStroke,
|
||||
// FillStyle = ActiveFill
|
||||
// });
|
||||
// break;
|
||||
}
|
||||
|
||||
// Position the text so that it is centered.
|
||||
float ascender = Root.Context.DefaultFont.Ascender;
|
||||
float descender = -Root.Context.DefaultFont.Descender;
|
||||
QuikVec2 position =
|
||||
bounds.Min +
|
||||
new QuikVec2(
|
||||
Padding,
|
||||
(
|
||||
(bounds.Size.Y - ascender - descender) /
|
||||
2)
|
||||
+ descender);
|
||||
// float ascender = Root.Context.DefaultFont.Ascender;
|
||||
// float descender = -Root.Context.DefaultFont.Descender;
|
||||
// QuikVec2 position =
|
||||
// bounds.Min +
|
||||
// new QuikVec2(
|
||||
// Padding,
|
||||
// (
|
||||
// (bounds.Size.Y - ascender - descender) /
|
||||
// 2)
|
||||
// + descender);
|
||||
|
||||
draw.PutText(Text, position);
|
||||
// draw.PutText(Text, position);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Quik.CommandMachine;
|
||||
|
||||
namespace Quik.Controls
|
||||
{
|
||||
@ -86,7 +87,7 @@ namespace Quik.Controls
|
||||
}
|
||||
}
|
||||
|
||||
internal override void NotifyPaint(QuikDraw draw)
|
||||
internal override void NotifyPaint(CommandQueue draw)
|
||||
{
|
||||
base.NotifyPaint(draw);
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using Quik.CommandMachine;
|
||||
|
||||
namespace Quik.Controls
|
||||
{
|
||||
@ -10,18 +11,18 @@ namespace Quik.Controls
|
||||
|
||||
protected RootControl Root { get; set; } = null;
|
||||
|
||||
public QuikRectangle Bounds { get; set; }
|
||||
public QRectangle Bounds { get; set; }
|
||||
|
||||
public bool Focused { get => Root.FocusedControl == this; }
|
||||
|
||||
public QuikRectangle AbsoluteBounds
|
||||
public QRectangle AbsoluteBounds
|
||||
{
|
||||
get => Parent is null
|
||||
? Bounds
|
||||
: new QuikRectangle(Parent.Bounds.Min + Bounds.Max, Parent.Bounds.Min + Bounds.Min);
|
||||
: new QRectangle(Parent.Bounds.Min + Bounds.Max, Parent.Bounds.Min + Bounds.Min);
|
||||
set => Bounds = Parent is null
|
||||
? value
|
||||
: new QuikRectangle(value.Min - Parent.Bounds.Min, value.Max - Parent.Bounds.Min);
|
||||
: new QRectangle(value.Min - Parent.Bounds.Min, value.Max - Parent.Bounds.Min);
|
||||
}
|
||||
|
||||
private MouseButton DownButtons;
|
||||
@ -29,7 +30,7 @@ namespace Quik.Controls
|
||||
// Hierarchy events.
|
||||
|
||||
public event EventHandler Update;
|
||||
public event EventHandler<QuikDraw> Paint;
|
||||
public event EventHandler<CommandQueue> Paint;
|
||||
public event EventHandler<RootChangedEventArgs> RootChanging;
|
||||
public event EventHandler<ParentChangedEventArgs> ParentChanging;
|
||||
public event EventHandler<FocusChangedEventArgs> FocusLost;
|
||||
@ -46,7 +47,7 @@ namespace Quik.Controls
|
||||
public event EventHandler<MouseMoveEventArgs> MouseLeave;
|
||||
|
||||
protected virtual void OnUpdate() => Update?.Invoke(this, EventArgs.Empty);
|
||||
protected virtual void OnPaint(QuikDraw draw) => Paint?.Invoke(this, draw);
|
||||
protected virtual void OnPaint(CommandQueue draw) => Paint?.Invoke(this, draw);
|
||||
protected virtual void OnParentChanging(ParentChangedEventArgs args) => ParentChanging?.Invoke(this, args);
|
||||
protected virtual void OnRootChanging(RootChangedEventArgs args) => RootChanging?.Invoke(this, args);
|
||||
protected virtual void OnFocusLost(FocusChangedEventArgs args) => FocusLost?.Invoke(this, args);
|
||||
@ -70,7 +71,7 @@ namespace Quik.Controls
|
||||
OnUpdate();
|
||||
}
|
||||
|
||||
internal virtual void NotifyPaint(QuikDraw draw)
|
||||
internal virtual void NotifyPaint(CommandQueue draw)
|
||||
{
|
||||
OnPaint(draw);
|
||||
}
|
||||
@ -101,7 +102,7 @@ namespace Quik.Controls
|
||||
|
||||
internal virtual void NotifyMouseMove(MouseMoveEventArgs args)
|
||||
{
|
||||
QuikRectangle bounds = AbsoluteBounds;
|
||||
QRectangle bounds = AbsoluteBounds;
|
||||
|
||||
if (bounds.Contains(args.AbsolutePosition))
|
||||
{
|
||||
|
@ -1,3 +1,4 @@
|
||||
using Quik.CommandMachine;
|
||||
using Quik.Typography;
|
||||
|
||||
namespace Quik.Controls
|
||||
@ -11,26 +12,26 @@ namespace Quik.Controls
|
||||
|
||||
public QuikFont Font { get; set; }
|
||||
|
||||
protected override void OnPaint(QuikDraw draw)
|
||||
{
|
||||
if (MultiLine)
|
||||
{
|
||||
QuikRectangle absolute = AbsoluteBounds;
|
||||
QuikVec2 paddingVector = new QuikVec2(Padding, Padding);
|
||||
QuikRectangle rectangle;
|
||||
rectangle.Min = absolute.Min + paddingVector;
|
||||
rectangle.Max = absolute.Min - paddingVector;
|
||||
// protected override void OnPaint(CommandQueue draw)
|
||||
// {
|
||||
// if (MultiLine)
|
||||
// {
|
||||
// QuikRectangle absolute = AbsoluteBounds;
|
||||
// QuikVec2 paddingVector = new QuikVec2(Padding, Padding);
|
||||
// QuikRectangle rectangle;
|
||||
// rectangle.Min = absolute.Min + paddingVector;
|
||||
// rectangle.Max = absolute.Min - paddingVector;
|
||||
|
||||
// FIXME: For now use a puttext command.
|
||||
draw.PutText(Text, rectangle.Min + new QuikVec2(0, rectangle.Size.Y / 3f));
|
||||
// // FIXME: For now use a puttext command.
|
||||
// draw.PutText(Text, rectangle.Min + new QuikVec2(0, rectangle.Size.Y / 3f));
|
||||
|
||||
// draw.FlowText(Text, rectangle);
|
||||
}
|
||||
else
|
||||
{
|
||||
QuikVec2 position = AbsoluteBounds.Min + new QuikVec2(Padding, Padding + AbsoluteBounds.Size.Y / 3f);
|
||||
draw.PutText(Text, position);
|
||||
}
|
||||
}
|
||||
// // draw.FlowText(Text, rectangle);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// QuikVec2 position = AbsoluteBounds.Min + new QuikVec2(Padding, Padding + AbsoluteBounds.Size.Y / 3f);
|
||||
// draw.PutText(Text, position);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
@ -1,14 +1,16 @@
|
||||
|
||||
using Quik.CommandMachine;
|
||||
|
||||
namespace Quik.Controls
|
||||
{
|
||||
public sealed class RootControl : Container
|
||||
{
|
||||
public QuikContext Context { get; }
|
||||
// public QuikContext Context { get; }
|
||||
public Control FocusedControl { get; private set; }
|
||||
|
||||
public RootControl(QuikContext context)
|
||||
public RootControl(object context)
|
||||
{
|
||||
Context = context;
|
||||
// Context = context;
|
||||
}
|
||||
|
||||
public void Focus(Control which)
|
||||
@ -24,7 +26,7 @@ namespace Quik.Controls
|
||||
base.NotifyUpdate();
|
||||
}
|
||||
|
||||
public new void NotifyPaint(QuikDraw draw)
|
||||
public new void NotifyPaint(CommandQueue draw)
|
||||
{
|
||||
base.NotifyPaint(draw);
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ namespace Quik
|
||||
/// <param name="size">Size of the texture data.</param>
|
||||
/// <param name="level">Mip level.</param>
|
||||
/// <param name="alignment">Pixel alignment. Expected to be 1, 2, 4, or 8.</param>
|
||||
public abstract void Image(IntPtr data, QuikImageFormat format, QuikVec2 size, int level, int alignment = 4);
|
||||
public abstract void Image(IntPtr data, QuikImageFormat format, QVec2 size, int level, int alignment = 4);
|
||||
|
||||
/// <summary>
|
||||
/// Upload texture data.
|
||||
@ -50,7 +50,7 @@ namespace Quik
|
||||
/// <param name="location">Location of the data in the texture.</param>
|
||||
/// <param name="level">Mip level.</param>
|
||||
/// <param name="alignment">Pixel alignment. Expected to be 1, 2, 4, or 8.</param>
|
||||
public abstract void SubImage(IntPtr data, QuikImageFormat format, QuikRectangle location, int level, int alignment = 4);
|
||||
public abstract void SubImage(IntPtr data, QuikImageFormat format, QRectangle location, int level, int alignment = 4);
|
||||
|
||||
/// <summary>
|
||||
/// Generate the mip maps for the texture.
|
||||
|
@ -8,7 +8,7 @@ namespace Quik
|
||||
/// <summary>
|
||||
/// The context that owns the texture manager.
|
||||
/// </summary>
|
||||
QuikContext Context { get; set; }
|
||||
// QuikContext Context { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a texture.
|
||||
@ -21,7 +21,7 @@ namespace Quik
|
||||
/// All parameters are hints. If there is a situation where the texture does not
|
||||
/// have mip levels, or format cannot be specified, ignore these parameters.
|
||||
/// </remarks>
|
||||
QuikTexture CreateTexture(QuikVec2 size, bool mipmaps, QuikImageFormat format);
|
||||
QuikTexture CreateTexture(QVec2 size, bool mipmaps, QuikImageFormat format);
|
||||
|
||||
/// <summary>
|
||||
/// A function called on context clear. (useful for discarding old textures)
|
||||
|
@ -16,10 +16,10 @@ namespace Quik
|
||||
|
||||
public struct MouseState
|
||||
{
|
||||
public readonly QuikVec2 AbsolutePosition;
|
||||
public readonly QVec2 AbsolutePosition;
|
||||
public readonly MouseButton ButtonsDown;
|
||||
|
||||
public MouseState(QuikVec2 position, MouseButton down)
|
||||
public MouseState(QVec2 position, MouseButton down)
|
||||
{
|
||||
AbsolutePosition = position;
|
||||
ButtonsDown = down;
|
||||
@ -28,21 +28,21 @@ namespace Quik
|
||||
|
||||
public class MouseButtonEventArgs : EventArgs
|
||||
{
|
||||
public QuikVec2 AbsolutePosition { get; }
|
||||
public QVec2 AbsolutePosition { get; }
|
||||
public MouseButton Buttons { get; }
|
||||
|
||||
public MouseButtonEventArgs(QuikVec2 position, MouseButton buttons)
|
||||
public MouseButtonEventArgs(QVec2 position, MouseButton buttons)
|
||||
{
|
||||
AbsolutePosition = position;
|
||||
Buttons = buttons;
|
||||
}
|
||||
|
||||
public QuikVec2 RelativePosition(QuikVec2 origin)
|
||||
public QVec2 RelativePosition(QVec2 origin)
|
||||
{
|
||||
return AbsolutePosition - origin;
|
||||
}
|
||||
|
||||
public QuikVec2 RelativePosition(Controls.Control control)
|
||||
public QVec2 RelativePosition(Controls.Control control)
|
||||
{
|
||||
return AbsolutePosition - control.AbsoluteBounds.Min;
|
||||
}
|
||||
@ -50,23 +50,23 @@ namespace Quik
|
||||
|
||||
public class MouseMoveEventArgs : EventArgs
|
||||
{
|
||||
public QuikVec2 AbsolutePosition { get; }
|
||||
public QuikVec2 LastPosition { get; }
|
||||
public QuikVec2 Motion { get; }
|
||||
public QVec2 AbsolutePosition { get; }
|
||||
public QVec2 LastPosition { get; }
|
||||
public QVec2 Motion { get; }
|
||||
|
||||
public MouseMoveEventArgs(QuikVec2 position, QuikVec2 lastPosition)
|
||||
public MouseMoveEventArgs(QVec2 position, QVec2 lastPosition)
|
||||
{
|
||||
AbsolutePosition = position;
|
||||
LastPosition = lastPosition;
|
||||
Motion = position - lastPosition;
|
||||
}
|
||||
|
||||
public QuikVec2 RelativePosition(QuikVec2 origin)
|
||||
public QVec2 RelativePosition(QVec2 origin)
|
||||
{
|
||||
return AbsolutePosition - origin;
|
||||
}
|
||||
|
||||
public QuikVec2 RelativePosition(Controls.Control control)
|
||||
public QVec2 RelativePosition(Controls.Control control)
|
||||
{
|
||||
return AbsolutePosition - control.AbsoluteBounds.Min;
|
||||
}
|
||||
|
10
Quik/QuikApplication.cs
Normal file
10
Quik/QuikApplication.cs
Normal file
@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Quik
|
||||
{
|
||||
public class QuikApplication
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -1,645 +0,0 @@
|
||||
namespace Quik
|
||||
{
|
||||
/// <summary>
|
||||
/// Enumeration of QUIK commands.
|
||||
/// </summary>
|
||||
public enum QuikCommandType
|
||||
{
|
||||
/// <summary>
|
||||
/// Nothing.
|
||||
/// </summary>
|
||||
/// <seealso cref="QuikCommandNone"/>
|
||||
None,
|
||||
|
||||
/// <summary>
|
||||
/// Set a mask region.
|
||||
/// </summary>
|
||||
Mask,
|
||||
|
||||
/// <summary>
|
||||
/// Draw a line.
|
||||
/// </summary>
|
||||
/// <seealso cref="QuikCommandLine"/>
|
||||
Line,
|
||||
|
||||
/// <summary>
|
||||
/// Draw multiple lines.
|
||||
/// </summary>
|
||||
Lines,
|
||||
|
||||
/// <summary>
|
||||
/// Draw a Bezier curve.
|
||||
/// </summary>
|
||||
Bezier,
|
||||
|
||||
/// <summary>
|
||||
/// Draw a rectangle.
|
||||
/// </summary>
|
||||
Rectangle,
|
||||
|
||||
/// <summary>
|
||||
/// Draw multiple rectangles.
|
||||
/// </summary>
|
||||
Rectangles,
|
||||
|
||||
/// <summary>
|
||||
/// Draw an ellipse.
|
||||
/// </summary>
|
||||
Ellipse,
|
||||
|
||||
/// <summary>
|
||||
/// Draw multiple ellipses.
|
||||
/// </summary>
|
||||
Ellipses,
|
||||
|
||||
/// <summary>
|
||||
/// Draw a triangle.
|
||||
/// </summary>
|
||||
Triangle,
|
||||
|
||||
/// <summary>
|
||||
/// Draw multiple triangles.
|
||||
/// </summary>
|
||||
Triangles,
|
||||
|
||||
/// <summary>
|
||||
/// Draw a polygon.
|
||||
/// </summary>
|
||||
Polygon,
|
||||
|
||||
/// <summary>
|
||||
/// Put a character.
|
||||
/// </summary>
|
||||
PutChar,
|
||||
|
||||
/// <summary>
|
||||
/// Put text.
|
||||
/// </summary>
|
||||
PutText,
|
||||
|
||||
/// <summary>
|
||||
/// Flow text in box.
|
||||
/// </summary>
|
||||
FlowText,
|
||||
|
||||
EmitTypeset,
|
||||
|
||||
/// <summary>
|
||||
/// Clear the image mask.
|
||||
/// </summary>
|
||||
StencilMaskClear,
|
||||
|
||||
/// <summary>
|
||||
/// Create an image mask with the following commands.
|
||||
/// </summary>
|
||||
StencilMaskBegin,
|
||||
|
||||
/// <summary>
|
||||
/// End the image mask commands.
|
||||
/// </summary>
|
||||
StencilMaskEnd,
|
||||
|
||||
/// <summary>
|
||||
/// Draw an image.
|
||||
/// </summary>
|
||||
Image,
|
||||
|
||||
/// <summary>
|
||||
/// Begin defining custom commands after this value.
|
||||
/// </summary>
|
||||
/// <seealso cref="QuikCommand"/>
|
||||
CustomCommandRange = 1024,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A single QUIK command.
|
||||
/// </summary>
|
||||
public abstract class QuikCommand
|
||||
{
|
||||
/// <summary>
|
||||
/// The type ID for the QUIK command.
|
||||
/// </summary>
|
||||
public abstract QuikCommandType Type { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does nothing.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandNone : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.None;
|
||||
}
|
||||
|
||||
public sealed class QuikCommandMask : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Mask;
|
||||
|
||||
public QuikRectangle Bounds { get; }
|
||||
|
||||
public QuikCommandMask(QuikRectangle bounds)
|
||||
{
|
||||
Bounds = bounds;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws a line.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandLine : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Line;
|
||||
|
||||
/// <summary>
|
||||
/// The line to draw.
|
||||
/// </summary>
|
||||
public QuikLine Line { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the line.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle Style { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw line command.
|
||||
/// </summary>
|
||||
/// <param name="line">The line to draw.</param>
|
||||
public QuikCommandLine(QuikLine line)
|
||||
{
|
||||
Line = line;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw multiple lines.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandLines : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Lines;
|
||||
|
||||
/// <summary>
|
||||
/// The array of lines to draw.
|
||||
/// </summary>
|
||||
public QuikLine[] Lines { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the lines.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle Style { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw lines command.
|
||||
/// </summary>
|
||||
/// <param name="lines">The lines to draw.</param>
|
||||
public QuikCommandLines(QuikLine[] lines)
|
||||
{
|
||||
Lines = lines;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw a Bezier curve.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandBezier : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Bezier;
|
||||
|
||||
/// <summary>
|
||||
/// The Bezier curve segments to draw.
|
||||
/// </summary>
|
||||
public QuikBezier[] Segments;
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the curve.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle Style { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw Bezier curve command.
|
||||
/// </summary>
|
||||
/// <param name="segments">The Bezier curve segments to draw.</param>
|
||||
public QuikCommandBezier(QuikBezier[] segments)
|
||||
{
|
||||
Segments = segments;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw a rectangle.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandRectangle : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Rectangle;
|
||||
|
||||
/// <summary>
|
||||
/// The rectangle to draw.
|
||||
/// </summary>
|
||||
public QuikRectangle Rectangle { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Radius for round corners.
|
||||
/// </summary>
|
||||
public float CornerRadius { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw rectangle command.
|
||||
/// </summary>
|
||||
/// <param name="rectangle">The rectangle to draw.</param>
|
||||
public QuikCommandRectangle(QuikRectangle rectangle)
|
||||
{
|
||||
Rectangle = rectangle;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw rectangles.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandRectangles : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Rectangles;
|
||||
|
||||
/// <summary>
|
||||
/// The rectangles to draw.
|
||||
/// </summary>
|
||||
public QuikRectangle[] Rectangles { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Radius for round corners.
|
||||
/// </summary>
|
||||
public float CornerRadius { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw rectangles commands.
|
||||
/// </summary>
|
||||
/// <param name="rectangles">The rectangles to draw.</param>
|
||||
public QuikCommandRectangles(QuikRectangle[] rectangles)
|
||||
{
|
||||
Rectangles = rectangles;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw an ellipse.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandEllipse : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Ellipse;
|
||||
|
||||
/// <summary>
|
||||
/// The ellipse to draw.
|
||||
/// </summary>
|
||||
public QuikEllipse Ellipse { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw ellipse command.
|
||||
/// </summary>
|
||||
/// <param name="ellipse">The ellipse to draw.</param>
|
||||
public QuikCommandEllipse(QuikEllipse ellipse)
|
||||
{
|
||||
Ellipse = ellipse;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw ellipses.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandEllipses : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Ellipses;
|
||||
|
||||
/// <summary>
|
||||
/// The ellipses to draw.
|
||||
/// </summary>
|
||||
public QuikEllipse[] Ellipses { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw ellipses command.
|
||||
/// </summary>
|
||||
/// <param name="ellipses">The ellipses to draw.</param>
|
||||
public QuikCommandEllipses(QuikEllipse[] ellipses)
|
||||
{
|
||||
Ellipses = ellipses;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw triangle command.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandTriangle : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Triangle;
|
||||
|
||||
/// <summary>
|
||||
/// The triangle to draw.
|
||||
/// </summary>
|
||||
public QuikTriangle Triangle { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw triangle command.
|
||||
/// </summary>
|
||||
/// <param name="triangle">The triangles to draw.</param>
|
||||
public QuikCommandTriangle(QuikTriangle triangle)
|
||||
{
|
||||
Triangle = triangle;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw triangles.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandTriangles : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Triangles;
|
||||
|
||||
/// <summary>
|
||||
/// The triangles to draw.
|
||||
/// </summary>
|
||||
public QuikTriangle[] Triangles { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw triangles command.
|
||||
/// </summary>
|
||||
/// <param name="triangles">The triangles to draw.</param>
|
||||
public QuikCommandTriangles(QuikTriangle[] triangles)
|
||||
{
|
||||
Triangles = triangles;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw a polygon.
|
||||
/// </summary>
|
||||
/// <remarks>Behavior is defined by rendering backend for concave polygons.</remarks>
|
||||
public sealed class QuikCommandPolygon : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Polygon;
|
||||
|
||||
/// <summary>
|
||||
/// The vertices that make up the polygon.
|
||||
/// </summary>
|
||||
public QuikVec2[] Polygon { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke style of the border.
|
||||
/// </summary>
|
||||
public QuikStrokeStyle StrokeStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Fill style of the contents.
|
||||
/// </summary>
|
||||
public QuikFillStyle FillStyle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a draw polygon command.
|
||||
/// </summary>
|
||||
/// <param name="polygon">The polygon to draw.</param>
|
||||
public QuikCommandPolygon(QuikVec2[] polygon)
|
||||
{
|
||||
Polygon = polygon;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Put a character.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandPutChar : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.PutChar;
|
||||
|
||||
/// <summary>
|
||||
/// The character to put.
|
||||
/// </summary>
|
||||
/// <remarks>This field is integer to accomodate for surrogate pairs.</remarks>
|
||||
public int Character { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The baseline start position of the character.
|
||||
/// </summary>
|
||||
public QuikVec2 Position { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a put character command.
|
||||
/// </summary>
|
||||
/// <param name="character">The character to put.</param>
|
||||
/// <param name="position">The baseline start position of the character.</param>
|
||||
public QuikCommandPutChar(int character, QuikVec2 position)
|
||||
{
|
||||
Character = character;
|
||||
Position = position;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a put character command.
|
||||
/// </summary>
|
||||
/// <param name="character">The character to put.</param>
|
||||
/// <param name="position">The baseline start position of the character.</param>
|
||||
public QuikCommandPutChar(char character, QuikVec2 position) : this((int) character, position)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Put some text.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandPutText : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.PutText;
|
||||
|
||||
/// <summary>
|
||||
/// The text to put.
|
||||
/// </summary>
|
||||
public string Text { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The baseline start position of the text.
|
||||
/// </summary>
|
||||
public QuikVec2 Position { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a put text command.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to put.</param>
|
||||
/// <param name="position">The baseline start position of the text.</param>
|
||||
public QuikCommandPutText(string text, QuikVec2 position)
|
||||
{
|
||||
Text = text;
|
||||
Position = position;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flow text into a box.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandFlowText : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.FlowText;
|
||||
|
||||
/// <summary>
|
||||
/// The text to flow.
|
||||
/// </summary>
|
||||
public string Text { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The flowing box boundaries.
|
||||
/// </summary>
|
||||
public QuikRectangle Bounds { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Create a flow text command.
|
||||
/// </summary>
|
||||
/// <param name="text">The text to flow.</param>
|
||||
/// <param name="bounds">The flowing box boundaries.</param>
|
||||
public QuikCommandFlowText(string text, QuikRectangle bounds)
|
||||
{
|
||||
Text = text;
|
||||
Bounds = bounds;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Emit previously typeset text.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandEmitText : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.EmitTypeset;
|
||||
|
||||
/// <summary>
|
||||
/// The typeset group to emit.
|
||||
/// </summary>
|
||||
public Typography.TypesetGroup Group { get; }
|
||||
|
||||
public QuikVec2 Offset { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Create an emit typeset text command.
|
||||
/// </summary>
|
||||
/// <param name="group">The typeset group to emit.</param>
|
||||
public QuikCommandEmitText(Typography.TypesetGroup group)
|
||||
{
|
||||
Group = group;
|
||||
Offset = new QuikVec2(0, 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an emit typeset text command.
|
||||
/// </summary>
|
||||
/// <param name="group">The typeset group to emit.</param>
|
||||
/// <param name="offset">The offset to emit at.</param>
|
||||
public QuikCommandEmitText(Typography.TypesetGroup group, QuikVec2 offset)
|
||||
{
|
||||
Group = group;
|
||||
Offset = offset;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear the stencil buffer.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandStencilClear : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.StencilMaskClear;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Begin rendering to the stencil buffer.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandStencilBegin : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.StencilMaskBegin;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// End rendering to the stencil buffer.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandStencilEnd : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.StencilMaskEnd;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw an image.
|
||||
/// </summary>
|
||||
public sealed class QuikCommandImage : QuikCommand
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override QuikCommandType Type => QuikCommandType.Image;
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
using Quik.Typography;
|
||||
|
||||
namespace Quik
|
||||
{
|
||||
/// <summary>
|
||||
/// An object which QUIK commands may be issued to.
|
||||
/// </summary>
|
||||
public class QuikContext
|
||||
{
|
||||
/// <summary>
|
||||
/// Draw queue.
|
||||
/// </summary>
|
||||
public QuikDraw Draw { get; } = new QuikDraw();
|
||||
|
||||
/// <summary>
|
||||
/// The object responsible for managing textures.
|
||||
/// </summary>
|
||||
public IQuikTextureManager TextureManager { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The object responsible for managing fonts.
|
||||
/// </summary>
|
||||
public IQuikFontManager FontManager { get; }
|
||||
|
||||
public QuikStrokeStyle DefaultStroke { get; set; } = new QuikStrokeStyle(new QuikColor(0xaaaaaaff), 4);
|
||||
|
||||
public QuikFillStyle DefaultFill { get; set; } = new QuikFillStyle()
|
||||
{
|
||||
Color = new QuikColor(0xeeeeeeff)
|
||||
};
|
||||
|
||||
public QuikFont DefaultFont { get; set; }
|
||||
|
||||
public QuikContext(IQuikTextureManager textureManager, IQuikFontManager fontManager)
|
||||
{
|
||||
TextureManager = textureManager;
|
||||
FontManager = fontManager;
|
||||
TextureManager.Context = FontManager.Context = this;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear the context.
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
Draw.Clear();
|
||||
TextureManager.Clear();
|
||||
FontManager.Clear();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
|
||||
namespace Quik
|
||||
{
|
||||
/// <summary>
|
||||
/// QUIK draw command provider.
|
||||
/// </summary>
|
||||
public class QuikDraw
|
||||
{
|
||||
/// <summary>
|
||||
/// The draw command queue.
|
||||
/// </summary>
|
||||
public Queue<QuikCommand> Commands { get; } = new Queue<QuikCommand>();
|
||||
|
||||
public void Clear() => Commands.Clear();
|
||||
|
||||
public void Mask(QuikRectangle bounds) => Commands.Enqueue(new QuikCommandMask(bounds));
|
||||
public void Line(QuikLine line) => Commands.Enqueue(new QuikCommandLine(line));
|
||||
public void Line(params QuikLine[] lines) => Commands.Enqueue(new QuikCommandLines(lines));
|
||||
public void Line(IEnumerable<QuikLine> lines) => Commands.Enqueue(new QuikCommandLines(lines.ToArray()));
|
||||
public void Bezier(params QuikBezier[] curve) => Commands.Enqueue(new QuikCommandBezier(curve));
|
||||
public void Bezier(IEnumerable<QuikBezier> curve) => Commands.Enqueue(new QuikCommandBezier(curve.ToArray()));
|
||||
public void Rectangle(QuikRectangle rectangle) => Commands.Enqueue(new QuikCommandRectangle(rectangle));
|
||||
public void Rectangle(params QuikRectangle[] rectangles) =>
|
||||
Commands.Enqueue(new QuikCommandRectangles(rectangles));
|
||||
public void Rectangle(IEnumerable<QuikRectangle> rectangles) =>
|
||||
Commands.Enqueue(new QuikCommandRectangles(rectangles.ToArray()));
|
||||
public void Triangle(QuikTriangle triangle) => Commands.Enqueue(new QuikCommandTriangle(triangle));
|
||||
public void Triangle(params QuikTriangle[] triangles) => Commands.Enqueue(new QuikCommandTriangles(triangles));
|
||||
public void Triangle(IEnumerable<QuikTriangle> triangles) =>
|
||||
Commands.Enqueue(new QuikCommandTriangles(triangles.ToArray()));
|
||||
public void Polygon(params QuikVec2[] polygon) => Commands.Enqueue(new QuikCommandPolygon(polygon));
|
||||
public void Polygon(IEnumerable<QuikVec2> polygon) => Commands.Enqueue(new QuikCommandPolygon(polygon.ToArray()));
|
||||
public void StencilClear() => Commands.Enqueue(new QuikCommandStencilClear());
|
||||
public void StencilBegin() => Commands.Enqueue(new QuikCommandStencilBegin());
|
||||
public void StencilEnd() => Commands.Enqueue(new QuikCommandStencilEnd());
|
||||
public void PutChar(char chr, QuikVec2 position) => Commands.Enqueue(new QuikCommandPutChar(chr, position));
|
||||
public void PutText(string text, QuikVec2 position) => Commands.Enqueue(new QuikCommandPutText(text, position));
|
||||
public void FlowText(string text, QuikRectangle bounds) => Commands.Enqueue(new QuikCommandFlowText(text, bounds));
|
||||
}
|
||||
}
|
@ -8,69 +8,69 @@ namespace Quik
|
||||
/// A 2 dimensional Vector.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("({X}, {Y})")]
|
||||
public struct QuikVec2
|
||||
public struct QVec2
|
||||
{
|
||||
public float X;
|
||||
public float Y;
|
||||
|
||||
public float Magnitude => MathF.Sqrt(X * X + Y * Y);
|
||||
|
||||
public QuikVec2(float x, float y)
|
||||
public QVec2(float x, float y)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
}
|
||||
|
||||
public QuikVec2 Normalize() => this * (1.0f / Magnitude);
|
||||
public QVec2 Normalize() => this * (1.0f / Magnitude);
|
||||
|
||||
public float Atan2() => MathF.Atan2(Y, X);
|
||||
public static QuikVec2 operator +(QuikVec2 a, QuikVec2 b)
|
||||
public static QVec2 operator +(QVec2 a, QVec2 b)
|
||||
{
|
||||
return new QuikVec2()
|
||||
return new QVec2()
|
||||
{
|
||||
X = a.X + b.X,
|
||||
Y = a.Y + b.Y
|
||||
};
|
||||
}
|
||||
|
||||
public static QuikVec2 operator -(QuikVec2 a)
|
||||
public static QVec2 operator -(QVec2 a)
|
||||
{
|
||||
return new QuikVec2()
|
||||
return new QVec2()
|
||||
{
|
||||
X = -a.X,
|
||||
Y = -a.Y
|
||||
};
|
||||
}
|
||||
|
||||
public static QuikVec2 operator -(QuikVec2 a, QuikVec2 b)
|
||||
public static QVec2 operator -(QVec2 a, QVec2 b)
|
||||
{
|
||||
return new QuikVec2()
|
||||
return new QVec2()
|
||||
{
|
||||
X = a.X - b.X,
|
||||
Y = a.Y - b.Y
|
||||
};
|
||||
}
|
||||
|
||||
public static QuikVec2 operator *(float a, QuikVec2 b)
|
||||
public static QVec2 operator *(float a, QVec2 b)
|
||||
{
|
||||
return new QuikVec2()
|
||||
return new QVec2()
|
||||
{
|
||||
X = a * b.X,
|
||||
Y = a * b.Y
|
||||
};
|
||||
}
|
||||
|
||||
public static QuikVec2 operator *(QuikVec2 a, float b) => b * a;
|
||||
public static QVec2 operator *(QVec2 a, float b) => b * a;
|
||||
|
||||
public static bool operator ==(QuikVec2 a, QuikVec2 b) => a.X == b.X && a.Y == b.Y;
|
||||
public static bool operator ==(QVec2 a, QVec2 b) => a.X == b.X && a.Y == b.Y;
|
||||
|
||||
public static bool operator !=(QuikVec2 a, QuikVec2 b) => a.X != b.X || a.Y != b.Y;
|
||||
public static bool operator !=(QVec2 a, QVec2 b) => a.X != b.X || a.Y != b.Y;
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is QuikVec2)
|
||||
if (obj is QVec2)
|
||||
{
|
||||
return (QuikVec2) obj == this;
|
||||
return (QVec2) obj == this;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -83,7 +83,7 @@ namespace Quik
|
||||
return 63671 * X.GetHashCode() ^ 81083 * Y.GetHashCode();
|
||||
}
|
||||
|
||||
public static float Dot(QuikVec2 a, QuikVec2 b)
|
||||
public static float Dot(QVec2 a, QVec2 b)
|
||||
{
|
||||
return a.X * b.X + a.Y * b.Y;
|
||||
}
|
||||
@ -93,7 +93,7 @@ namespace Quik
|
||||
/// A RGBA color value.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("({R}, {G}, {B}, {A})")]
|
||||
public struct QuikColor
|
||||
public struct QColor
|
||||
{
|
||||
/// <summary>
|
||||
/// Red channel.
|
||||
@ -112,7 +112,7 @@ namespace Quik
|
||||
/// </summary>
|
||||
public byte A;
|
||||
|
||||
public QuikColor(byte r, byte g, byte b, byte a)
|
||||
public QColor(byte r, byte g, byte b, byte a)
|
||||
{
|
||||
R = r;
|
||||
G = g;
|
||||
@ -120,52 +120,52 @@ namespace Quik
|
||||
A = a;
|
||||
}
|
||||
|
||||
public QuikColor(byte r, byte g, byte b) : this(r, g, b, 1) { }
|
||||
public QColor(byte r, byte g, byte b) : this(r, g, b, 1) { }
|
||||
|
||||
public QuikColor(uint hexCode)
|
||||
public QColor(uint hexCode)
|
||||
{
|
||||
R = (byte)((hexCode >> 24) & 0xFF);
|
||||
G = (byte)((hexCode >> 16) & 0xFF);
|
||||
B = (byte)((hexCode >> 8 ) & 0xFF);
|
||||
A = (byte)((hexCode >> 0 ) & 0xFF);
|
||||
}
|
||||
public QuikColor(int hexCode) : this((uint)hexCode) { }
|
||||
public QColor(int hexCode) : this((uint)hexCode) { }
|
||||
|
||||
public static readonly QuikColor Black = new QuikColor(0, 0, 0, 255);
|
||||
public static readonly QuikColor Red = new QuikColor(255, 0, 0, 255);
|
||||
public static readonly QuikColor Green = new QuikColor(0, 255, 0, 255);
|
||||
public static readonly QuikColor Blue = new QuikColor(0, 0, 255, 255);
|
||||
public static readonly QuikColor Yellow = new QuikColor(255, 255, 0, 255);
|
||||
public static readonly QuikColor Cyan = new QuikColor(0, 255, 255, 255);
|
||||
public static readonly QuikColor Magenta = new QuikColor(255, 0, 255, 255);
|
||||
public static readonly QuikColor White = new QuikColor(255, 255, 255, 255);
|
||||
public static readonly QColor Black = new QColor(0, 0, 0, 255);
|
||||
public static readonly QColor Red = new QColor(255, 0, 0, 255);
|
||||
public static readonly QColor Green = new QColor(0, 255, 0, 255);
|
||||
public static readonly QColor Blue = new QColor(0, 0, 255, 255);
|
||||
public static readonly QColor Yellow = new QColor(255, 255, 0, 255);
|
||||
public static readonly QColor Cyan = new QColor(0, 255, 255, 255);
|
||||
public static readonly QColor Magenta = new QColor(255, 0, 255, 255);
|
||||
public static readonly QColor White = new QColor(255, 255, 255, 255);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A bezier curve segment.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("{Start} -- {ControlA} -- {ControlB} -- {End}")]
|
||||
public struct QuikBezier
|
||||
public struct QBezier
|
||||
{
|
||||
/// <summary>
|
||||
/// Segment start point.
|
||||
/// </summary>
|
||||
public QuikVec2 Start;
|
||||
public QVec2 Start;
|
||||
|
||||
/// <summary>
|
||||
/// Start point control point.
|
||||
/// </summary>
|
||||
public QuikVec2 ControlA;
|
||||
public QVec2 ControlA;
|
||||
|
||||
/// <summary>
|
||||
/// End point control point.
|
||||
/// </summary>
|
||||
public QuikVec2 ControlB;
|
||||
public QVec2 ControlB;
|
||||
|
||||
/// <summary>
|
||||
/// Segment end point.
|
||||
/// </summary>
|
||||
public QuikVec2 End;
|
||||
public QVec2 End;
|
||||
|
||||
/// <summary>
|
||||
/// An approximation of the arc length of the bezier curve, for calculating rasterization resolution.
|
||||
@ -174,7 +174,7 @@ namespace Quik
|
||||
0.5f * (End - Start).Magnitude +
|
||||
0.5f * ((ControlA - Start).Magnitude + (ControlB - ControlA).Magnitude + (End - ControlB).Magnitude);
|
||||
|
||||
public QuikBezier(QuikVec2 start, QuikVec2 controlA, QuikVec2 controlB, QuikVec2 end)
|
||||
public QBezier(QVec2 start, QVec2 controlA, QVec2 controlB, QVec2 end)
|
||||
{
|
||||
Start = start;
|
||||
ControlA = controlA;
|
||||
@ -182,7 +182,7 @@ namespace Quik
|
||||
End = end;
|
||||
}
|
||||
|
||||
public QuikBezier(
|
||||
public QBezier(
|
||||
float startX,
|
||||
float startY,
|
||||
float controlAx,
|
||||
@ -192,10 +192,10 @@ namespace Quik
|
||||
float endX,
|
||||
float endY)
|
||||
: this(
|
||||
new QuikVec2(startX, startY),
|
||||
new QuikVec2(controlAx, controlAy),
|
||||
new QuikVec2(controlBx, controlBy),
|
||||
new QuikVec2(endX, endY))
|
||||
new QVec2(startX, startY),
|
||||
new QVec2(controlAx, controlAy),
|
||||
new QVec2(controlBx, controlBy),
|
||||
new QVec2(endX, endY))
|
||||
{
|
||||
}
|
||||
|
||||
@ -204,7 +204,7 @@ namespace Quik
|
||||
/// </summary>
|
||||
/// <param name="t">Control parameter (between 0 and 1)</param>
|
||||
/// <returns>The point on the curve.</returns>
|
||||
public QuikVec2 GetBezierPoint(float t)
|
||||
public QVec2 GetBezierPoint(float t)
|
||||
{
|
||||
float T = 1 - t;
|
||||
return
|
||||
@ -219,7 +219,7 @@ namespace Quik
|
||||
/// </summary>
|
||||
/// <param name="t">Control parameter (between 0 and 1)</param>
|
||||
/// <returns>The tangent curve.</returns>
|
||||
public QuikVec2 GetBezierTangent(float t)
|
||||
public QVec2 GetBezierTangent(float t)
|
||||
{
|
||||
float T = 1 - t;
|
||||
return
|
||||
@ -230,10 +230,10 @@ namespace Quik
|
||||
).Normalize();
|
||||
}
|
||||
|
||||
internal QuikVec2 GetBezierNormal(float t)
|
||||
internal QVec2 GetBezierNormal(float t)
|
||||
{
|
||||
QuikVec2 tangent = GetBezierTangent(t);
|
||||
return new QuikVec2(-tangent.Y, tangent.X);
|
||||
QVec2 tangent = GetBezierTangent(t);
|
||||
return new QVec2(-tangent.Y, tangent.X);
|
||||
}
|
||||
}
|
||||
|
||||
@ -241,25 +241,25 @@ namespace Quik
|
||||
/// A line segment.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("{Start} -- {End}")]
|
||||
public struct QuikLine
|
||||
public struct QLine
|
||||
{
|
||||
/// <summary>
|
||||
/// Start point.
|
||||
/// </summary>
|
||||
public QuikVec2 Start;
|
||||
public QVec2 Start;
|
||||
|
||||
/// <summary>
|
||||
/// End point.
|
||||
/// </summary>
|
||||
public QuikVec2 End;
|
||||
public QVec2 End;
|
||||
|
||||
public QuikLine(QuikVec2 start, QuikVec2 end)
|
||||
public QLine(QVec2 start, QVec2 end)
|
||||
{
|
||||
Start = start;
|
||||
End = end;
|
||||
}
|
||||
|
||||
public QuikLine(float startX, float startY, float endX, float endY)
|
||||
public QLine(float startX, float startY, float endX, float endY)
|
||||
{
|
||||
Start.X = startX;
|
||||
Start.Y = startY;
|
||||
@ -267,12 +267,12 @@ namespace Quik
|
||||
End.Y = endY;
|
||||
}
|
||||
|
||||
public QuikVec2 Normal()
|
||||
public QVec2 Normal()
|
||||
{
|
||||
QuikVec2 tangent = Tangent();
|
||||
return new QuikVec2(-tangent.Y, tangent.X);
|
||||
QVec2 tangent = Tangent();
|
||||
return new QVec2(-tangent.Y, tangent.X);
|
||||
}
|
||||
public QuikVec2 Tangent()
|
||||
public QVec2 Tangent()
|
||||
{
|
||||
return (End - Start).Normalize();
|
||||
}
|
||||
@ -282,17 +282,17 @@ namespace Quik
|
||||
/// A rectangle.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("({Right}, {Top}, {Left}, {Bottom})")]
|
||||
public struct QuikRectangle
|
||||
public struct QRectangle
|
||||
{
|
||||
/// <summary>
|
||||
/// Rectangle maximum point.
|
||||
/// </summary>
|
||||
public QuikVec2 Max;
|
||||
public QVec2 Max;
|
||||
|
||||
/// <summary>
|
||||
/// Rectangle minimum point.
|
||||
/// </summary>
|
||||
public QuikVec2 Min;
|
||||
public QVec2 Min;
|
||||
|
||||
public float Left
|
||||
{
|
||||
@ -318,39 +318,39 @@ namespace Quik
|
||||
set => Min.Y = value;
|
||||
}
|
||||
|
||||
public QuikVec2 Size
|
||||
public QVec2 Size
|
||||
{
|
||||
get => Max - Min;
|
||||
set => Max = Min + value;
|
||||
}
|
||||
|
||||
public QuikRectangle(QuikVec2 max, QuikVec2 min)
|
||||
public QRectangle(QVec2 max, QVec2 min)
|
||||
{
|
||||
Max = max;
|
||||
Min = min;
|
||||
}
|
||||
|
||||
public QuikRectangle(float r, float t, float l, float b)
|
||||
public QRectangle(float r, float t, float l, float b)
|
||||
{
|
||||
Max = new QuikVec2() {X = r, Y = t};
|
||||
Min = new QuikVec2() {X = l, Y = b};
|
||||
Max = new QVec2() {X = r, Y = t};
|
||||
Min = new QVec2() {X = l, Y = b};
|
||||
}
|
||||
|
||||
public bool Contains(QuikVec2 point)
|
||||
public bool Contains(QVec2 point)
|
||||
{
|
||||
return
|
||||
point.X > Left && point.X < Right &&
|
||||
point.Y > Bottom && point.Y < Top;
|
||||
}
|
||||
|
||||
internal void Translate(in QuikVec2 offset)
|
||||
internal void Translate(in QVec2 offset)
|
||||
{
|
||||
Min += offset;
|
||||
Max += offset;
|
||||
}
|
||||
|
||||
public static QuikRectangle Intersect(in QuikRectangle a, in QuikRectangle b) =>
|
||||
new QuikRectangle(
|
||||
public static QRectangle Intersect(in QRectangle a, in QRectangle b) =>
|
||||
new QRectangle(
|
||||
Math.Min(a.Right, b.Right),
|
||||
Math.Min(a.Top, b.Top),
|
||||
Math.Max(a.Left, b.Left),
|
||||
@ -363,43 +363,43 @@ namespace Quik
|
||||
/// </summary>
|
||||
/// <remarks>It is undefined to have an ellipse with non-orthogonal axes.</remarks>
|
||||
[DebuggerDisplay("{Center} ellipse {AxisA}; {AxisB}")]
|
||||
public struct QuikEllipse
|
||||
public struct QEllipse
|
||||
{
|
||||
/// <summary>
|
||||
/// Ellipse center point.
|
||||
/// </summary>
|
||||
public QuikVec2 Center;
|
||||
public QVec2 Center;
|
||||
|
||||
/// <summary>
|
||||
/// First ellipse axis.
|
||||
/// </summary>
|
||||
public QuikVec2 AxisA;
|
||||
public QVec2 AxisA;
|
||||
|
||||
/// <summary>
|
||||
/// Second ellipse axis.
|
||||
/// </summary>
|
||||
public QuikVec2 AxisB;
|
||||
public QVec2 AxisB;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A triangle.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("{A} -- {B} -- {C}")]
|
||||
public struct QuikTriangle
|
||||
public struct QTriangle
|
||||
{
|
||||
/// <summary>
|
||||
/// First vertex.
|
||||
/// </summary>
|
||||
public QuikVec2 A;
|
||||
public QVec2 A;
|
||||
|
||||
/// <summary>
|
||||
/// Second vertex.
|
||||
/// </summary>
|
||||
public QuikVec2 B;
|
||||
public QVec2 B;
|
||||
|
||||
/// <summary>
|
||||
/// Third vertex.
|
||||
/// </summary>
|
||||
public QuikVec2 C;
|
||||
public QVec2 C;
|
||||
}
|
||||
}
|
@ -54,9 +54,9 @@ namespace Quik
|
||||
{
|
||||
public abstract object this[string key] { get; set; }
|
||||
|
||||
public QuikColor? Color
|
||||
public QColor? Color
|
||||
{
|
||||
get => (QuikColor?)this["color"];
|
||||
get => (QColor?)this["color"];
|
||||
set => this["color"] = value;
|
||||
}
|
||||
|
||||
@ -120,9 +120,9 @@ namespace Quik
|
||||
set => this["stroke-width"] = value;
|
||||
}
|
||||
|
||||
public QuikColor? StrokeColor
|
||||
public QColor? StrokeColor
|
||||
{
|
||||
get => (QuikColor?)this["stroke-color"];
|
||||
get => (QColor?)this["stroke-color"];
|
||||
set => this["stroke-color"] = value;
|
||||
}
|
||||
|
||||
@ -236,7 +236,7 @@ namespace Quik
|
||||
/// <summary>
|
||||
/// Stroke color.
|
||||
/// </summary>
|
||||
public QuikColor Color { get; set; }
|
||||
public QColor Color { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Stroke width.
|
||||
@ -252,7 +252,7 @@ namespace Quik
|
||||
{
|
||||
}
|
||||
|
||||
public QuikStrokeStyle(QuikColor color, float width /*, QuikStipplePattern pattern*/)
|
||||
public QuikStrokeStyle(QColor color, float width /*, QuikStipplePattern pattern*/)
|
||||
{
|
||||
Color = color;
|
||||
Width = width;
|
||||
@ -269,6 +269,6 @@ namespace Quik
|
||||
/// </summary>
|
||||
public class QuikFillStyle
|
||||
{
|
||||
public QuikColor Color { get; set; }
|
||||
public QColor Color { get; set; }
|
||||
}
|
||||
}
|
@ -13,35 +13,35 @@ namespace Quik.Typography
|
||||
/// <summary>
|
||||
/// Location of the glyph on the atlas.
|
||||
/// </summary>
|
||||
public QuikRectangle Location { get; }
|
||||
public QRectangle Location { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Size of the glyph in units.
|
||||
/// </summary>
|
||||
public QuikVec2 Size { get; }
|
||||
public QVec2 Size { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Bearing vector for horizontal layout.
|
||||
/// </summary>
|
||||
public QuikVec2 HorizontalBearing { get; }
|
||||
public QVec2 HorizontalBearing { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Bearing vector for vertical layout.
|
||||
/// </summary>
|
||||
public QuikVec2 VerticalBearing { get; }
|
||||
public QVec2 VerticalBearing { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Advance vector for vertical and horizontal layouts.
|
||||
/// </summary>
|
||||
public QuikVec2 Advance { get; }
|
||||
public QVec2 Advance { get; }
|
||||
|
||||
public QuikGlyph(
|
||||
int character,
|
||||
QuikRectangle location,
|
||||
QuikVec2 size,
|
||||
QuikVec2 horizontalBearing,
|
||||
QuikVec2 verticalBearing,
|
||||
QuikVec2 advance)
|
||||
QRectangle location,
|
||||
QVec2 size,
|
||||
QVec2 horizontalBearing,
|
||||
QVec2 verticalBearing,
|
||||
QVec2 advance)
|
||||
{
|
||||
Character = character;
|
||||
Location = location;
|
||||
|
@ -181,7 +181,7 @@ namespace Quik.Typography
|
||||
int index = 0;
|
||||
bool firstLine = true;
|
||||
|
||||
QuikVec2 pen = new QuikVec2(0, -PreSpace);
|
||||
QVec2 pen = new QVec2(0, -PreSpace);
|
||||
|
||||
while (index < Blocks.Count)
|
||||
{
|
||||
@ -225,7 +225,7 @@ namespace Quik.Typography
|
||||
|
||||
pen.Y -= PostSpace;
|
||||
|
||||
group.BoundingBox = new QuikRectangle(width, 0, 0, pen.Y);
|
||||
group.BoundingBox = new QRectangle(width, 0, 0, pen.Y);
|
||||
group.Translate(-pen);
|
||||
}
|
||||
|
||||
@ -263,9 +263,9 @@ namespace Quik.Typography
|
||||
TypesetGroup group,
|
||||
Queue<HorizontalTextBlock> line,
|
||||
float interblockWs,
|
||||
ref QuikVec2 pen)
|
||||
ref QVec2 pen)
|
||||
{
|
||||
QuikVec2 penpal = pen;
|
||||
QVec2 penpal = pen;
|
||||
|
||||
while (line.TryDequeue(out HorizontalTextBlock block))
|
||||
{
|
||||
@ -285,7 +285,7 @@ namespace Quik.Typography
|
||||
new TypesetCharacter(
|
||||
chr,
|
||||
texture,
|
||||
new QuikRectangle(
|
||||
new QRectangle(
|
||||
penpal.X + metrics.Advance.X,
|
||||
penpal.Y + metrics.HorizontalBearing.Y,
|
||||
penpal.X + metrics.HorizontalBearing.X,
|
||||
@ -306,7 +306,7 @@ namespace Quik.Typography
|
||||
new TypesetCharacter(
|
||||
chr,
|
||||
texture,
|
||||
new QuikRectangle(
|
||||
new QRectangle(
|
||||
penpal.X + metrics.Advance.X,
|
||||
penpal.Y + metrics.HorizontalBearing.Y,
|
||||
penpal.X + metrics.HorizontalBearing.X,
|
||||
@ -353,14 +353,14 @@ namespace Quik.Typography
|
||||
{
|
||||
public int Character;
|
||||
public QuikTexture Texture;
|
||||
public QuikRectangle Position;
|
||||
public QuikRectangle UV;
|
||||
public QRectangle Position;
|
||||
public QRectangle UV;
|
||||
|
||||
public TypesetCharacter(
|
||||
int chr,
|
||||
QuikTexture texture,
|
||||
in QuikRectangle position,
|
||||
in QuikRectangle uv)
|
||||
in QRectangle position,
|
||||
in QRectangle uv)
|
||||
{
|
||||
Character = chr;
|
||||
Texture = texture;
|
||||
@ -374,7 +374,7 @@ namespace Quik.Typography
|
||||
private int _count = 0;
|
||||
private TypesetCharacter[] _array = Array.Empty<TypesetCharacter>();
|
||||
|
||||
public QuikRectangle BoundingBox;
|
||||
public QRectangle BoundingBox;
|
||||
|
||||
public int Count => _count;
|
||||
|
||||
@ -395,7 +395,7 @@ namespace Quik.Typography
|
||||
_count = 0;
|
||||
}
|
||||
|
||||
public void Translate(QuikVec2 offset)
|
||||
public void Translate(QVec2 offset)
|
||||
{
|
||||
BoundingBox.Translate(offset);
|
||||
|
||||
|
@ -12,7 +12,7 @@ namespace Quik.VertexGenerator
|
||||
private readonly List<DrawCall> _drawCalls = new List<DrawCall>();
|
||||
private int _start;
|
||||
private int _baseOffset;
|
||||
private QuikRectangle _bounds;
|
||||
private QRectangle _bounds;
|
||||
private QuikTexture _texture;
|
||||
|
||||
public int ZDepth { get; private set; }
|
||||
@ -32,7 +32,7 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void StartDrawCall(in QuikRectangle bounds, QuikTexture texture, int baseOffset)
|
||||
public void StartDrawCall(in QRectangle bounds, QuikTexture texture, int baseOffset)
|
||||
{
|
||||
_start = ElementCount;
|
||||
_texture = texture;
|
||||
@ -41,13 +41,13 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void StartDrawCall(in QuikRectangle bounds) => StartDrawCall(bounds, null, _vertices.Count);
|
||||
public void StartDrawCall(in QRectangle bounds) => StartDrawCall(bounds, null, _vertices.Count);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void StartDrawCall(in QuikRectangle bounds, int baseOffset) => StartDrawCall(bounds, null, baseOffset);
|
||||
public void StartDrawCall(in QRectangle bounds, int baseOffset) => StartDrawCall(bounds, null, baseOffset);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void StartDrawCall(in QuikRectangle bounds, QuikTexture texture) => StartDrawCall(bounds, texture, _vertices.Count);
|
||||
public void StartDrawCall(in QRectangle bounds, QuikTexture texture) => StartDrawCall(bounds, texture, _vertices.Count);
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void AddVertex(in QuikVertex vertex)
|
||||
@ -98,10 +98,10 @@ namespace Quik.VertexGenerator
|
||||
{
|
||||
public int Start { get; }
|
||||
public int Count { get; }
|
||||
public QuikRectangle Bounds { get; }
|
||||
public QRectangle Bounds { get; }
|
||||
public QuikTexture Texture { get; }
|
||||
|
||||
public DrawCall(int start, int count, in QuikRectangle bounds, QuikTexture texture)
|
||||
public DrawCall(int start, int count, in QRectangle bounds, QuikTexture texture)
|
||||
{
|
||||
Start = start;
|
||||
Count = count;
|
||||
|
@ -11,17 +11,17 @@ namespace Quik.VertexGenerator
|
||||
/// <summary>
|
||||
/// Position value.
|
||||
/// </summary>
|
||||
public QuikVec2 Position;
|
||||
public QVec2 Position;
|
||||
|
||||
/// <summary>
|
||||
/// Texture Coordinates.
|
||||
/// </summary>
|
||||
public QuikVec2 TextureCoordinates;
|
||||
public QVec2 TextureCoordinates;
|
||||
|
||||
/// <summary>
|
||||
/// Per vertex color value.
|
||||
/// </summary>
|
||||
public QuikColor Color;
|
||||
public QColor Color;
|
||||
|
||||
/// <summary>
|
||||
/// Per vertex depth index value.
|
||||
@ -29,9 +29,9 @@ namespace Quik.VertexGenerator
|
||||
public int ZIndex;
|
||||
|
||||
public static int PositionOffset => 0;
|
||||
public static unsafe int TextureCoordinatesOffset => sizeof(QuikVec2);
|
||||
public static unsafe int ColorOffset => 2 * sizeof(QuikVec2);
|
||||
public static unsafe int ZIndexOffset => ColorOffset + sizeof(QuikColor);
|
||||
public static unsafe int TextureCoordinatesOffset => sizeof(QVec2);
|
||||
public static unsafe int ColorOffset => 2 * sizeof(QVec2);
|
||||
public static unsafe int ZIndexOffset => ColorOffset + sizeof(QColor);
|
||||
public static unsafe int Stride => sizeof(QuikVertex);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -16,12 +16,12 @@ namespace Quik.VertexGenerator
|
||||
protected QuikVertex StrokeVertex => new QuikVertex()
|
||||
{
|
||||
ZIndex = Style.ZIndex ?? this.ZIndex,
|
||||
Color = Style.StrokeColor ?? QuikColor.Black,
|
||||
Color = Style.StrokeColor ?? QColor.Black,
|
||||
};
|
||||
protected QuikVertex FillVertex => new QuikVertex()
|
||||
{
|
||||
ZIndex = Style.ZIndex ?? this.ZIndex,
|
||||
Color = Style.Color ?? QuikColor.White,
|
||||
Color = Style.Color ?? QColor.White,
|
||||
};
|
||||
|
||||
public override void Reset()
|
||||
@ -54,7 +54,7 @@ namespace Quik.VertexGenerator
|
||||
return (int) Math.Ceiling(arc * radius * CurveGranularity);
|
||||
}
|
||||
|
||||
private readonly List<QuikLine> LineList = new List<QuikLine>();
|
||||
private readonly List<QLine> LineList = new List<QLine>();
|
||||
private void LineProc(CommandQueue queue)
|
||||
{
|
||||
Frame frame = queue.Dequeue();
|
||||
@ -67,12 +67,12 @@ namespace Quik.VertexGenerator
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
frame = queue.Dequeue();
|
||||
LineList.Add((QuikLine)frame);
|
||||
LineList.Add((QLine)frame);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LineList.Add((QuikLine)frame);
|
||||
LineList.Add((QLine)frame);
|
||||
}
|
||||
|
||||
float width = Style.StrokeWidth ?? 1;
|
||||
@ -81,7 +81,7 @@ namespace Quik.VertexGenerator
|
||||
LineInfo prevBase, nextBase = default;
|
||||
for (int i = 0; i < LineList.Count; i++)
|
||||
{
|
||||
QuikLine line = LineList[i];
|
||||
QLine line = LineList[i];
|
||||
// A line segment needs a start cap if it is the first segment in
|
||||
// the list, or the last end point is not the current start point.
|
||||
bool isStart = (i == 0 || line.Start != LineList[i - 1].End);
|
||||
@ -112,11 +112,11 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.EndDrawCall();
|
||||
}
|
||||
|
||||
private LineInfo GenerateLineSegment(in QuikLine line)
|
||||
private LineInfo GenerateLineSegment(in QLine line)
|
||||
{
|
||||
QuikVertex vertex = StrokeVertex;
|
||||
QuikVertex a, b, c, d;
|
||||
QuikVec2 normal = line.Normal();
|
||||
QVec2 normal = line.Normal();
|
||||
float width = Style.StrokeWidth ?? 1;
|
||||
|
||||
a = b = c = d = vertex;
|
||||
@ -136,20 +136,20 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
|
||||
private void GenerateJoint(
|
||||
in QuikVec2 center,
|
||||
in QuikVec2 prevNormal,
|
||||
in QuikVec2 nextNormal,
|
||||
in QVec2 center,
|
||||
in QVec2 prevNormal,
|
||||
in QVec2 nextNormal,
|
||||
in LineInfo prevInfo,
|
||||
in LineInfo nextInfo)
|
||||
{
|
||||
// Figure out which side needs the joint.
|
||||
QuikVec2 meanNormal = 0.5f * (prevNormal + nextNormal);
|
||||
QuikVec2 meanTangent = new QuikVec2(meanNormal.Y, -meanNormal.X);
|
||||
QuikVec2 positiveEdge = ((center + nextNormal) - (center + prevNormal)).Normalize();
|
||||
QuikVec2 negativeEdge = ((center - nextNormal) - (center - prevNormal)).Normalize();
|
||||
QVec2 meanNormal = 0.5f * (prevNormal + nextNormal);
|
||||
QVec2 meanTangent = new QVec2(meanNormal.Y, -meanNormal.X);
|
||||
QVec2 positiveEdge = ((center + nextNormal) - (center + prevNormal)).Normalize();
|
||||
QVec2 negativeEdge = ((center - nextNormal) - (center - prevNormal)).Normalize();
|
||||
float positive, negative;
|
||||
positive = QuikVec2.Dot(meanTangent, positiveEdge);
|
||||
negative = QuikVec2.Dot(meanNormal, negativeEdge);
|
||||
positive = QVec2.Dot(meanTangent, positiveEdge);
|
||||
negative = QVec2.Dot(meanNormal, negativeEdge);
|
||||
|
||||
if (positive == negative)
|
||||
{
|
||||
@ -161,7 +161,7 @@ namespace Quik.VertexGenerator
|
||||
|
||||
QuikVertex vertex = StrokeVertex;
|
||||
float radius = Style.StrokeWidth/2 ?? 0.5f;
|
||||
float arc = MathF.Acos(QuikVec2.Dot(prevNormal, nextNormal));
|
||||
float arc = MathF.Acos(QVec2.Dot(prevNormal, nextNormal));
|
||||
int resolution = GetRoundingResolution(radius, arc);
|
||||
bool isNegative = positive < negative;
|
||||
|
||||
@ -187,10 +187,10 @@ namespace Quik.VertexGenerator
|
||||
float cos = MathF.Cos(angle);
|
||||
float sin = MathF.Sin(angle);
|
||||
|
||||
QuikVec2 displacement;
|
||||
QVec2 displacement;
|
||||
if (isNegative)
|
||||
{
|
||||
displacement = new QuikVec2()
|
||||
displacement = new QVec2()
|
||||
{
|
||||
X = -prevNormal.X * cos + prevNormal.Y * sin,
|
||||
Y = -prevNormal.X * sin - prevNormal.Y * cos
|
||||
@ -198,7 +198,7 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
displacement = new QuikVec2()
|
||||
displacement = new QVec2()
|
||||
{
|
||||
X = nextNormal.X * cos - nextNormal.Y * sin,
|
||||
Y = nextNormal.X * sin + nextNormal.Y * cos
|
||||
@ -222,8 +222,8 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
|
||||
private void GenerateCap(
|
||||
in QuikVec2 center,
|
||||
in QuikVec2 normal,
|
||||
in QVec2 center,
|
||||
in QVec2 normal,
|
||||
in LineInfo info,
|
||||
bool endCap)
|
||||
{
|
||||
@ -250,10 +250,10 @@ namespace Quik.VertexGenerator
|
||||
float cos = MathF.Cos(angle);
|
||||
float sin = MathF.Sin(angle);
|
||||
|
||||
QuikVec2 displacement;
|
||||
QVec2 displacement;
|
||||
if (endCap)
|
||||
{
|
||||
displacement = new QuikVec2()
|
||||
displacement = new QVec2()
|
||||
{
|
||||
X = normal.X * cos + normal.Y * sin,
|
||||
Y = -normal.X * sin + normal.Y * cos
|
||||
@ -261,7 +261,7 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
else
|
||||
{
|
||||
displacement = new QuikVec2()
|
||||
displacement = new QVec2()
|
||||
{
|
||||
X = normal.X * cos - normal.Y * sin,
|
||||
Y = normal.X * sin + normal.Y * cos
|
||||
@ -279,7 +279,7 @@ namespace Quik.VertexGenerator
|
||||
}
|
||||
}
|
||||
|
||||
private readonly List<QuikBezier> BezierList = new List<QuikBezier>();
|
||||
private readonly List<QBezier> BezierList = new List<QBezier>();
|
||||
private void BezierProc(CommandQueue queue)
|
||||
{
|
||||
Frame a = queue.Dequeue();
|
||||
@ -296,11 +296,11 @@ namespace Quik.VertexGenerator
|
||||
b = queue.Dequeue();
|
||||
|
||||
BezierList.Add(
|
||||
new QuikBezier(
|
||||
new QuikVec2(a.GetF(0), a.GetF(1)),
|
||||
new QuikVec2(b.GetF(0), b.GetF(1)),
|
||||
new QuikVec2(b.GetF(2), b.GetF(3)),
|
||||
new QuikVec2(a.GetF(2), a.GetF(3))
|
||||
new QBezier(
|
||||
new QVec2(a.GetF(0), a.GetF(1)),
|
||||
new QVec2(b.GetF(0), b.GetF(1)),
|
||||
new QVec2(b.GetF(2), b.GetF(3)),
|
||||
new QVec2(a.GetF(2), a.GetF(3))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -310,11 +310,11 @@ namespace Quik.VertexGenerator
|
||||
b = queue.Dequeue();
|
||||
|
||||
BezierList.Add(
|
||||
new QuikBezier(
|
||||
new QuikVec2(a.GetF(0), a.GetF(1)),
|
||||
new QuikVec2(b.GetF(0), b.GetF(1)),
|
||||
new QuikVec2(b.GetF(2), b.GetF(3)),
|
||||
new QuikVec2(a.GetF(2), a.GetF(3))
|
||||
new QBezier(
|
||||
new QVec2(a.GetF(0), a.GetF(1)),
|
||||
new QVec2(b.GetF(0), b.GetF(1)),
|
||||
new QVec2(b.GetF(2), b.GetF(3)),
|
||||
new QVec2(a.GetF(2), a.GetF(3))
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -325,7 +325,7 @@ namespace Quik.VertexGenerator
|
||||
LineInfo prevBase, nextBase = default;
|
||||
for (int i = 0; i < LineList.Count; i++)
|
||||
{
|
||||
QuikBezier bezier = BezierList[i];
|
||||
QBezier bezier = BezierList[i];
|
||||
// A line segment needs a start cap if it is the first segment in
|
||||
// the list, or the last end point is not the current start point.
|
||||
bool isStart = (i == 0 || bezier.Start != BezierList[i - 1].End);
|
||||
@ -356,12 +356,12 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.EndDrawCall();
|
||||
}
|
||||
|
||||
private LineInfo GenerateBezierSegment(in QuikBezier bezier)
|
||||
private LineInfo GenerateBezierSegment(in QBezier bezier)
|
||||
{
|
||||
QuikVec2 startTangent = bezier.GetBezierTangent(0);
|
||||
QuikVec2 endTangent = bezier.GetBezierTangent(1);
|
||||
QuikVec2 startNormal = new QuikVec2(-startTangent.Y, startTangent.X).Normalize();
|
||||
QuikVec2 endNormal = new QuikVec2(-endTangent.Y, endTangent.X).Normalize();
|
||||
QVec2 startTangent = bezier.GetBezierTangent(0);
|
||||
QVec2 endTangent = bezier.GetBezierTangent(1);
|
||||
QVec2 startNormal = new QVec2(-startTangent.Y, startTangent.X).Normalize();
|
||||
QVec2 endNormal = new QVec2(-endTangent.Y, endTangent.X).Normalize();
|
||||
|
||||
float width = Style.StrokeWidth ?? 1;
|
||||
float radius = 0.5f * width;
|
||||
@ -380,9 +380,9 @@ namespace Quik.VertexGenerator
|
||||
for (int i = 0; i < resolution; i++, index += 2)
|
||||
{
|
||||
float t = (i + 1.0f) / resolution;
|
||||
QuikVec2 at = bezier.GetBezierTangent(t).Normalize();
|
||||
QuikVec2 a = bezier.GetBezierPoint(t);
|
||||
QuikVec2 an = radius * new QuikVec2(-at.Y, at.X);
|
||||
QVec2 at = bezier.GetBezierTangent(t).Normalize();
|
||||
QVec2 a = bezier.GetBezierPoint(t);
|
||||
QVec2 an = radius * new QVec2(-at.Y, at.X);
|
||||
|
||||
v.Position = a + an;
|
||||
DrawQueue.AddVertex(v);
|
||||
@ -396,7 +396,7 @@ namespace Quik.VertexGenerator
|
||||
return new LineInfo(vbase, 0, 1, index - 2, index - 1);
|
||||
}
|
||||
|
||||
private readonly List<QuikRectangle> RectangleList = new List<QuikRectangle>();
|
||||
private readonly List<QRectangle> RectangleList = new List<QRectangle>();
|
||||
private void RectangleProc(CommandQueue queue)
|
||||
{
|
||||
Frame frame = queue.Dequeue();
|
||||
@ -407,12 +407,12 @@ namespace Quik.VertexGenerator
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
frame = queue.Dequeue();
|
||||
RectangleList.Add((QuikRectangle)frame);
|
||||
RectangleList.Add((QRectangle)frame);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RectangleList.Add((QuikRectangle)frame);
|
||||
RectangleList.Add((QRectangle)frame);
|
||||
}
|
||||
|
||||
float stroke = Style.StrokeWidth ?? 1.0f;
|
||||
@ -420,8 +420,8 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.StartDrawCall(Viewport);
|
||||
for (int i = 0; i < RectangleList.Count; i++)
|
||||
{
|
||||
QuikRectangle outer = RectangleList[i];
|
||||
QuikRectangle inner = new QuikRectangle(
|
||||
QRectangle outer = RectangleList[i];
|
||||
QRectangle inner = new QRectangle(
|
||||
outer.Right - stroke, outer.Top - stroke,
|
||||
outer.Left + stroke, outer.Bottom + stroke);
|
||||
|
||||
@ -445,7 +445,7 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.EndDrawCall();
|
||||
}
|
||||
|
||||
private void GenerateRectangleBase(in QuikRectangle rectangle, float radius)
|
||||
private void GenerateRectangleBase(in QRectangle rectangle, float radius)
|
||||
{
|
||||
/*
|
||||
+--j-------i--+
|
||||
@ -466,16 +466,16 @@ namespace Quik.VertexGenerator
|
||||
|
||||
// Draw center rectangle.
|
||||
|
||||
QuikVec2 aPos, bPos, cPos, dPos;
|
||||
QVec2 aPos, bPos, cPos, dPos;
|
||||
|
||||
QuikVertex v = FillVertex;
|
||||
aPos = v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
aPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
bPos = v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
bPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
cPos = v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
cPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
dPos = v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
dPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(0); DrawQueue.AddElement(1); DrawQueue.AddElement(2);
|
||||
@ -486,9 +486,9 @@ namespace Quik.VertexGenerator
|
||||
|
||||
// Draw south rectangle.
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(4); DrawQueue.AddElement(5); DrawQueue.AddElement(1);
|
||||
@ -496,9 +496,9 @@ namespace Quik.VertexGenerator
|
||||
|
||||
// Draw east rectangle.
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(1); DrawQueue.AddElement(6); DrawQueue.AddElement(7);
|
||||
@ -506,9 +506,9 @@ namespace Quik.VertexGenerator
|
||||
|
||||
// Draw north rectangle.
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(3); DrawQueue.AddElement(2); DrawQueue.AddElement(8);
|
||||
@ -516,9 +516,9 @@ namespace Quik.VertexGenerator
|
||||
|
||||
// Draw west rectangle.
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(11); DrawQueue.AddElement(0); DrawQueue.AddElement(3);
|
||||
@ -535,7 +535,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = MathF.Cos(theta) * radius;
|
||||
float yoff = MathF.Sin(theta) * radius;
|
||||
|
||||
v.Position = cPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = cPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(2); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -550,7 +550,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Sin(theta) * radius;
|
||||
float yoff = MathF.Cos(theta) * radius;
|
||||
|
||||
v.Position = dPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = dPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(3); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -565,7 +565,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Cos(theta) * radius;
|
||||
float yoff = -MathF.Sin(theta) * radius;
|
||||
|
||||
v.Position = aPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = aPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(0); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -580,14 +580,14 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Sin(theta) * radius;
|
||||
float yoff = MathF.Cos(theta) * radius;
|
||||
|
||||
v.Position = bPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = bPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(1); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
DrawQueue.AddElement(1); DrawQueue.AddElement(previous); DrawQueue.AddElement(6);
|
||||
}
|
||||
|
||||
private void GenerateRectangleStripStraight(in QuikRectangle rectangle)
|
||||
private void GenerateRectangleStripStraight(in QRectangle rectangle)
|
||||
{
|
||||
/*
|
||||
h---------g
|
||||
@ -609,22 +609,22 @@ namespace Quik.VertexGenerator
|
||||
|
||||
DrawQueue.RestoreOffset();
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(4); DrawQueue.AddElement(5); DrawQueue.AddElement(1); // SSW
|
||||
@ -637,7 +637,7 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.AddElement(4); DrawQueue.AddElement(3); DrawQueue.AddElement(7); // SWW
|
||||
}
|
||||
|
||||
private void GenerateRectangleStripNarrow(in QuikRectangle rectangle, float radius)
|
||||
private void GenerateRectangleStripNarrow(in QRectangle rectangle, float radius)
|
||||
{
|
||||
/*
|
||||
v-j---i-u
|
||||
@ -662,73 +662,73 @@ namespace Quik.VertexGenerator
|
||||
20: 0 1 2 3
|
||||
*/
|
||||
QuikVertex v = StrokeVertex;
|
||||
QuikVec2 nPos, qPos, tPos, wPos;
|
||||
QVec2 nPos, qPos, tPos, wPos;
|
||||
float stroke = Style.StrokeWidth ?? 1.0f;
|
||||
|
||||
DrawQueue.RestoreOffset();
|
||||
|
||||
// a-b-c-d
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// ef-gh-ij-kl
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// mno
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
nPos = v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
nPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// pqr
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
qPos = v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
qPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// stu
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
tPos = v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
tPos = v.Position = new QVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// vwx
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
wPos = v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
wPos = v.Position = new QVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// E
|
||||
@ -779,7 +779,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = MathF.Cos(theta) * radius;
|
||||
float yoff = MathF.Sin(theta) * radius;
|
||||
|
||||
v.Position = tPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = tPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(19); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -794,7 +794,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Sin(theta) * radius;
|
||||
float yoff = MathF.Cos(theta) * radius;
|
||||
|
||||
v.Position = wPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = wPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(22); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -809,7 +809,7 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Cos(theta) * radius;
|
||||
float yoff = -MathF.Sin(theta) * radius;
|
||||
|
||||
v.Position = nPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = nPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(23); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
@ -824,14 +824,14 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Sin(theta) * radius;
|
||||
float yoff = MathF.Cos(theta) * radius;
|
||||
|
||||
v.Position = qPos + new QuikVec2(xoff, yoff);
|
||||
v.Position = qPos + new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
DrawQueue.AddElement(16); DrawQueue.AddElement(previous); DrawQueue.AddElement((previous = current++));
|
||||
}
|
||||
DrawQueue.AddElement(16); DrawQueue.AddElement(previous); DrawQueue.AddElement(17);
|
||||
}
|
||||
|
||||
private void GenerateRectangleStripWide(in QuikRectangle rectangle, float radius)
|
||||
private void GenerateRectangleStripWide(in QRectangle rectangle, float radius)
|
||||
{
|
||||
/*
|
||||
l---k
|
||||
@ -855,40 +855,40 @@ namespace Quik.VertexGenerator
|
||||
float innerRadius = radius - stroke;
|
||||
DrawQueue.RestoreOffset();
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Bottom + stroke);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Bottom + stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Right, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - stroke, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Right - stroke, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top - stroke);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Top - stroke);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Right - radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Right - radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + radius, rectangle.Top);
|
||||
v.Position = new QVec2(rectangle.Left + radius, rectangle.Top);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left + stroke, rectangle.Top - radius);
|
||||
v.Position = new QVec2(rectangle.Left + stroke, rectangle.Top - radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = new QuikVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
v.Position = new QVec2(rectangle.Left, rectangle.Bottom + radius);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
// S
|
||||
@ -908,7 +908,7 @@ namespace Quik.VertexGenerator
|
||||
int resolution = GetRoundingResolution(radius, 0.5f * MathF.PI);
|
||||
int current = 16;
|
||||
|
||||
QuikVec2 center = new QuikVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
QVec2 center = new QVec2(rectangle.Right - radius, rectangle.Top - radius);
|
||||
int s1 = 7, s2 = 6;
|
||||
for (int i = 0; i < resolution - 1; i++)
|
||||
{
|
||||
@ -916,9 +916,9 @@ namespace Quik.VertexGenerator
|
||||
float xoff = MathF.Cos(theta);
|
||||
float yoff = MathF.Sin(theta);
|
||||
|
||||
v.Position = center + radius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + radius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = center + innerRadius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + innerRadius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(current + 0);
|
||||
@ -931,7 +931,7 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(9);
|
||||
|
||||
// Draw NW arc
|
||||
center = new QuikVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
center = new QVec2(rectangle.Left + radius, rectangle.Top - radius);
|
||||
s1 = 8; s2 = 11;
|
||||
for (int i = 0; i < resolution - 1; i++)
|
||||
{
|
||||
@ -939,9 +939,9 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Sin(theta);
|
||||
float yoff = MathF.Cos(theta);
|
||||
|
||||
v.Position = center + radius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + radius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = center + innerRadius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + innerRadius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(current + 0);
|
||||
@ -954,7 +954,7 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(14);
|
||||
|
||||
// Draw SW arc
|
||||
center = new QuikVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
center = new QVec2(rectangle.Left + radius, rectangle.Bottom + radius);
|
||||
s1 = 13; s2 = 12;
|
||||
for (int i = 0; i < resolution - 1; i++)
|
||||
{
|
||||
@ -962,9 +962,9 @@ namespace Quik.VertexGenerator
|
||||
float xoff = -MathF.Cos(theta);
|
||||
float yoff = -MathF.Sin(theta);
|
||||
|
||||
v.Position = center + radius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + radius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = center + innerRadius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + innerRadius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(current + 0);
|
||||
@ -977,7 +977,7 @@ namespace Quik.VertexGenerator
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(3);
|
||||
|
||||
// Draw SW arc
|
||||
center = new QuikVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
center = new QVec2(rectangle.Right - radius, rectangle.Bottom + radius);
|
||||
s1 = 2; s2 = 1;
|
||||
for (int i = 0; i < resolution - 1; i++)
|
||||
{
|
||||
@ -985,9 +985,9 @@ namespace Quik.VertexGenerator
|
||||
float xoff = MathF.Sin(theta);
|
||||
float yoff = -MathF.Cos(theta);
|
||||
|
||||
v.Position = center + radius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + radius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
v.Position = center + innerRadius * new QuikVec2(xoff, yoff);
|
||||
v.Position = center + innerRadius * new QVec2(xoff, yoff);
|
||||
DrawQueue.AddVertex(v);
|
||||
|
||||
DrawQueue.AddElement(s1); DrawQueue.AddElement(s2); DrawQueue.AddElement(current + 0);
|
||||
|
@ -15,6 +15,7 @@ using Quik.Controls;
|
||||
using Quik.OpenGL;
|
||||
using GL = Quik.OpenGL.GL;
|
||||
using static Quik.OpenGL.GLEnum;
|
||||
using Quik.CommandMachine;
|
||||
|
||||
namespace QuikTestApplication
|
||||
{
|
||||
@ -62,17 +63,21 @@ void main()
|
||||
GL.LoadBindings(new GLFWBindingsContext().GetProcAddress);
|
||||
|
||||
FreeTypeFontManager fontManager = new FreeTypeFontManager();
|
||||
QuikContext context = new QuikContext(new OpenGLTextureManager(), fontManager);
|
||||
QuikVertexGenerator gen = new QuikVertexGenerator(context);
|
||||
QuikContext context = new QuikContext(new OpenGLTextureManager(), fontManager);
|
||||
|
||||
VertexGeneratorEngine engine = new VertexGeneratorEngine();
|
||||
CommandQueue cmdQueue = new CommandQueue();
|
||||
GL30Driver gldriver;
|
||||
|
||||
RootControl root = new RootControl(context);
|
||||
Button button = new Button()
|
||||
{
|
||||
Bounds = new QuikRectangle(120, 60, 20, 20),
|
||||
Bounds = new QRectangle(120, 60, 20, 20),
|
||||
Text = "button",
|
||||
Padding = 8,
|
||||
NormalStroke = new QuikStrokeStyle(new QuikColor(0xccccccff), 4f),
|
||||
HoverStroke = new QuikStrokeStyle(new QuikColor(0x1010ccff), 4f),
|
||||
ActiveStroke = new QuikStrokeStyle(new QuikColor(0x999999ff), 4f),
|
||||
NormalStroke = new QuikStrokeStyle(new QColor(0xccccccff), 4f),
|
||||
HoverStroke = new QuikStrokeStyle(new QColor(0x1010ccff), 4f),
|
||||
ActiveStroke = new QuikStrokeStyle(new QColor(0x999999ff), 4f),
|
||||
};
|
||||
button.Clicked += (sender, args) => {
|
||||
if (!args.Buttons.HasFlag(Quik.MouseButton.Primary))
|
||||
@ -98,109 +103,7 @@ void main()
|
||||
|
||||
GL.Enable(GL_MULTISAMPLE);
|
||||
|
||||
int sp;
|
||||
{
|
||||
int vs, fs;
|
||||
|
||||
sp = GL.CreateProgram();
|
||||
|
||||
vs = GL.CreateShader(GL_VERTEX_SHADER);
|
||||
fs = GL.CreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
GL.ShaderSource(vs, vertex);
|
||||
GL.CompileShader(vs);
|
||||
GL.ShaderSource(fs, fragment);
|
||||
GL.CompileShader(fs);
|
||||
|
||||
GL.AttachShader(sp, vs);
|
||||
GL.AttachShader(sp, fs);
|
||||
GL.LinkProgram(sp);
|
||||
|
||||
GL.UseProgram(sp);
|
||||
}
|
||||
|
||||
new GL30Driver();
|
||||
|
||||
int vbo, ebo, vao;
|
||||
vbo = GL.GenBuffer();
|
||||
ebo = GL.GenBuffer();
|
||||
|
||||
vao = GL.GenVertexArray();
|
||||
GL.BindVertexArray(vao);
|
||||
|
||||
GL.BindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
GL.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||
|
||||
int loc;
|
||||
GL.VertexAttribPointer(
|
||||
loc = GL.GetAttribLocation(sp, "position"),
|
||||
2,
|
||||
GL_FLOAT,
|
||||
false,
|
||||
QuikVertex.Stride,
|
||||
QuikVertex.PositionOffset);
|
||||
GL.EnableVertexAttribArray(loc);
|
||||
GL.VertexAttribPointer(
|
||||
loc = GL.GetAttribLocation(sp, "texcoord"),
|
||||
2,
|
||||
GL_FLOAT,
|
||||
false,
|
||||
QuikVertex.Stride,
|
||||
QuikVertex.TextureCoordinatesOffset);
|
||||
GL.EnableVertexAttribArray(loc);
|
||||
GL.VertexAttribPointer(
|
||||
loc = GL.GetAttribLocation(sp, "color"),
|
||||
4,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true,
|
||||
QuikVertex.Stride,
|
||||
QuikVertex.ColorOffset);
|
||||
GL.EnableVertexAttribArray(loc);
|
||||
|
||||
loc = GL.GetUniformLocation(sp, "matrix");
|
||||
|
||||
int offsetLoc = GL.GetUniformLocation(sp, "texture0offset");
|
||||
|
||||
QuikStrokeStyle strokeBorder = new QuikStrokeStyle()
|
||||
{
|
||||
Color = new QuikColor(0xaaaaaaff),
|
||||
Width = 8
|
||||
};
|
||||
|
||||
QuikStrokeStyle strokeNoBorder = new QuikStrokeStyle()
|
||||
{
|
||||
Color = new QuikColor(0xaaaaaaff),
|
||||
Width = 0
|
||||
};
|
||||
|
||||
QuikFillStyle fill = new QuikFillStyle()
|
||||
{
|
||||
Color = new QuikColor(0xeeeeeeff)
|
||||
};
|
||||
|
||||
QuikFillStyle magenta = new QuikFillStyle
|
||||
{
|
||||
Color = new QuikColor(0xff00ffff)
|
||||
};
|
||||
|
||||
int whiteTexture = GL.GenTexture();
|
||||
uint[] whitePixel = {0xFFFFFFFF};
|
||||
GL.BindTexture(GL_TEXTURE_2D, whiteTexture);
|
||||
GL.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, whitePixel);
|
||||
GL.TexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
GL.TexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
context.DefaultFont = context.FontManager.GetFont(new QuikFontStyle("Arial", 16, QuikFontType.Normal));
|
||||
|
||||
const string testString =
|
||||
"The quick brown fox jumps over the lazy dog. " +
|
||||
"Sphinx of black quartz judge my vow. " +
|
||||
"Have some japanese for fun: これが読めるかな?";
|
||||
|
||||
var para = new HorizontalParagraph();
|
||||
para.ConsumeText(context.DefaultFont, testString);
|
||||
var typeset = new TypesetGroup();
|
||||
para.Typeset(typeset, 200);
|
||||
gldriver = new GL30Driver();
|
||||
|
||||
window.Context.SwapInterval = 0;
|
||||
Stopwatch stopwatch = Stopwatch.StartNew();
|
||||
@ -215,7 +118,7 @@ void main()
|
||||
if (window.IsFocused)
|
||||
{
|
||||
var mouseState = window.MouseState;
|
||||
QuikVec2 postion = new QuikVec2(mouseState.Position.X, window.ClientSize.Y - mouseState.Position.Y) * (dpi/72f);
|
||||
QVec2 postion = new QVec2(mouseState.Position.X, window.ClientSize.Y - mouseState.Position.Y) * (dpi/72f);
|
||||
Quik.MouseButton buttons =
|
||||
(mouseState.IsButtonDown(OpenTK.Windowing.GraphicsLibraryFramework.MouseButton.Button1) ? Quik.MouseButton.Primary : 0) |
|
||||
(mouseState.IsButtonDown(OpenTK.Windowing.GraphicsLibraryFramework.MouseButton.Button2) ? Quik.MouseButton.Secondary : 0) |
|
||||
@ -224,107 +127,24 @@ void main()
|
||||
root.NotifyMouse(new Quik.MouseState(postion, buttons));
|
||||
}
|
||||
|
||||
root.Bounds = new QuikRectangle(
|
||||
root.Bounds = new QRectangle(
|
||||
window.ClientSize.X,
|
||||
window.ClientSize.Y,
|
||||
0,
|
||||
0);
|
||||
root.NotifyUpdate();
|
||||
|
||||
GL.Viewport(0, 0, window.Size.X, window.Size.Y);
|
||||
cmdQueue.Clear();
|
||||
root.NotifyPaint(cmdQueue);
|
||||
|
||||
engine.Reset();
|
||||
engine.ProcessCommands(root.Bounds, cmdQueue);
|
||||
|
||||
DrawQueue drawQueue = engine.DrawQueue;
|
||||
|
||||
GL.ClearColor(1,1,1,1);
|
||||
GL.Clear(GL_COLOR_BUFFER_BIT);
|
||||
GL.Enable(GL_BLEND);
|
||||
GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
Matrix4 matrix = Matrix4.CreateOrthographicOffCenter(
|
||||
0,
|
||||
(float)window.Size.X*dpi/72f,
|
||||
0,
|
||||
(float)window.Size.Y*dpi/72f,
|
||||
1,
|
||||
-1);
|
||||
GL.UniformMatrix4(loc, false, ref matrix.Row0.X);
|
||||
gldriver.Draw(drawQueue);
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(120, 60, 20, 20))
|
||||
{
|
||||
CornerRadius = 0,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeNoBorder
|
||||
});
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(240, 60, 140, 20))
|
||||
{
|
||||
CornerRadius = 4,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeNoBorder
|
||||
});
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(360, 60, 260, 20))
|
||||
{
|
||||
CornerRadius = 15,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeNoBorder
|
||||
});
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(120, 120, 20, 80))
|
||||
{
|
||||
CornerRadius = 0,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeBorder
|
||||
});
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(240, 120, 140, 80))
|
||||
{
|
||||
CornerRadius = 4,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeBorder
|
||||
});
|
||||
|
||||
context.Draw.Commands.Enqueue(
|
||||
new QuikCommandRectangle(new QuikRectangle(360, 120, 260, 80))
|
||||
{
|
||||
CornerRadius = 15,
|
||||
FillStyle = fill,
|
||||
StrokeStyle = strokeBorder
|
||||
});
|
||||
|
||||
// context.Draw.PutText("これが読めるかな?", new QuikVec2(25,30));
|
||||
root.NotifyPaint(context.Draw);
|
||||
|
||||
context.Draw.Commands.Enqueue(new QuikCommandEmitText(typeset, new QuikVec2(200, 200)));
|
||||
|
||||
QuikCommand command;
|
||||
while (context.Draw.Commands.TryDequeue(out command))
|
||||
{
|
||||
gen.ConsumeCommand(command);
|
||||
}
|
||||
|
||||
GL.BufferData(GL_ARRAY_BUFFER, gen.VertexCount * QuikVertex.Stride, gen.VertexBuffer, GL_STREAM_DRAW);
|
||||
GL.BufferData(GL_ELEMENT_ARRAY_BUFFER, gen.ElementCount * 2, gen.ElementBuffer, GL_STREAM_DRAW);
|
||||
|
||||
GL.Enable(GL_BLEND);
|
||||
GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
foreach (QuikDrawCall call in gen.DrawCalls)
|
||||
{
|
||||
GL.BindTexture(
|
||||
GL_TEXTURE_2D,
|
||||
call.Texture == null ? whiteTexture : (call.Texture as OpenGLTexture).TextureId);
|
||||
if (call.Texture != null)
|
||||
GL.Uniform2(offsetLoc, 0.5f / call.Texture.Width, 0.5f / call.Texture.Height);
|
||||
GL.DrawElements(GL_TRIANGLES, call.Count, GL_UNSIGNED_SHORT, call.Offset);
|
||||
}
|
||||
GL.Disable(GL_BLEND);
|
||||
|
||||
int callCount = gen.DrawCalls.Count;
|
||||
gen.Clear();
|
||||
System.Threading.Thread.Sleep(1);
|
||||
window.Context.SwapBuffers();
|
||||
|
||||
frames++;
|
||||
@ -334,7 +154,7 @@ void main()
|
||||
Console.WriteLine("Frames: {0}", frames*(ms - lastMs)/1000);
|
||||
frames = 0;
|
||||
lastMs = ms;
|
||||
Console.WriteLine("Vertex Usage: {0} ; Element Usage: {1} Calls: {2}", gen.VertexUsage, gen.ElementUsage, callCount);
|
||||
Console.WriteLine("Vertex Usage: {0} ; Element Usage: {1} Calls: {2}", drawQueue.VertexCount, drawQueue.ElementCount, drawQueue.DrawCallCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ namespace QuikTestApplication
|
||||
private static Dictionary<int, QuikGlyph> _glyphs = new Dictionary<int, QuikGlyph>();
|
||||
|
||||
public static byte[] TextureData { get; private set; } = Array.Empty<byte>();
|
||||
public static QuikVec2 TextureSize { get; private set; }
|
||||
public static QVec2 TextureSize { get; private set; }
|
||||
|
||||
public QuikTexture Texture { get; }
|
||||
|
||||
@ -55,7 +55,7 @@ namespace QuikTestApplication
|
||||
|
||||
_style = new QuikFontStyle(family, fontSize, style);
|
||||
|
||||
QuikVec2 atlasSize = default;
|
||||
QVec2 atlasSize = default;
|
||||
atlasSize.X = float.Parse(document.DocumentElement.Attributes["width"].Value);
|
||||
atlasSize.Y = float.Parse(document.DocumentElement.Attributes["height"].Value);
|
||||
|
||||
@ -63,18 +63,18 @@ namespace QuikTestApplication
|
||||
|
||||
foreach (XmlElement element in document.SelectNodes("/font/character"))
|
||||
{
|
||||
QuikRectangle UVs;
|
||||
QuikVec2 origin;
|
||||
QRectangle UVs;
|
||||
QVec2 origin;
|
||||
float advance;
|
||||
int chr = element.Attributes["text"].Value[0];
|
||||
|
||||
QuikVec2 pos;
|
||||
QuikVec2 size;
|
||||
QVec2 pos;
|
||||
QVec2 size;
|
||||
pos.X = float.Parse(element.Attributes["x"].Value);
|
||||
pos.Y = float.Parse(element.Attributes["y"].Value);
|
||||
size.X = float.Parse(element.Attributes["width"].Value);
|
||||
size.Y = float.Parse(element.Attributes["height"].Value);
|
||||
UVs = new QuikRectangle(
|
||||
UVs = new QRectangle(
|
||||
(pos.X + size.X)/atlasSize.X,
|
||||
pos.Y/atlasSize.Y,
|
||||
pos.X/atlasSize.X,
|
||||
@ -85,7 +85,7 @@ namespace QuikTestApplication
|
||||
|
||||
advance = float.Parse(element.Attributes["advance"].Value);
|
||||
|
||||
QuikGlyph glyph = new QuikGlyph(chr, UVs, size, origin, default, new QuikVec2(advance, 0));
|
||||
QuikGlyph glyph = new QuikGlyph(chr, UVs, size, origin, default, new QVec2(advance, 0));
|
||||
_glyphs.Add(chr, glyph);
|
||||
_characters.Add(chr);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user