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

177 lines
4.6 KiB
C#

using System;
using System.Collections;
using System.IO;
using GISTech.GISTerrainLoader;
using UnityEngine;
using UnityEngine.UI;
public class ChangeRuntimeProjection : MonoBehaviour
{
private string TerrainFilePath;
private RuntimeTerrainGenerator RuntimeGenerator;
private GISTerrainLoaderPrefs Prefs;
private GISTerrainLoaderRuntimePrefs RuntimePrefs;
public Dropdown Projections;
public Dropdown DisplayFormat_DropDown;
public Text LatLonText;
public Text ElevationText;
public int From_EPSG;
public int To_EPSG;
private RaycastHit hitInfo;
public LayerMask terrainLayer;
private Terrain m_terrain;
public Terrain terrain
{
get
{
return m_terrain;
}
set
{
if (m_terrain != value)
{
m_terrain = value;
}
}
}
private void Start()
{
TerrainFilePath = Application.streamingAssetsPath + "/GIS Terrains/Example_SHP/Cuenca.tif";
RuntimePrefs = GISTerrainLoaderMonoSingleton<GISTerrainLoaderRuntimePrefs>.Get;
Prefs = RuntimePrefs.Prefs;
RuntimeGenerator = GISTerrainLoaderMonoSingleton<RuntimeTerrainGenerator>.Get;
RuntimeTerrainGenerator.OnFinish += OnTerrainGenerated;
if ((bool)Projections)
{
Projections.onValueChanged.AddListener(OnProjectionChanged);
}
if ((bool)DisplayFormat_DropDown)
{
DisplayFormat_DropDown.onValueChanged.AddListener(OnDisplayFormatChanged);
}
StartCoroutine(GenerateTerrain(TerrainFilePath));
}
private void Update()
{
RayCastMousePosition();
}
private void RayCastMousePosition()
{
hitInfo = default(RaycastHit);
if (!Camera.main || !Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, float.PositiveInfinity, terrainLayer))
{
return;
}
if (terrain == null)
{
terrain = hitInfo.collider.transform.gameObject.GetComponent<Terrain>();
ElevationText.text = "0";
}
if (terrain != null && !string.Equals(hitInfo.collider.transform.name, terrain.name))
{
terrain = hitInfo.collider.transform.gameObject.GetComponent<Terrain>();
}
DVector3 dVector = GISTerrainLoaderGeoConversion.UnityWorldSpaceToRealWorldCoordinates(hitInfo.point, RuntimeGenerator.GeneratedContainer, GetElevation: true, RealWorldElevation.Elevation);
if ((bool)LatLonText)
{
DVector2 dVector2 = ConvertCoordinatesTo(dVector.ToDVector2(), To_EPSG);
if (To_EPSG == 4326)
{
LatLonText.text = "GEO WGS84 " + GISTerrainLoaderGeoConversion.ToDisplayFormat(dVector2, Prefs.CoordinatesDisplayFormat);
}
if (To_EPSG != 4326)
{
LatLonText.text = Projections.captionText.text + " { " + dVector2.x + " / " + dVector2.y + "}";
}
}
if ((bool)ElevationText)
{
ElevationText.text = Math.Round(dVector.z, 2) + " m ";
}
}
private IEnumerator GenerateTerrain(string TerrainPath)
{
yield return new WaitForSeconds(2f);
if (Application.platform == RuntimePlatform.WebGLPlayer || Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
InitializingRuntimePrefs(TerrainPath);
StartCoroutine(RuntimeGenerator.StartGenerating(Prefs));
}
else if (!string.IsNullOrEmpty(TerrainPath) && File.Exists(TerrainPath))
{
InitializingRuntimePrefs(TerrainPath);
StartCoroutine(RuntimeGenerator.StartGenerating(Prefs));
}
else
{
Debug.LogError("Terrain file null or not supported.. Try againe");
yield return null;
}
}
private void InitializingRuntimePrefs(string TerrainPath)
{
RuntimeGenerator.enabled = true;
Prefs.TerrainFilePath = TerrainPath;
Prefs.RemovePrvTerrain = OptionEnabDisab.Enable;
Prefs.TerrainElevation = TerrainElevation.RealWorldElevation;
Prefs.terrainDimensionMode = TerrainDimensionsMode.AutoDetection;
Prefs.heightmapResolution = 256;
Prefs.textureloadingMode = TexturesLoadingMode.AutoDetection;
Prefs.terrainMaterialMode = TerrainMaterialMode.Standard;
}
private void OnProjectionChanged(int value)
{
To_EPSG = Prefs.ProjectionsData_SO.GetEPSG(Projections.options[value].text);
}
private void OnDisplayFormatChanged(int value)
{
Prefs.CoordinatesDisplayFormat = (DisplayFormat)value;
}
private DVector2 ConvertCoordinatesTo(DVector2 coor, int To_epsg)
{
if (From_EPSG != To_epsg)
{
return GISTerrainLoaderGeoConversion.ConvertCoordinatesFromTo(coor, From_EPSG, To_epsg);
}
return coor;
}
private void OnTerrainGenerated(GISTerrainContainer m_container)
{
Projections.ClearOptions();
Projections.AddOptions(Prefs.ProjectionsData_SO.GetOptions());
From_EPSG = RuntimeGenerator.GeneratedContainer.data.EPSG;
if (From_EPSG == 0)
{
From_EPSG = 4326;
}
To_EPSG = From_EPSG;
}
private void OnDisable()
{
RuntimeTerrainGenerator.OnFinish -= OnTerrainGenerated;
}
}