public static void SetSplatFromMap(TerrainExtension ter) { Terrain t = ter.GetComponent <Terrain>(); int splatMapWidth = t.terrainData.alphamapWidth; float[,,] splatmapData = new float[splatMapWidth, splatMapWidth, t.terrainData.alphamapLayers]; float tx = 0; float ty = 0; for (int y = 0; y < splatMapWidth; y++) { ty = (float)(y) / (float)splatMapWidth; for (int x = 0; x < splatMapWidth; x++) { tx = (float)(x) / (float)splatMapWidth; float etx = tx; if (ter.FlipSplatMapX) { etx = 1 - tx; } float ety = ty; if (ter.FlipSplatMapY) { ety = 1 - ty; } Color c = ter.GetSplatMap().GetPixelBilinear(ety, etx); float[] ts = new float[4]; float total = 1; //c.g+c.b+c.a; //Normalize splats ts[1] = c.g; total -= ts[1]; ts[2] = Mathf.Clamp01(c.b * total); total -= ts[2]; ts[3] = Mathf.Clamp01(c.r * total); total -= ts[3]; ts[0] = Mathf.Clamp01(total); for (int j = 0; j < t.terrainData.alphamapLayers; j++) { splatmapData[x, y, j] = ts[j]; } } } t.terrainData.SetAlphamaps(0, 0, splatmapData); }
public static void SaveSplatMapFromTerrain(TerrainExtension ter, string path) { Terrain t = ter.GetComponent <Terrain>(); int splatMapWidth = t.terrainData.alphamapWidth; float[,,] splatmapData = t.terrainData.GetAlphamaps(0, 0, splatMapWidth, splatMapWidth); var targetSplatmap = ter.GetSplatMap(); Color [] colors = new Color[splatMapWidth * splatMapWidth]; if (splatmapData != null && t.terrainData.splatPrototypes.Length > 1) { for (int j = 0; j < targetSplatmap.height; j++) { for (int i = 0; i < targetSplatmap.width; i++) { float tu = i / ((float)targetSplatmap.width); float tv = j / ((float)targetSplatmap.height); Color splatC = Color.red; int sxi = Mathf.Clamp(Mathf.RoundToInt((float)splatMapWidth * tv), 0, splatMapWidth - 1); int syi = Mathf.Clamp(Mathf.RoundToInt((float)splatMapWidth * tu), 0, splatMapWidth - 1); splatC.r = splatmapData[sxi, syi, 3]; splatC.g = splatmapData[sxi, syi, 1]; splatC.b = splatmapData[sxi, syi, 2]; splatC.a = 1; colors[j * targetSplatmap.height + i] = splatC; //targetSplatmap.SetPixel(i, j, splatC); } } } targetSplatmap.SetPixels(colors); byte[] bytes = targetSplatmap.EncodeToPNG(); //string path = AssetDatabase.GetAssetOrScenePath(ter.GetSplatMap()); Debug.Log("Writing to path" + path); if (!string.IsNullOrEmpty(path)) { File.WriteAllBytes(path, bytes); } }
public override void OnInspectorGUI() { base.OnInspectorGUI(); TerrainExtension ter = (TerrainExtension)target as TerrainExtension; EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Editor for terrain extension"); EditorGUILayout.EndHorizontal(); /*if (ter.Lightmap != null) * { * if (GUILayout.Button("Generate NormalMap")) * { * if (ter.BakeAllTimeIndicesUpTo > 0) * { * for (int i = 0; i < ter.BakeAllTimeIndicesUpTo; i++) * { * ter.BakeTimeIndex = i; * TerrainMapGenerator.GenerateNormalMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetNormalMap())); * } * } * else * { * TerrainMapGenerator.GenerateNormalMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetNormalMap())); * } * } * * if (GUILayout.Button("Generate HeightMap")) * { * TerrainMapGenerator.GenerateHeightMap(ter, AssetDatabase.GetAssetOrScenePath(ter.GetHeightMap())); * } * * } * else * { * GUILayout.Label("Must create a png map (with correct settings)\n and associate it as Normal map on both the material\n and on the terrain extension"); * }*/ if (ter.GetSplatMap() != null) { if (GUILayout.Button("Set splat from map")) { SetSplatFromMap(ter); } if (GUILayout.Button("Save splatmap")) { TerrainMapGenerator.SaveSplatMapFromTerrain(ter, AssetDatabase.GetAssetOrScenePath(ter.GetSplatMap())); } } if (GUILayout.Button("Generate splatmap from terrain")) { TerrainMapGenerator.GenerateSplatMap(ter); } if (GUILayout.Button("Smooth terrain")) { SmoothTerrain(ter); } /*if (GUILayout.Button("AddRockNoise")) * { * TerrainMapGenerator.GenerateRockNoise(ter); * }*/ }