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.Get; Prefs = RuntimePrefs.Prefs; RuntimeGenerator = GISTerrainLoaderMonoSingleton.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(); ElevationText.text = "0"; } if (terrain != null && !string.Equals(hitInfo.collider.transform.name, terrain.name)) { terrain = hitInfo.collider.transform.gameObject.GetComponent(); } 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; } }