public void GetBoundaryEdges_Polygon([NUnit.Framework.Range(1, 5)] int numberOfQuads) { MockMesh mesh = Polygon(numberOfQuads); var boundaryEdges = NavmeshProcessor.GetBoundaryEdges(mesh.indices, mesh.vertices).ToArray(); for (int i = 0; i < numberOfQuads; i++) { var v0 = new Vector3(i, 0); var v1 = new Vector3(i + 1, 0); var v2 = new Vector3(i, 1); var v3 = new Vector3(i + 1, 1); //Assert Contains top and bottom edge AssertContainsOne(boundaryEdges, true, (v0, v1), (v1, v0)); AssertContainsOne(boundaryEdges, true, (v2, v3), (v3, v2)); //Assert Doesn't contain diagonal edge AssertContainsOne(boundaryEdges, false, (v1, v2), (v2, v1)); //Assert If beginning -> contains left edge AssertContainsOne(boundaryEdges, i == 0, (v0, v2), (v2, v0)); //Assert If end -> contains right edge AssertContainsOne(boundaryEdges, i + 1 == numberOfQuads, (v1, v3), (v3, v1)); } //Assert Is of expected length Assert.AreEqual(2 * numberOfQuads + 2, boundaryEdges.Length); }
private static ConcurrentDictionary <Vector2Int, Chunk> GenerateChunks(NavMeshTriangulation navMeshTriangulation) { var dict = new ConcurrentDictionary <Vector2Int, Chunk>(); IList <Wall> walls = NavmeshProcessor.GetNavmeshBoundaryEdges(navMeshTriangulation); //Add walls foreach (Wall wall in walls) { var chunkIndices = BresenhamsLine.Intersect( IndexFunction(wall.StartPoint), IndexFunction(wall.EndPoint) ); foreach (var point in chunkIndices) { AddWall(wall, point); } } #if UNITY_EDITOR var parent = new GameObject("DEBUG Chunks"); foreach (var c in dict) { var go = new GameObject($"Chunk {c.Key}"); go.transform.parent = parent.transform; var vis = go.AddComponent <ChunkVisualiser>(); vis.Initialise(c.Value, c.Key); } #endif return(dict); void AddWall(Wall wall, Vector2Int key) { if (!dict.TryAdd(key, new Chunk(wall))) { dict[key].walls.Add(wall); } } }