using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Numerics;
namespace Dashboard.Drawing
{
///
/// Interface for all drawing extensions.
///
public interface IDrawExtension
{
///
/// Name of this extension.
///
public string Name { get; }
public IReadOnlyList Requires { get; }
///
/// The list of commands this extension defines, if any.
///
public IReadOnlyList Commands { get; }
}
///
/// A simple draw extension.
///
public class DrawExtension : IDrawExtension
{
private readonly List _drawCommands = new List();
public string Name { get; }
public IReadOnlyList Commands { get; }
public IReadOnlyList Requires { get; }
public DrawExtension(string name, IEnumerable? requires = null)
{
Name = name;
Commands = _drawCommands.AsReadOnly();
Requires = (requires ?? Enumerable.Empty()).ToImmutableList();
}
protected void AddCommand(IDrawCommand command)
{
_drawCommands.Add(command);
}
}
public static class DrawExtensionClass
{
///
/// Get the draw controller for the given queue.
///
/// The extension instance.
/// The draw queue.
/// The draw controller for this queue.
public static IDrawController GetController(this IDrawExtension extension, DrawQueue queue)
{
return queue.GetController(extension);
}
public static void Point(this DrawQueue queue, Vector3 position, float size, IBrush brush)
{
Vector3 radius = new Vector3(size / 2f);
Box3d bounds = new Box3d(position - radius, position + radius);
IDrawController controller = queue.GetController(DbBaseCommands.Instance);
controller.EnsureBounds(bounds);
controller.Write(DbBaseCommands.Instance.DrawPoint, new PointCommandArgs(position, size, brush));
}
public static void Line(this DrawQueue queue, Vector3 start, Vector3 end, float size, IBrush brush)
{
Vector3 radius = new Vector3(size / 2f);
Vector3 min = Vector3.Min(start, end) - radius;
Vector3 max = Vector3.Max(start, end) + radius;
Box3d bounds = new Box3d(min, max);
IDrawController controller = queue.GetController(DbBaseCommands.Instance);
controller.EnsureBounds(bounds);
controller.Write(DbBaseCommands.Instance.DrawLine, new LineCommandArgs(start, end, size, brush));
}
public static void Rect(this DrawQueue queue, Vector3 start, Vector3 end, IBrush fillBrush)
{
IDrawController controller = queue.GetController(DbBaseCommands.Instance);
Vector3 min = Vector3.Min(start, end);
Vector3 max = Vector3.Max(start, end);
controller.EnsureBounds(new Box3d(min, max));
controller.Write(DbBaseCommands.Instance.DrawRectF, new RectCommandArgs(start, end, fillBrush));
}
public static void Rect(this DrawQueue queue, Vector3 start, Vector3 end, IBrush strikeBrush, float strikeSize,
StrikeKind kind = StrikeKind.Center)
{
IDrawController controller = queue.GetController(DbBaseCommands.Instance);
Vector3 min = Vector3.Min(start, end);
Vector3 max = Vector3.Max(start, end);
controller.EnsureBounds(new Box3d(min, max));
controller.Write(DbBaseCommands.Instance.DrawRectF, new RectCommandArgs(start, end, strikeBrush, strikeSize, kind));
}
public static void Rect(this DrawQueue queue, Vector3 start, Vector3 end, IBrush fillBrush, IBrush strikeBrush,
float strikeSize, StrikeKind kind = StrikeKind.Center)
{
IDrawController controller = queue.GetController(DbBaseCommands.Instance);
Vector3 min = Vector3.Min(start, end);
Vector3 max = Vector3.Max(start, end);
controller.EnsureBounds(new Box3d(min, max));
controller.Write(DbBaseCommands.Instance.DrawRectF, new RectCommandArgs(start, end, fillBrush, strikeBrush, strikeSize, kind));
}
}
}