summaryrefslogtreecommitdiff
path: root/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Graphs/Navmesh/NavmeshTile.cs
blob: fd5adc739f7c7e1655d458797df28d7ddff6e37b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
namespace Pathfinding.Graphs.Navmesh {
	using Pathfinding.Util;
	using Unity.Collections;

	/// <summary>
	/// 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.
	/// </summary>
	public class NavmeshTile : INavmeshHolder {
		/// <summary>
		/// All vertices in the tile.
		/// The vertices are in graph space.
		///
		/// This represents an allocation using the Persistent allocator.
		/// </summary>
		public UnsafeSpan<Int3> vertsInGraphSpace;
		/// <summary>
		/// All vertices in the tile.
		/// The vertices are in world space.
		///
		/// This represents an allocation using the Persistent allocator.
		/// </summary>
		public UnsafeSpan<Int3> verts;
		/// <summary>
		/// All triangle indices in the tile.
		/// One triangle is 3 indices.
		/// The triangles are in the same order as the <see cref="nodes"/>.
		///
		/// This represents an allocation using the Persistent allocator.
		/// </summary>
		public UnsafeSpan<int> tris;

		/// <summary>Tile X Coordinate</summary>
		public int x;

		/// <summary>Tile Z Coordinate</summary>
		public int z;

		/// <summary>
		/// Width, in tile coordinates.
		/// Warning: Widths other than 1 are not supported. This is mainly here for possible future features.
		/// </summary>
		public int w;

		/// <summary>
		/// Depth, in tile coordinates.
		/// Warning: Depths other than 1 are not supported. This is mainly here for possible future features.
		/// </summary>
		public int d;

		/// <summary>All nodes in the tile</summary>
		public TriangleMeshNode[] nodes;

		/// <summary>Bounding Box Tree for node lookups</summary>
		public BBTree bbTree;

		/// <summary>Temporary flag used for batching</summary>
		public bool flag;

		/// <summary>The graph which contains this tile</summary>
		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;
		}

		/// <summary>Get a specific vertex in the tile</summary>
		public Int3 GetVertex (int index) {
			int idx = index & NavmeshBase.VertexIndexMask;

			return verts[idx];
		}

		public Int3 GetVertexInGraphSpace (int index) {
			return vertsInGraphSpace[index & NavmeshBase.VertexIndexMask];
		}

		/// <summary>Transforms coordinates from graph space to world space</summary>
		public GraphTransform transform { get { return graph.transform; } }

		#endregion

		public void GetNodes (System.Action<GraphNode> 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);
			}
		}
	}
}