using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using GISTech.GISTerrainLoader; using UnityEngine; using UnityEngine.UI; public class BlendMultiLayers : MonoBehaviour { public Dropdown UILayers; public Slider UIOpacitySlider; private string TerrainFilePath; private GISTerrainLoaderPrefs Prefs; private GISTerrainLoaderRuntimePrefs RuntimePrefs; private RuntimeTerrainGenerator RuntimeGenerator; private float Opacity; private float[,,] splat; public int areaOfEffectSize = 100; private void Start() { TerrainFilePath = Application.streamingAssetsPath + "/GIS Terrains/MultiTextures/TIFF.tif"; RuntimeGenerator = GISTerrainLoaderMonoSingleton.Get; RuntimePrefs = GISTerrainLoaderMonoSingleton.Get; Prefs = RuntimePrefs.Prefs; UILayers.onValueChanged.AddListener(OnUILayerValueChanged); SetUILayers(); UIOpacitySlider.onValueChanged.AddListener(UIOpacitySliderValueChanged); StartCoroutine(GenerateTerrain(TerrainFilePath)); } private IEnumerator GenerateTerrain(string TerrainPath) { if ((Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.WindowsPlayer) && (string.IsNullOrEmpty(TerrainPath) || !File.Exists(TerrainPath))) { Debug.LogError("Terrain file null or not supported.. Try againe"); yield break; } InitializingRuntimePrefs(); StartCoroutine(RuntimeGenerator.StartGenerating(Prefs)); } private void InitializingRuntimePrefs() { RuntimeGenerator.enabled = true; Prefs.TerrainFilePath = TerrainFilePath; Prefs.RemovePrvTerrain = OptionEnabDisab.Enable; Prefs.TerrainElevation = TerrainElevation.RealWorldElevation; Prefs.terrainDimensionMode = TerrainDimensionsMode.AutoDetection; Prefs.terrainScale = new Vector3(1f, 1f, 1f); Prefs.projectionMode = ProjectionMode.Geographic; Prefs.heightmapResolution = 257; Prefs.textureloadingMode = TexturesLoadingMode.AutoDetection; Prefs.textureMode = TextureMode.MultiLayers; } private void SetUILayers() { List fullTextureFolders = GISTerrainLoaderTextureGenerator.GetFullTextureFolders(TerrainFilePath); List list = new List(); if (fullTextureFolders.Count > 0) { for (int i = 0; i < fullTextureFolders.Count; i++) { list.Add(new Dropdown.OptionData("Layer_" + i)); } UILayers.ClearOptions(); UILayers.AddOptions(list); } } private void OnUILayerValueChanged(int value) { UIOpacitySlider.value = 0f; Prefs.TextureFolderIndex = value; } private void UIOpacitySliderValueChanged(float value) { Opacity = value; GISTerrainTile[,] terrains = RuntimeGenerator.GeneratedContainer.terrains; int upperBound = terrains.GetUpperBound(0); int upperBound2 = terrains.GetUpperBound(1); for (int i = terrains.GetLowerBound(0); i <= upperBound; i++) { for (int j = terrains.GetLowerBound(1); j <= upperBound2; j++) { Terrain terrain = terrains[i, j].terrain; GetTerrainCoordinates(terrain); } } } private void OnDisable() { UILayers.onValueChanged.RemoveListener(OnUILayerValueChanged); UIOpacitySlider.onValueChanged.RemoveListener(UIOpacitySliderValueChanged); } private void Update() { if (!Input.GetKeyDown(KeyCode.Space)) { return; } GISTerrainTile[,] terrains = RuntimeGenerator.GeneratedContainer.terrains; int upperBound = terrains.GetUpperBound(0); int upperBound2 = terrains.GetUpperBound(1); for (int i = terrains.GetLowerBound(0); i <= upperBound; i++) { for (int j = terrains.GetLowerBound(1); j <= upperBound2; j++) { Terrain terrain = terrains[i, j].terrain; GetTerrainCoordinates(terrain); } } } private void GetTerrainCoordinates(Terrain targetTerrain) { splat = targetTerrain.terrainData.GetAlphamaps(0, 0, targetTerrain.terrainData.alphamapWidth, targetTerrain.terrainData.alphamapHeight); for (int i = 0; i < targetTerrain.terrainData.alphamapWidth; i++) { for (int j = 0; j < targetTerrain.terrainData.alphamapHeight; j++) { float[] array = new float[targetTerrain.terrainData.alphamapLayers]; for (int k = 0; k < splat.GetLength(2); k++) { array[k] = splat[i, j, k]; } array[Prefs.TextureFolderIndex] += Opacity * 2f; float num = array.Sum(); for (int l = 0; l < array.Length; l++) { array[l] /= num; splat[i, j, l] = array[l]; } } } targetTerrain.terrainData.SetAlphamaps(0, 0, splat); targetTerrain.Flush(); } }