153 lines
4.4 KiB
C#
153 lines
4.4 KiB
C#
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<RuntimeTerrainGenerator>.Get;
|
|
RuntimePrefs = GISTerrainLoaderMonoSingleton<GISTerrainLoaderRuntimePrefs>.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<string> fullTextureFolders = GISTerrainLoaderTextureGenerator.GetFullTextureFolders(TerrainFilePath);
|
|
List<Dropdown.OptionData> list = new List<Dropdown.OptionData>();
|
|
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();
|
|
}
|
|
}
|