sneak/Shared/Debug.cs
Colin McMillen 1ffe1444b2 Debug: draw rects as 4 GPU-accelerated lines.
GitOrigin-RevId: 3286d0476b5032d785f74191609db4fbd768433c
2020-02-15 16:32:39 -05:00

127 lines
3.8 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.Collections.Generic;
namespace SemiColinGames {
static class Debug {
struct DebugRect {
public Rectangle Rect;
public Color Color;
public DebugRect(Rectangle rect, Color color) {
Rect = rect;
Color = color;
}
}
struct DebugLine {
public Point Start;
public Point End;
public Color Color;
public DebugLine(Point start, Point end, Color color) {
Start = start;
End = end;
Color = color;
}
}
public static bool Enabled = true;
// This is a LinkedList instead of a List because SetFpsText() adds to its front.
static readonly LinkedList<string> toasts = new LinkedList<string>();
// Lines in excess of MAX_LINES get dropped on the floor.
const int MAX_LINES = 2000;
const int MAX_LINE_VERTICES = MAX_LINES * 2;
static int lineIdx = 0;
static readonly VertexPositionColor[] lineVertices = new VertexPositionColor[MAX_LINE_VERTICES];
static VertexBuffer vertexBuffer;
public static void Initialize(GraphicsDevice graphics) {
vertexBuffer = new VertexBuffer(
graphics, typeof(VertexPositionColor), MAX_LINE_VERTICES, BufferUsage.WriteOnly);
}
public static void WriteLine(string s) {
System.Diagnostics.Debug.WriteLine(s);
}
public static void WriteLine(string s, params object[] args) {
System.Diagnostics.Debug.WriteLine(s, args);
}
public static void Clear(bool paused) {
toasts.Clear();
if (!paused) {
lineIdx = 0;
}
}
public static void AddToast(string s) {
toasts.AddLast(s);
}
// FPS text is always displayed as the first toast (if set).
public static void SetFpsText(string s) {
toasts.AddFirst(s);
}
public static void AddRect(Rectangle rect, Color color) {
AddLine(rect.Left, rect.Top, rect.Right, rect.Top, color);
AddLine(rect.Right, rect.Top, rect.Right, rect.Bottom, color);
AddLine(rect.Right, rect.Bottom, rect.Left, rect.Bottom, color);
AddLine(rect.Left, rect.Bottom, rect.Left, rect.Top, color);
}
public static void AddRect(AABB box, Color color) {
Rectangle rect = new Rectangle(
(int) (box.Position.X - box.HalfSize.X), (int) (box.Position.Y - box.HalfSize.Y),
(int) (box.HalfSize.X * 2), (int) (box.HalfSize.Y * 2));
AddRect(rect, color);
}
public static void AddLine(Point start, Point end, Color color) {
if (lineIdx >= MAX_LINE_VERTICES) {
return;
}
lineVertices[lineIdx] = new VertexPositionColor(new Vector3(start.X, start.Y, 0), color);
lineVertices[lineIdx + 1] = new VertexPositionColor(new Vector3(end.X, end.Y, 0), color);
lineIdx += 2;
}
public static void AddLine(int p1x, int p1y, int p2x, int p2y, Color color) {
AddLine(new Point(p1x, p1y), new Point(p2x, p2y), color);
}
public static void AddLine(Vector2 start, Vector2 end, Color color) {
AddLine(start.ToPoint(), end.ToPoint(), color);
}
public static void DrawToasts(SpriteBatch spriteBatch, SpriteFont font) {
if (!Enabled) {
return;
}
int y = 10;
foreach (var toast in toasts) {
spriteBatch.DrawString(font, toast, new Vector2(10, y), Color.Teal);
y += 30;
}
}
public static void Draw(GraphicsDevice graphics, BasicEffect lightingEffect) {
if (!Enabled) {
return;
}
if (lineIdx == 0) {
return;
}
graphics.SetVertexBuffer(vertexBuffer);
vertexBuffer.SetData(lineVertices);
foreach (EffectPass pass in lightingEffect.CurrentTechnique.Passes) {
pass.Apply();
graphics.DrawPrimitives(PrimitiveType.LineList, 0, lineIdx / 2);
}
}
}
}