Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/BlendMultiLayers.cs
2026-03-04 09:37:33 +08:00

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();
}
}