Convert command queue to a command list.
This commit is contained in:
parent
51e9018a22
commit
9c9efc6eeb
@ -65,7 +65,7 @@ namespace Quik.OpenTK
|
|||||||
_window.Focus();
|
_window.Focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Paint(CommandQueue queue)
|
public void Paint(CommandList queue)
|
||||||
{
|
{
|
||||||
QRectangle view = new QRectangle(Size, new QVec2(0, 0));
|
QRectangle view = new QRectangle(Size, new QVec2(0, 0));
|
||||||
|
|
||||||
|
@ -34,10 +34,12 @@ namespace Quik.CommandMachine
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ProcessCommands(QRectangle bounds, CommandQueue queue)
|
public void ProcessCommands(QRectangle bounds, CommandList queue)
|
||||||
{
|
{
|
||||||
if (!queue.Peek().IsCommand)
|
CommandEnumerator iterator = queue.GetEnumerator();
|
||||||
throw new ArgumentException("The first element in the queue must be a command frame.");
|
|
||||||
|
if (!iterator.Peek().IsCommand)
|
||||||
|
throw new ArgumentException("The first element in the iterator must be a command frame.");
|
||||||
|
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
@ -45,7 +47,7 @@ namespace Quik.CommandMachine
|
|||||||
_viewportStack.Push(_viewport);
|
_viewportStack.Push(_viewport);
|
||||||
|
|
||||||
Frame frame;
|
Frame frame;
|
||||||
while (queue.TryDequeue(out frame))
|
while (iterator.TryDequeue(out frame))
|
||||||
{
|
{
|
||||||
Command cmd = (Command)frame;
|
Command cmd = (Command)frame;
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
@ -53,28 +55,28 @@ namespace Quik.CommandMachine
|
|||||||
default:
|
default:
|
||||||
if (cmd > Command.CustomCommandBase)
|
if (cmd > Command.CustomCommandBase)
|
||||||
{
|
{
|
||||||
_customCommands[cmd - Command.CustomCommandBase].Invoke(this, queue);
|
_customCommands[cmd - Command.CustomCommandBase].Invoke(this, iterator);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ChildProcessCommand(cmd, queue);
|
ChildProcessCommand(cmd, iterator);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Command.ConditionalBegin: ConditionalHandler(queue); break;
|
case Command.ConditionalBegin: ConditionalHandler(iterator); break;
|
||||||
case Command.ConditionalEnd: /* nop */ break;
|
case Command.ConditionalEnd: /* nop */ break;
|
||||||
|
|
||||||
case Command.Invoke:
|
case Command.Invoke:
|
||||||
queue.Dequeue().As<QuikCommandHandler>().Invoke(this, queue);
|
iterator.Dequeue().As<QuikCommandHandler>().Invoke(this, iterator);
|
||||||
break;
|
break;
|
||||||
case Command.PushViewport:
|
case Command.PushViewport:
|
||||||
_viewportStack.Push(_viewport);
|
_viewportStack.Push(_viewport);
|
||||||
break;
|
break;
|
||||||
case Command.IntersectViewport:
|
case Command.IntersectViewport:
|
||||||
_viewport = QRectangle.Intersect((QRectangle)queue.Dequeue(), _viewport);
|
_viewport = QRectangle.Intersect((QRectangle)iterator.Dequeue(), _viewport);
|
||||||
break;
|
break;
|
||||||
case Command.StoreViewport:
|
case Command.StoreViewport:
|
||||||
_viewport = (QRectangle)queue.Dequeue();
|
_viewport = (QRectangle)iterator.Dequeue();
|
||||||
break;
|
break;
|
||||||
case Command.PopViewport:
|
case Command.PopViewport:
|
||||||
_viewport = _viewportStack.TryPop(out QRectangle viewport) ? viewport : bounds;
|
_viewport = _viewportStack.TryPop(out QRectangle viewport) ? viewport : bounds;
|
||||||
@ -86,10 +88,10 @@ namespace Quik.CommandMachine
|
|||||||
_zIndex++;
|
_zIndex++;
|
||||||
break;
|
break;
|
||||||
case Command.AddZ:
|
case Command.AddZ:
|
||||||
_zIndex += (int)queue.Dequeue();
|
_zIndex += (int)iterator.Dequeue();
|
||||||
break;
|
break;
|
||||||
case Command.StoreZ:
|
case Command.StoreZ:
|
||||||
_zIndex = (int)queue.Dequeue();
|
_zIndex = (int)iterator.Dequeue();
|
||||||
break;
|
break;
|
||||||
case Command.DecrementZ:
|
case Command.DecrementZ:
|
||||||
_zIndex--;
|
_zIndex--;
|
||||||
@ -101,7 +103,7 @@ namespace Quik.CommandMachine
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void ChildProcessCommand(Command name, CommandQueue queue)
|
protected virtual void ChildProcessCommand(Command name, CommandEnumerator queue)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,16 +112,16 @@ namespace Quik.CommandMachine
|
|||||||
_zIndex = 0;
|
_zIndex = 0;
|
||||||
_zStack.Clear();
|
_zStack.Clear();
|
||||||
|
|
||||||
_viewport = new QRectangle(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue);
|
_viewport = new QRectangle(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue);
|
||||||
_viewportStack.Clear();
|
_viewportStack.Clear();
|
||||||
|
|
||||||
_matrixStack.Clear();
|
_matrixStack.Clear();
|
||||||
_matrixStack.Push(QMat4.Identity);
|
_matrixStack.Push(QMat4.Identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ConditionalHandler(CommandQueue queue)
|
private void ConditionalHandler(CommandEnumerator iterator)
|
||||||
{
|
{
|
||||||
Frame frame = queue.Dequeue();
|
Frame frame = iterator.Dequeue();
|
||||||
|
|
||||||
if (
|
if (
|
||||||
frame.IsInteger && (int)frame != 0 ||
|
frame.IsInteger && (int)frame != 0 ||
|
||||||
@ -131,11 +133,11 @@ namespace Quik.CommandMachine
|
|||||||
|
|
||||||
// Skip this branch.
|
// Skip this branch.
|
||||||
int depth = 1;
|
int depth = 1;
|
||||||
while (queue.TryPeek(out frame))
|
while (iterator.TryPeek(out frame))
|
||||||
{
|
{
|
||||||
if (!frame.IsCommand)
|
if (!frame.IsCommand)
|
||||||
{
|
{
|
||||||
queue.Dequeue();
|
iterator.Dequeue();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,13 +151,13 @@ namespace Quik.CommandMachine
|
|||||||
// Decrement condional depth, exit if zero.
|
// Decrement condional depth, exit if zero.
|
||||||
if (--depth == 0)
|
if (--depth == 0)
|
||||||
{
|
{
|
||||||
queue.Dequeue();
|
iterator.Dequeue();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue.Dequeue();
|
iterator.Dequeue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,5 +4,5 @@ namespace Quik.CommandMachine
|
|||||||
/// A delegate for a QUIK command.
|
/// A delegate for a QUIK command.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="stack">The current stack.</param>
|
/// <param name="stack">The current stack.</param>
|
||||||
public delegate void QuikCommandHandler(CommandEngine state, CommandQueue queue);
|
public delegate void QuikCommandHandler(CommandEngine state, CommandEnumerator queue);
|
||||||
}
|
}
|
@ -1,10 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Reflection.Emit;
|
||||||
|
|
||||||
namespace Quik.CommandMachine
|
namespace Quik.CommandMachine
|
||||||
{
|
{
|
||||||
public class CommandQueue : Queue<Frame>
|
public class CommandList : IEnumerable<Frame>
|
||||||
{
|
{
|
||||||
|
private readonly List<Frame> _frames = new List<Frame>();
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_frames.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Enqueue(in Frame frame)
|
||||||
|
{
|
||||||
|
_frames.Add(frame);
|
||||||
|
}
|
||||||
|
|
||||||
public void Invoke(QuikCommandHandler handler)
|
public void Invoke(QuikCommandHandler handler)
|
||||||
{
|
{
|
||||||
Enqueue(Command.Invoke);
|
Enqueue(Command.Invoke);
|
||||||
@ -243,5 +258,84 @@ namespace Quik.CommandMachine
|
|||||||
Enqueue(uvs[i]);
|
Enqueue(uvs[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Splice(CommandList queue)
|
||||||
|
{
|
||||||
|
foreach (Frame frame in queue)
|
||||||
|
{
|
||||||
|
Enqueue(frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandEnumerator GetEnumerator() => new CommandEnumerator(_frames);
|
||||||
|
IEnumerator<Frame> IEnumerable<Frame>.GetEnumerator() => GetEnumerator();
|
||||||
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CommandEnumerator : IEnumerator<Frame>
|
||||||
|
{
|
||||||
|
private readonly IReadOnlyList<Frame> _frames;
|
||||||
|
private int _current;
|
||||||
|
|
||||||
|
public Frame Current => _frames[_current];
|
||||||
|
|
||||||
|
object IEnumerator.Current => Current;
|
||||||
|
|
||||||
|
public CommandEnumerator(IReadOnlyList<Frame> frames)
|
||||||
|
{
|
||||||
|
_current = -1;
|
||||||
|
_frames = frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryDequeue([NotNullWhen(true)] out Frame frame)
|
||||||
|
{
|
||||||
|
if (MoveNext())
|
||||||
|
{
|
||||||
|
frame = Current;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
frame = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame Dequeue() => TryDequeue(out Frame frame) ? frame : throw new Exception("No more frames left.");
|
||||||
|
|
||||||
|
public bool TryPeek([NotNullWhen(true)] out Frame frame)
|
||||||
|
{
|
||||||
|
if (_current + 1 < _frames.Count)
|
||||||
|
{
|
||||||
|
frame = _frames[_current + 1];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
frame = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame Peek() => TryPeek(out Frame frame) ? frame : throw new Exception("No more frames left.");
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (_current + 1 < _frames.Count)
|
||||||
|
{
|
||||||
|
_current++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_current = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -44,20 +44,20 @@ namespace Quik.Controls
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void PaintBegin(CommandQueue cmd)
|
protected virtual void PaintBegin(CommandList cmd)
|
||||||
{
|
{
|
||||||
cmd.PushViewport();
|
cmd.PushViewport();
|
||||||
cmd.StoreViewport(AbsoluteBounds);
|
cmd.StoreViewport(AbsoluteBounds);
|
||||||
cmd.PushZ();
|
cmd.PushZ();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void PaintEnd(CommandQueue cmd)
|
protected virtual void PaintEnd(CommandList cmd)
|
||||||
{
|
{
|
||||||
cmd.PopZ();
|
cmd.PopZ();
|
||||||
cmd.PopViewport();
|
cmd.PopViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Paint(CommandQueue cmd)
|
public void Paint(CommandList cmd)
|
||||||
{
|
{
|
||||||
PaintBegin(cmd);
|
PaintBegin(cmd);
|
||||||
PaintEnd(cmd);
|
PaintEnd(cmd);
|
||||||
|
@ -44,6 +44,6 @@ namespace Quik.PAL
|
|||||||
/// Paint the given command queue onto the port.
|
/// Paint the given command queue onto the port.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="queue">The command queue to paint.</param>
|
/// <param name="queue">The command queue to paint.</param>
|
||||||
void Paint(CommandQueue queue);
|
void Paint(CommandList queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -50,7 +50,7 @@ namespace Quik
|
|||||||
public void Run(View mainView)
|
public void Run(View mainView)
|
||||||
{
|
{
|
||||||
IQuikPort port = Platform.CreatePort();
|
IQuikPort port = Platform.CreatePort();
|
||||||
CommandQueue cmd = new CommandQueue();
|
CommandList cmd = new CommandList();
|
||||||
|
|
||||||
MainView = mainView;
|
MainView = mainView;
|
||||||
|
|
||||||
@ -61,6 +61,7 @@ namespace Quik
|
|||||||
Platform.ProcessEvents(false);
|
Platform.ProcessEvents(false);
|
||||||
if (port.IsValid)
|
if (port.IsValid)
|
||||||
{
|
{
|
||||||
|
cmd.Clear();
|
||||||
MainView.Paint(cmd);
|
MainView.Paint(cmd);
|
||||||
port.Paint(cmd);
|
port.Paint(cmd);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ namespace Quik.VertexGenerator
|
|||||||
DrawQueue.Clear();
|
DrawQueue.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ChildProcessCommand(Command name, CommandQueue queue)
|
protected override void ChildProcessCommand(Command name, CommandEnumerator queue)
|
||||||
{
|
{
|
||||||
base.ChildProcessCommand(name, queue);
|
base.ChildProcessCommand(name, queue);
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ namespace Quik.VertexGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<QLine> LineList = new List<QLine>();
|
private readonly List<QLine> LineList = new List<QLine>();
|
||||||
private void LineProc(CommandQueue queue)
|
private void LineProc(CommandEnumerator queue)
|
||||||
{
|
{
|
||||||
Frame frame = queue.Dequeue();
|
Frame frame = queue.Dequeue();
|
||||||
|
|
||||||
@ -280,7 +280,7 @@ namespace Quik.VertexGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<QBezier> BezierList = new List<QBezier>();
|
private readonly List<QBezier> BezierList = new List<QBezier>();
|
||||||
private void BezierProc(CommandQueue queue)
|
private void BezierProc(CommandEnumerator queue)
|
||||||
{
|
{
|
||||||
Frame a = queue.Dequeue();
|
Frame a = queue.Dequeue();
|
||||||
Frame b;
|
Frame b;
|
||||||
@ -397,7 +397,7 @@ namespace Quik.VertexGenerator
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<QRectangle> RectangleList = new List<QRectangle>();
|
private readonly List<QRectangle> RectangleList = new List<QRectangle>();
|
||||||
private void RectangleProc(CommandQueue queue)
|
private void RectangleProc(CommandEnumerator queue)
|
||||||
{
|
{
|
||||||
Frame frame = queue.Dequeue();
|
Frame frame = queue.Dequeue();
|
||||||
RectangleList.Clear();
|
RectangleList.Clear();
|
||||||
@ -422,8 +422,8 @@ namespace Quik.VertexGenerator
|
|||||||
{
|
{
|
||||||
QRectangle outer = RectangleList[i];
|
QRectangle outer = RectangleList[i];
|
||||||
QRectangle inner = new QRectangle(
|
QRectangle inner = new QRectangle(
|
||||||
outer.Right - stroke, outer.Top - stroke,
|
outer.Right - stroke, outer.Bottom + stroke,
|
||||||
outer.Left + stroke, outer.Bottom + stroke);
|
outer.Left + stroke, outer.Top - stroke);
|
||||||
|
|
||||||
GenerateRectangleBase(inner, Math.Max(radius - stroke, 0.0f));
|
GenerateRectangleBase(inner, Math.Max(radius - stroke, 0.0f));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user