using Unity.Collections; using Unity.Profiling; namespace Pathfinding.Graphs.Navmesh { using Pathfinding.Util; using Pathfinding.Collections; /// /// A single tile in a recast or navmesh graph. /// /// A tile is a single rectangular (but usually square) part of the graph. /// Tiles can be updated individually, which is great for large worlds where updating the whole graph would take a long time. /// public class NavmeshTile : INavmeshHolder { /// /// All vertices in the tile. /// The vertices are in graph space. /// /// This represents an allocation using the Persistent allocator. /// public UnsafeSpan vertsInGraphSpace; /// /// All vertices in the tile. /// The vertices are in world space. /// /// This represents an allocation using the Persistent allocator. /// public UnsafeSpan verts; /// /// All triangle indices in the tile. /// One triangle is 3 indices. /// The triangles are in the same order as the . /// /// This represents an allocation using the Persistent allocator. /// public UnsafeSpan tris; /// /// True if this tile may have been cut by s, or had pieces added by components. /// /// If true, the , and fields will be valid. /// public bool isCut; public UnsafeSpan preCutVertsInTileSpace; public UnsafeSpan preCutTris; public UnsafeSpan preCutTags; /// Tile X Coordinate public int x; /// Tile Z Coordinate public int z; /// /// Width, in tile coordinates. /// Warning: Widths other than 1 are not supported. This is mainly here for possible future features. /// public int w; /// /// Depth, in tile coordinates. /// Warning: Depths other than 1 are not supported. This is mainly here for possible future features. /// public int d; /// All nodes in the tile public TriangleMeshNode[] nodes; /// Bounding Box Tree for node lookups public BBTree bbTree; /// Temporary flag used for batching public bool flag; /// The graph which contains this tile public NavmeshBase graph; #region INavmeshHolder implementation public void GetTileCoordinates (int tileIndex, out int x, out int z) { x = this.x; z = this.z; } public int GetVertexArrayIndex (int index) { return index & NavmeshBase.VertexIndexMask; } /// Get a specific vertex in the tile public Int3 GetVertex (int index) { int idx = index & NavmeshBase.VertexIndexMask; return verts[idx]; } [IgnoredByDeepProfiler] public Int3 GetVertexInGraphSpace (int index) { return vertsInGraphSpace[index & NavmeshBase.VertexIndexMask]; } /// Transforms coordinates from graph space to world space public GraphTransform transform { get { return graph.transform; } } #endregion public void GetNodes (System.Action action) { if (nodes == null) return; for (int i = 0; i < nodes.Length; i++) action(nodes[i]); } public void Dispose () { unsafe { bbTree.Dispose(); vertsInGraphSpace.Free(Allocator.Persistent); verts.Free(Allocator.Persistent); tris.Free(Allocator.Persistent); preCutTags.Free(Allocator.Persistent); preCutVertsInTileSpace.Free(Allocator.Persistent); preCutTris.Free(Allocator.Persistent); // Ensure Dispose is idempotent vertsInGraphSpace = default; verts = default; tris = default; preCutTags = default; preCutVertsInTileSpace = default; preCutTris = default; isCut = false; } } } }