public static HeightMap[,] ExtractTileHeightMaps(ADTFile adt) { var maps = new HeightMap[TerrainConstants.ChunksPerTileSide, TerrainConstants.ChunksPerTileSide]; for (var y = 0; y < TerrainConstants.ChunksPerTileSide; y++) { for (var x = 0; x < TerrainConstants.ChunksPerTileSide; x++) { var chunk = adt.MapChunks[x, y]; var heights = adt.HeightMaps[x, y].Heights; var liq = adt.LiquidMaps[x, y]; var heightMap = new HeightMap { MedianHeight = chunk.Y }; // Read in Outer Heights for (var row = 0; row < 17; row += 2) { if (row % 2 != 0) continue; for (var col = 0; col < 9; col++) { var count = ((row / 2) * 9) + ((row / 2) * 8) + col; heightMap.OuterHeightDiff[row / 2, col] = heights[count]; } } // Read in Inner Heights for (var row = 1; row < 16; row++) { if (row % 2 != 1) continue; for (var col = 0; col < 8; col++) { var count = (((row + 1) / 2) * 9) + ((row / 2) * 8) + col; heightMap.InnerHeightDiff[row / 2, col] = heights[count]; } } // Read in Liquid Heights if (liq != null && (liq.Used && liq.Heights != null)) { for (var row = 0; row < 9; row++) { for (var col = 0; col < 9; col++) { if (row < liq.YOffset || row > (liq.YOffset + liq.Height) || col < liq.XOffset || col > (liq.XOffset + liq.Width)) { heightMap.LiquidHeight[row, col] = float.MinValue; continue; } var oldRow = row - liq.YOffset; var oldCol = col - liq.XOffset; heightMap.LiquidHeight[row, col] = liq.Heights[oldRow, oldCol]; } } } maps[x, y] = heightMap; } } return maps; }
public static HeightMap[,] ReadHeightMaps(BinaryReader reader, bool[,] profile) { var heightMaps = new HeightMap[TerrainConstants.ChunksPerTileSide, TerrainConstants.ChunksPerTileSide]; for (var y = 0; y < TerrainConstants.ChunksPerTileSide; y++) { for (var x = 0; x < TerrainConstants.ChunksPerTileSide; x++) { heightMaps[x, y] = ReadHeightMap(reader, profile[x, y]); } } return heightMaps; }
public static HeightMap ReadHeightMap(BinaryReader reader, bool readLiquid) { var map = new HeightMap { IsFlat = reader.ReadBoolean(), MedianHeight = reader.ReadSingle() }; if (!map.IsFlat) { for (var y = 0; y < 9; y++) { for (var x = 0; x < 9; x++) { map.OuterHeightDiff[x, y] = reader.ReadSingle(); } } for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { map.InnerHeightDiff[x, y] = reader.ReadSingle(); } } } if (readLiquid) { for (var y = 0; y < 9; y++) { for (var x = 0; x < 9; x++) { map.LiquidHeight[x, y] = reader.ReadSingle(); } } } return map; }
public static void WriteHeightMap(BinaryWriter writer, HeightMap map, bool writeLiquid) { writer.Write(map.IsFlat); writer.Write(map.MedianHeight); if (!map.IsFlat) { for (var y = 0; y < 9; y++) { for (var x = 0; x < 9; x++) { writer.Write(map.OuterHeightDiff[x, y]); } } for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { writer.Write(map.InnerHeightDiff[x, y]); } } } if (writeLiquid) { for (var y = 0; y < 9; y++) { for (var x = 0; x < 9; x++) { writer.Write(map.LiquidHeight[x, y]); } } } }