Image MaterialImageFromTileData(TerrainTileData tileData) { var data = new byte[TerrainTileData.Width * TerrainTileData.Height * 4]; for (var y = 0; y < TerrainTileData.Height; y++) { for (var x = 0; x < TerrainTileData.Width; x++) { var cell = tileData[x, y]; var i = (y * TerrainTileData.Width + x) * 4; var color = cell.Material.GetColor(); data[i] = unchecked ((byte)color.r8); data[i + 1] = unchecked ((byte)color.g8); data[i + 2] = unchecked ((byte)color.b8); data[i + 3] = unchecked ((byte)color.a8); } } var materialImage = new Image(); materialImage.CreateFromData(TerrainTileData.Width, TerrainTileData.Height, false, Image.Format.Rgba8, data); return(materialImage); }
bool TryLoadTileFile(int tileX, int tileY, TerrainTileData tileData) { var fullPath = TileFilePath(tileX, tileY); if (!new File().FileExists(fullPath)) { return(false); } var materialImage = new Image(); var loadError = materialImage.Load(fullPath); if (loadError != Error.Ok) { PrintErr($"Failed to load terrain tile at \"{fullPath}\": {loadError}"); return(false); } if (materialImage.GetWidth() != TerrainTileData.Width || materialImage.GetHeight() != TerrainTileData.Height) { PrintErr($"Failed to load terrain tile at \"{fullPath}\": image is not {TerrainTileData.Width}x{TerrainTileData.Height}"); return(false); } TileDataFromMaterialImage(materialImage, tileData); return(true); }
void TileGenerate(int tileX, int tileY, TerrainTileData tileData) { for (var y = 0; y < TerrainTileData.Height; y++) { for (var x = 0; x < TerrainTileData.Width; x++) { // TODO tileData[x, y] = new TerrainCell(TerrainMaterial.Air, (byte)(x & 0x3F), (byte)(y & 0x3F), 0); } } }
void TileDataFromMaterialImage(Image materialImage, TerrainTileData tileData) { materialImage.Lock(); for (var y = 0; y < TerrainTileData.Height; y++) { for (var x = 0; x < TerrainTileData.Width; x++) { var pixel = materialImage.GetPixel(x, y); var material = pixel.AsTerrainMaterial(); tileData[x, y] = new TerrainCell(material, (byte)(x & 0x3F), (byte)(y & 0x3F), 0); } } materialImage.Unlock(); }
void SaveTileFile(int tileX, int tileY, TerrainTileData tileData) { Assert(!SaveChanges, $"Trying to save tile [{tileX}, {tileY}], but terrain is set as readonly"); var materialImage = MaterialImageFromTileData(tileData); var fullPath = TileFilePath(tileX, tileY); if (!new File().FileExists($"{fullPath}/..")) { var mkdirError = new Directory().MakeDirRecursive($"{fullPath}/.."); if (mkdirError != Error.Ok) { PrintErr($"Failed to save terrain tile at \"{fullPath}\": failed to create directory, error {mkdirError}"); } var saveError = materialImage.SavePng(fullPath); if (mkdirError != Error.Ok) { PrintErr($"Failed to save terrain tile at \"{fullPath}\": {saveError}"); } } }