public static unsafe TerrainData LoadTerrain(string path, string expectedName, IntSize3 expectedSize)
{
if (File.Exists(path) == false)
return null;
using (var stream = File.OpenRead(path))
{
TerrainData terrain;
using (var br = new BinaryReader(stream, Encoding.Default, true))
{
var name = br.ReadString();
if (name != expectedName)
return null;
int w = br.ReadInt32();
int h = br.ReadInt32();
int d = br.ReadInt32();
var size = new IntSize3(w, h, d);
if (size != expectedSize)
return null;
terrain = new TerrainData(size);
}
fixed (TileData* v = terrain.m_tileGrid)
{
byte* p = (byte*)v;
int len = terrain.Size.Volume * sizeof(TileData);
using (var memStream = new UnmanagedMemoryStream(p, 0, len, FileAccess.Write))
CopyTo(stream, memStream, len);
}
fixed (byte* p = terrain.m_levelMap)
{
int len = terrain.Size.Plane.Area * sizeof(byte);
using (var memStream = new UnmanagedMemoryStream(p, 0, len, FileAccess.Write))
CopyTo(stream, memStream, len);
}
return terrain;
}
}