Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 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);
         }
     }
 }
Esempio n. 4
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();
        }
Esempio n. 5
0
        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}");
                }
            }
        }