using NUnit.Framework; using UnityEngine; using UnityEngine.TerrainTools; namespace UnityEditor.TerrainTools { [TestFixture] public class PaintTextureTest { /// /// /// [Test] public void RemoveTerrainLayer_UndoShouldCorrectSplatTextures() { var terrainData = new TerrainData(); terrainData.alphamapResolution = 16; terrainData.terrainLayers = new[] { new UnityEngine.TerrainLayer(), new UnityEngine.TerrainLayer(), new UnityEngine.TerrainLayer() }; int layerCount = 3; float[,,] map = new float[terrainData.alphamapWidth, terrainData.alphamapHeight, layerCount]; for (int i = 0; i < layerCount; i++) { for (int y = 0; y < terrainData.alphamapHeight; y++) { for (int x = 0; x < terrainData.alphamapWidth; x++) { map[x, y, 0] = 0; } } } // set magic pixels on all the layers so we can track what should be restored map[0, 0, 0] = 1.0f; map[0, 1, 1] = 1.0f; map[0, 2, 2] = 1.0f; terrainData.SetAlphamaps(0, 0, map); var terrain = Terrain.CreateTerrainGameObject(terrainData).GetComponent(); // the package uses this function because it performs some prepass prior to deletion TerrainToolboxLayer.RemoveLayerFromTerrain(terrainData, 1); Undo.PerformUndo(); terrainData.SyncTexture(TerrainData.AlphamapTextureName); var newMap = terrainData.GetAlphamaps(0, 0, terrainData.alphamapResolution, terrainData.alphamapResolution); for (int i = 0; i < layerCount; i++) { Assert.That(newMap[0, i, i], Is.EqualTo(1.0f)); } GameObject.DestroyImmediate(terrain.gameObject); } } }