public static unsafe void TestRasterize() { Rasterizer.StartRasterize(CRenderSettings.ResolutionF); RenderBuffer <float> tex0 = new RenderBuffer <float>(CRenderSettings.Resolution, 3); CharRenderBuffer <float> texChar = new CharRenderBuffer <float>(tex0); Vector2 *points = stackalloc Vector2[4]; for (float i = 0; i < JMath.PI_TWO; i += .02f) { Vector2 dir = new Vector2(MathF.Cos(i) * .3f, MathF.Sin(i) * .3f); Vector2 orthoDir = new Vector2(-dir.Y, dir.X); points[0] = new Vector2(.5f, .5f) + dir; points[1] = new Vector2(.5f, .5f) - dir; points[2] = new Vector2(.5f, .5f) + orthoDir; points[3] = new Vector2(.5f, .5f) - orthoDir; Rasterizer.SetPoints(points); Rasterizer.Line(); Rasterizer.Line(); tex0.WritePixel(Rasterizer.ContriveResult(), new GenericVector <float>(3) { 1f, 1f, 1f }); CRenderer.Render(texChar); tex0.Clear(); Thread.Sleep(16); } Rasterizer.EndRasterize(); }
public static unsafe void TestRasterizerLine() { Vector2 *line = stackalloc Vector2[2] { Vector2.Zero, Vector2.One }; Rasterizer.StartRasterize(new Vector2(100, 100)); Rasterizer.SetPoints(line); Rasterizer.Line(); var resultArr = Rasterizer.ContriveResult(); Assert.AreEqual(resultArr.Length, 100, 1); Rasterizer.EndRasterize(); }
public Maze() { Tiles = new Grid <int>(31, 31); Tiles.Clear(-1); // Generate graph Graph = Generate(); // Render floors into tileset foreach (var source in Graph.Vertices) { // For each place visible foreach (var target in Graph.GetNeighbors(source)) { var aco = (1, 1) + (source * 2); var bco = (1, 1) + (target * 2); // Draw floors into tile map foreach (var m in Rasterizer.Line(aco, bco)) { Tiles[m] = 0; } } } // Render walls foreach (var co in GetCoordinates(31, 31)) { if (Tiles[co] == 0) { continue; } // already a floor else { var north = co + (0, -1); var south = co + (0, +1); var west = co + (-1, 0); var east = co + (+1, 0); var face = Face.None; if ((Tiles.IsValidCoordinate(north) && Tiles[north] == 0) || co.Y == 0) { face |= Face.North; } if ((Tiles.IsValidCoordinate(south) && Tiles[south] == 0) || co.Y == 30) { face |= Face.South; } if ((Tiles.IsValidCoordinate(east) && Tiles[east] == 0) || co.X == 30) { face |= Face.East; } if ((Tiles.IsValidCoordinate(west) && Tiles[west] == 0) || co.X == 0) { face |= Face.West; } // Cross Wall if (face == Face.None) { Tiles[co] = 2; } else if (face == Face.North) { Tiles[co] = 2; } // Vertical Wall else if (face.HasFlag(Face.East | Face.West)) { Tiles[co] = face.HasFlag(Face.South) ? 8 : 3; } // Horizontal Wall else if (face == (Face.South | Face.North | Face.East)) { Tiles[co] = 9; } else if (face == (Face.South | Face.North | Face.West)) { Tiles[co] = 10; } else if (face == (Face.South | Face.North)) { Tiles[co] = 1; } else if (face == Face.South) { Tiles[co] = 1; } // Upper Right Corner else if (face == (Face.East | Face.North)) { Tiles[co] = 4; } else if (face == Face.East) { Tiles[co] = 4; } // Upper Left Corner else if (face == (Face.West | Face.North)) { Tiles[co] = 5; } else if (face == Face.West) { Tiles[co] = 5; } // Bottom Right Corner else if (face == (Face.South | Face.East)) { Tiles[co] = 6; } // Bottom Left Corner else if (face == (Face.South | Face.West)) { Tiles[co] = 7; } // Unable to determine tile to use else { Tiles[co] = -1; } } } }