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;
}
}
}
}