using InfinityCode.RealWorldTerrain; using UnityEditor; using UnityEngine; namespace InfinityCode.RealWorldTerrain.Tools { public class FixHeightSeams : ScriptableWizard { public RealWorldTerrainContainer container; [MenuItem("Window/Infinity Code/Real World Terrain/Tools/Seams Fixer")] public static void CreateWizard() { FixHeightSeams wnd = DisplayWizard("Seams Fixer", "Fix"); wnd.container = FindObjectOfType(); } private void FixHeights(float[,] h1, float[,] h2) { for (int i = 0; i < h1.GetLength(0); i++) { for (int j = 0; j < h1.GetLength(1); j++) { h1[i, j] = (h1[i, j] + h2[i, j]) / 2; } } } public void OnWizardCreate() { if (container == null) return; RealWorldTerrainVector2i size = container.terrainCount; for (int y = 0; y < size.y; y++) { bool fixY = y < size.y - 1; for (int x = 0; x < size.x; x++) { RealWorldTerrainItem i1 = container.terrains[y * size.x + x]; if (i1 == null) continue; TerrainData td1 = i1.terrainData; int r = td1.heightmapResolution; bool fixX = x < size.x - 1; if (fixX) { RealWorldTerrainItem i2 = container.terrains[y * size.x + x + 1]; if (i2 != null && r == i2.terrainData.heightmapResolution) { TerrainData td2 = i2.terrainData; float[,] h1 = td1.GetHeights(r - 1, 0, 1, r); float[,] h2 = td2.GetHeights(0, 0, 1, r); FixHeights(h1, h2); td1.SetHeights(r - 1, 0, h1); td2.SetHeights(0, 0, h1); } } if (fixY) { RealWorldTerrainItem i2 = container.terrains[(y + 1) * size.x + x]; if (i2 != null && r == i2.terrainData.heightmapResolution) { TerrainData td2 = i2.terrainData; float[,] h1 = td1.GetHeights(0, r - 1, r, 1); float[,] h2 = td2.GetHeights(0, 0, r, 1); FixHeights(h1, h2); td1.SetHeights(0, r - 1, h1); td2.SetHeights(0, 0, h1); } } } } } public void OnWizardUpdate() { helpString = "Please set Real World Terrain Container!"; } } }