From 5d21ff2a0f9a7ffff913d7504532a2870cf5325f Mon Sep 17 00:00:00 2001 From: Colin McMillen Date: Sat, 15 Feb 2020 15:47:05 -0500 Subject: [PATCH] Debug.DrawLines: use GPU to draw lines. Fixes #19. GitOrigin-RevId: d837e0ddafa0b7ea66fea4bba05ca7412a3c5726 --- Shared/Debug.cs | 42 +++++++++++++++++++++++++++++------------- Shared/LinesOfSight.cs | 1 + Shared/SneakGame.cs | 7 +++++-- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Shared/Debug.cs b/Shared/Debug.cs index 0167ee0..df02aa8 100644 --- a/Shared/Debug.cs +++ b/Shared/Debug.cs @@ -27,15 +27,22 @@ namespace SemiColinGames { } public static bool Enabled = true; + // Lines in excess of MAX_LINES get dropped on the floor. + const int MAX_LINES = 1000; + const int MAX_LINE_VERTICES = MAX_LINES * 2; // This is a LinkedList instead of a List because SetFpsText() adds to its front. static readonly LinkedList toasts = new LinkedList(); static readonly List rects = new List(); - static readonly List lines = new List(); + static int lineIdx = 0; + static readonly VertexPositionColor[] lineVertices = new VertexPositionColor[MAX_LINE_VERTICES]; + static VertexBuffer vertexBuffer; static Texture2D whiteTexture; - public static void Initialize(Texture2D white) { + public static void Initialize(GraphicsDevice graphics, Texture2D white) { whiteTexture = white; + vertexBuffer = new VertexBuffer( + graphics, typeof(VertexPositionColor), MAX_LINE_VERTICES, BufferUsage.WriteOnly); } public static void WriteLine(string s) { @@ -50,7 +57,7 @@ namespace SemiColinGames { toasts.Clear(); if (!paused) { rects.Clear(); - lines.Clear(); + lineIdx = 0; } } @@ -75,15 +82,20 @@ namespace SemiColinGames { } public static void AddLine(Point start, Point end, Color color) { - lines.Add(new DebugLine(start, end, 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) { - lines.Add(new DebugLine(new Point(p1x, p1y), new Point(p2x, p2y), color)); + AddLine(new Point(p1x, p1y), new Point(p2x, p2y), color); } public static void AddLine(Vector2 start, Vector2 end, Color color) { - lines.Add(new DebugLine(start.ToPoint(), end.ToPoint(), color)); + AddLine(start.ToPoint(), end.ToPoint(), color); } public static void DrawToasts(SpriteBatch spriteBatch, SpriteFont font) { @@ -97,10 +109,13 @@ namespace SemiColinGames { } } - public static void Draw(SpriteBatch spriteBatch) { + public static void Draw( + SpriteBatch spriteBatch, GraphicsDevice graphics, BasicEffect lightingEffect) { if (!Enabled) { return; } + + // Draw rects. foreach (var debugRect in rects) { var rect = debugRect.Rect; var color = debugRect.Color; @@ -117,12 +132,13 @@ namespace SemiColinGames { spriteBatch.Draw( whiteTexture, new Rectangle(rect.Right - 1, rect.Top, 1, rect.Height), color); } - foreach (var line in lines) { - Point[] points = Line.Rasterize(line.Start, line.End); - foreach (var point in points) { - spriteBatch.Draw( - whiteTexture, new Rectangle(point.X, point.Y, 1, 1), line.Color); - } + + // Draw lines. + graphics.SetVertexBuffer(vertexBuffer); + vertexBuffer.SetData(lineVertices); + foreach (EffectPass pass in lightingEffect.CurrentTechnique.Passes) { + pass.Apply(); + graphics.DrawPrimitives(PrimitiveType.LineList, 0, lineIdx / 2); } } } diff --git a/Shared/LinesOfSight.cs b/Shared/LinesOfSight.cs index 5b325d0..6631ac3 100644 --- a/Shared/LinesOfSight.cs +++ b/Shared/LinesOfSight.cs @@ -35,6 +35,7 @@ namespace SemiColinGames { float angle = -fov / 2 + fovStep * i; Vector2 rotated = ray.Rotate(angle); Vector2 closestHit = Vector2.Add(eyePos, rotated); + Debug.AddLine(eyePos, closestHit, Color.Yellow); float hitTime = 1f; Vector2 halfTileSize = new Vector2(World.TileSize / 2.0f, World.TileSize / 2.0f); diff --git a/Shared/SneakGame.cs b/Shared/SneakGame.cs index c947daa..592c5d7 100644 --- a/Shared/SneakGame.cs +++ b/Shared/SneakGame.cs @@ -90,7 +90,7 @@ namespace SemiColinGames { whiteTexture = new Texture2D(GraphicsDevice, 1, 1); whiteTexture.SetData(new Color[] { Color.White }); - Debug.Initialize(whiteTexture); + Debug.Initialize(GraphicsDevice, whiteTexture); } // Called once per game. Unloads all game content. @@ -99,6 +99,8 @@ namespace SemiColinGames { updateTimer.DumpStats(); drawTimer.DumpStats(); + + base.UnloadContent(); } // Updates the game world. @@ -182,7 +184,8 @@ namespace SemiColinGames { world.Draw(spriteBatch); // Draw debug rects & lines. - Debug.Draw(spriteBatch); + lightingEffect.Projection = camera.Projection; + Debug.Draw(spriteBatch, GraphicsDevice, lightingEffect); // Aaaaand we're done. spriteBatch.End();