Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }