public override void Serialize(string path, TiledNavMesh mesh)
var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
using (var binaryWriter = new BinaryWriter(fileStream))
binaryWriter.Write((float)mesh.Origin.X);
binaryWriter.Write((float)mesh.Origin.Y);
binaryWriter.Write((float)mesh.Origin.Z);
binaryWriter.Write((float)mesh.TileWidth);
binaryWriter.Write((float)mesh.TileHeight);
binaryWriter.Write((int)mesh.MaxTiles);
binaryWriter.Write((int)mesh.MaxPolys);
binaryWriter.Write((int)mesh.Tiles.Count);
foreach (var tile in mesh.Tiles)
var id = mesh.GetTileRef(tile);
var meshTile = SerializeMeshTile(tile, id);
binaryWriter.Write(meshTile);
public override TiledNavMesh Deserialize(string path)
var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
using (var binaryReader = new BinaryReader(fileStream))
var x = binaryReader.ReadSingle();
var y = binaryReader.ReadSingle();
var z = binaryReader.ReadSingle();
var origin = new Vector3(x, y, z);
var tileWidth = binaryReader.ReadSingle();
var tileHeight = binaryReader.ReadSingle();
var maxTiles = binaryReader.ReadInt32();
var maxPolys = binaryReader.ReadInt32();
var mesh = new TiledNavMesh(origin, tileWidth, tileHeight, maxTiles, maxPolys);
var count = binaryReader.ReadInt32();
for (var i = 0; i < count; i++)
var tile = DeserializeMeshTile(mesh.IdManager, out tileRef);
private byte[] SerializeMeshTile(NavTile tile, NavPolyId id)
var memoryStream = new MemoryStream();
using (var binaryWriter = new BinaryWriter(memoryStream))
binaryWriter.Write((int)id.Id);
binaryWriter.Write((int)tile.Location.X);
binaryWriter.Write((int)tile.Location.Y);
binaryWriter.Write((int)tile.Layer);
binaryWriter.Write((int)tile.Salt);
binaryWriter.Write((float)tile.Bounds.Min.X);
binaryWriter.Write((float)tile.Bounds.Min.Y);
binaryWriter.Write((float)tile.Bounds.Min.Z);
binaryWriter.Write((float)tile.Bounds.Max.X);
binaryWriter.Write((float)tile.Bounds.Max.Y);
binaryWriter.Write((float)tile.Bounds.Max.Z);
var polys = new List<NavPoly>(tile.Polys);
binaryWriter.Write((int)polys.Count);
foreach (var poly in polys)
binaryWriter.Write((byte)poly.PolyType);
return memoryStream.ToArray();