using System; using System.Collections; using System.Collections.Generic; using LE_LevelEditor.Commands; using LE_LevelEditor.Events; using LE_LevelEditor.UI; using UndoRedo; using UnityEngine; namespace LE_LevelEditor.Logic { public class LE_LogicTerrain : LE_LogicBase { private LE_ConfigTerrain m_confT; public LE_GUI3dTerrain m_GUI3dTerrain; private TerrainData m_terrainDataToCreate = new TerrainData(); private bool m_doCreateTerrain; private bool m_doRebuildTerrainTab; private int m_selectedTextureIndex; private int m_selectedBrushIndex; private bool m_isHeightRaise = true; public LE_LogicTerrain(LE_ConfigTerrain p_confTerrain, LE_GUI3dTerrain p_GUI3dTerrain) { m_confT = p_confTerrain; m_GUI3dTerrain = p_GUI3dTerrain; m_GUI3dTerrain.TERRAIN_LAYER = p_confTerrain.TerrainLayer; if (p_confTerrain.BrushProjector != null) { m_GUI3dTerrain.BrushProjector = p_confTerrain.BrushProjector; } else { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain.BrushProjector was not initialized! You need to set it in the inspector."); } if (p_confTerrain.Brushes.Length > 0) { m_GUI3dTerrain.BrushAlphaTexture = p_confTerrain.Brushes[0]; } else { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain.Brushes was not initialized! You need to set it in the inspector."); } CheckParameters(); InitTerrainValues(); LE_EventInterface.OnLoadedLevelInEditor = (EventHandler)Delegate.Combine(LE_EventInterface.OnLoadedLevelInEditor, new EventHandler(OnLoadedLevelInEditor)); LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events; events.OnTerrainWidthChanged = (EventHandler)Delegate.Combine(events.OnTerrainWidthChanged, new EventHandler(OnTerrainWidthChanged)); LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events; events2.OnTerrainLengthChanged = (EventHandler)Delegate.Combine(events2.OnTerrainLengthChanged, new EventHandler(OnTerrainLengthChanged)); LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events; events3.OnTerrainHeightChanged = (EventHandler)Delegate.Combine(events3.OnTerrainHeightChanged, new EventHandler(OnTerrainHeightChanged)); LE_GUIInterface.EventHandlers events4 = LE_GUIInterface.Instance.events; events4.OnTerrainBaseTextureChanged = (EventHandler)Delegate.Combine(events4.OnTerrainBaseTextureChanged, new EventHandler(OnTerrainBaseTextureChanged)); LE_GUIInterface.EventHandlers events5 = LE_GUIInterface.Instance.events; events5.OnTerrainBrushChanged = (EventHandler)Delegate.Combine(events5.OnTerrainBrushChanged, new EventHandler(OnTerrainBrushChanged)); LE_GUIInterface.EventHandlers events6 = LE_GUIInterface.Instance.events; events6.OnTerrainPaintTextureChanged = (EventHandler)Delegate.Combine(events6.OnTerrainPaintTextureChanged, new EventHandler(OnTerrainPaintTextureChanged)); LE_GUIInterface.EventHandlers events7 = LE_GUIInterface.Instance.events; events7.OnTerrainPaintTextureAdded = (EventHandler)Delegate.Combine(events7.OnTerrainPaintTextureAdded, new EventHandler(OnTerrainPaintTextureAdded)); LE_GUIInterface.EventHandlers events8 = LE_GUIInterface.Instance.events; events8.OnTerrainEditBrushSizeChanged = (EventHandler)Delegate.Combine(events8.OnTerrainEditBrushSizeChanged, new EventHandler(OnTerrainEditBrushSizeChanged)); LE_GUIInterface.EventHandlers events9 = LE_GUIInterface.Instance.events; events9.OnTerrainEditBrushAmountChanged = (EventHandler)Delegate.Combine(events9.OnTerrainEditBrushAmountChanged, new EventHandler(OnTerrainEditBrushAmountChanged)); LE_GUIInterface.EventHandlers events10 = LE_GUIInterface.Instance.events; events10.OnTerrainEditBrushTargetValueChanged = (EventHandler)Delegate.Combine(events10.OnTerrainEditBrushTargetValueChanged, new EventHandler(OnTerrainEditBrushTargetValueChanged)); LE_GUIInterface.EventHandlers events11 = LE_GUIInterface.Instance.events; events11.OnTerrainEditBrushTextureTargetValueChanged = (EventHandler)Delegate.Combine(events11.OnTerrainEditBrushTextureTargetValueChanged, new EventHandler(OnTerrainEditBrushTextureTargetValueChanged)); LE_GUIInterface.EventHandlers events12 = LE_GUIInterface.Instance.events; events12.OnTerrainEditDirectionChanged = (EventHandler)Delegate.Combine(events12.OnTerrainEditDirectionChanged, new EventHandler(OnTerrainEditDirectionChanged)); LE_GUIInterface.EventHandlers events13 = LE_GUIInterface.Instance.events; events13.OnTerrainChangeHeightModeChanged = (EventHandler)Delegate.Combine(events13.OnTerrainChangeHeightModeChanged, new EventHandler(OnTerrainChangeHeightModeChanged)); LE_GUIInterface.EventHandlers events14 = LE_GUIInterface.Instance.events; events14.OnTerrainIsDirectedSmoothChanged = (EventHandler)Delegate.Combine(events14.OnTerrainIsDirectedSmoothChanged, new EventHandler(OnTerrainIsDirectedSmoothChanged)); LE_GUIInterface.EventHandlers events15 = LE_GUIInterface.Instance.events; events15.OnTerrainCreateBtn = (System.EventHandler)Delegate.Combine(events15.OnTerrainCreateBtn, new System.EventHandler(OnTerrainCreateBtn)); LE_GUIInterface.EventHandlers events16 = LE_GUIInterface.Instance.events; events16.OnTerrainEditModeBtn = (EventHandler)Delegate.Combine(events16.OnTerrainEditModeBtn, new EventHandler(OnTerrainEditModeBtn)); LE_GUIInterface.EventHandlers events17 = LE_GUIInterface.Instance.events; events17.OnTerrainReadPaintHeightBtn = (System.EventHandler)Delegate.Combine(events17.OnTerrainReadPaintHeightBtn, new System.EventHandler(OnTerrainReadPaintHeightBtn)); } public override void Destroy() { LE_EventInterface.OnLoadedLevelInEditor = (EventHandler)Delegate.Remove(LE_EventInterface.OnLoadedLevelInEditor, new EventHandler(OnLoadedLevelInEditor)); if (LE_GUIInterface.Instance != null) { LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events; events.OnTerrainWidthChanged = (EventHandler)Delegate.Remove(events.OnTerrainWidthChanged, new EventHandler(OnTerrainWidthChanged)); LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events; events2.OnTerrainLengthChanged = (EventHandler)Delegate.Remove(events2.OnTerrainLengthChanged, new EventHandler(OnTerrainLengthChanged)); LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events; events3.OnTerrainHeightChanged = (EventHandler)Delegate.Remove(events3.OnTerrainHeightChanged, new EventHandler(OnTerrainHeightChanged)); LE_GUIInterface.EventHandlers events4 = LE_GUIInterface.Instance.events; events4.OnTerrainBaseTextureChanged = (EventHandler)Delegate.Remove(events4.OnTerrainBaseTextureChanged, new EventHandler(OnTerrainBaseTextureChanged)); LE_GUIInterface.EventHandlers events5 = LE_GUIInterface.Instance.events; events5.OnTerrainBrushChanged = (EventHandler)Delegate.Remove(events5.OnTerrainBrushChanged, new EventHandler(OnTerrainBrushChanged)); LE_GUIInterface.EventHandlers events6 = LE_GUIInterface.Instance.events; events6.OnTerrainPaintTextureChanged = (EventHandler)Delegate.Remove(events6.OnTerrainPaintTextureChanged, new EventHandler(OnTerrainPaintTextureChanged)); LE_GUIInterface.EventHandlers events7 = LE_GUIInterface.Instance.events; events7.OnTerrainPaintTextureAdded = (EventHandler)Delegate.Remove(events7.OnTerrainPaintTextureAdded, new EventHandler(OnTerrainPaintTextureAdded)); LE_GUIInterface.EventHandlers events8 = LE_GUIInterface.Instance.events; events8.OnTerrainEditBrushSizeChanged = (EventHandler)Delegate.Remove(events8.OnTerrainEditBrushSizeChanged, new EventHandler(OnTerrainEditBrushSizeChanged)); LE_GUIInterface.EventHandlers events9 = LE_GUIInterface.Instance.events; events9.OnTerrainEditBrushAmountChanged = (EventHandler)Delegate.Remove(events9.OnTerrainEditBrushAmountChanged, new EventHandler(OnTerrainEditBrushAmountChanged)); LE_GUIInterface.EventHandlers events10 = LE_GUIInterface.Instance.events; events10.OnTerrainEditBrushTargetValueChanged = (EventHandler)Delegate.Remove(events10.OnTerrainEditBrushTargetValueChanged, new EventHandler(OnTerrainEditBrushTargetValueChanged)); LE_GUIInterface.EventHandlers events11 = LE_GUIInterface.Instance.events; events11.OnTerrainEditBrushTextureTargetValueChanged = (EventHandler)Delegate.Remove(events11.OnTerrainEditBrushTextureTargetValueChanged, new EventHandler(OnTerrainEditBrushTextureTargetValueChanged)); LE_GUIInterface.EventHandlers events12 = LE_GUIInterface.Instance.events; events12.OnTerrainEditDirectionChanged = (EventHandler)Delegate.Remove(events12.OnTerrainEditDirectionChanged, new EventHandler(OnTerrainEditDirectionChanged)); LE_GUIInterface.EventHandlers events13 = LE_GUIInterface.Instance.events; events13.OnTerrainChangeHeightModeChanged = (EventHandler)Delegate.Remove(events13.OnTerrainChangeHeightModeChanged, new EventHandler(OnTerrainChangeHeightModeChanged)); LE_GUIInterface.EventHandlers events14 = LE_GUIInterface.Instance.events; events14.OnTerrainIsDirectedSmoothChanged = (EventHandler)Delegate.Remove(events14.OnTerrainIsDirectedSmoothChanged, new EventHandler(OnTerrainIsDirectedSmoothChanged)); LE_GUIInterface.EventHandlers events15 = LE_GUIInterface.Instance.events; events15.OnTerrainCreateBtn = (System.EventHandler)Delegate.Remove(events15.OnTerrainCreateBtn, new System.EventHandler(OnTerrainCreateBtn)); LE_GUIInterface.EventHandlers events16 = LE_GUIInterface.Instance.events; events16.OnTerrainEditModeBtn = (EventHandler)Delegate.Remove(events16.OnTerrainEditModeBtn, new EventHandler(OnTerrainEditModeBtn)); LE_GUIInterface.EventHandlers events17 = LE_GUIInterface.Instance.events; events17.OnTerrainReadPaintHeightBtn = (System.EventHandler)Delegate.Remove(events17.OnTerrainReadPaintHeightBtn, new System.EventHandler(OnTerrainReadPaintHeightBtn)); } } public override void Update() { if (m_doCreateTerrain && m_terrainDataToCreate != null) { m_doCreateTerrain = false; UR_CommandMgr.Instance.Execute(new LE_CmdCreateTerrain(this, m_selectedTextureIndex, m_terrainDataToCreate)); m_terrainDataToCreate = null; } if (m_doRebuildTerrainTab) { m_doRebuildTerrainTab = false; InitTerrainValues(); } } public void CreateOrRecycleTerrainWithUIUpdate(TerrainData p_terrainData, int p_terrainBaseTextureIndex) { CreateOrRecycleTerrain(p_terrainData, m_GUI3dTerrain.TERRAIN_LAYER, m_confT, p_terrainBaseTextureIndex); m_terrainDataToCreate = null; m_doRebuildTerrainTab = true; SetTerrainUIMode(LE_GUIInterface.Delegates.ETerrainUIMode.EDIT); } public void DestroyOrResetTerrainWithUIUpdate() { DestroyOrResetTerrain(); m_terrainDataToCreate = new TerrainData(); m_doRebuildTerrainTab = true; SetTerrainUIMode(LE_GUIInterface.Delegates.ETerrainUIMode.CREATE); } public void AddTerrainTexture(Texture2D p_texture) { if (m_confT.TerrainTextureConfig != null) { if (!(m_GUI3dTerrain != null) || m_GUI3dTerrain.TerrainManager == null || !(m_GUI3dTerrain.TerrainManager.TerrainData != null)) { return; } SplatPrototype[] splatPrototypes = m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes; SplatPrototype[] array = new SplatPrototype[splatPrototypes.Length + 1]; Array.Copy(splatPrototypes, array, splatPrototypes.Length); int textureIndex = GetTextureIndex(p_texture); if (textureIndex >= 0) { array[array.Length - 1] = new SplatPrototype(); array[array.Length - 1].texture = m_confT.TerrainTextureConfig.TERRAIN_TEXTURES[textureIndex]; array[array.Length - 1].normalMap = m_confT.TerrainTextureConfig.TERRAIN_NORMALS[textureIndex]; array[array.Length - 1].tileSize = m_confT.TerrainTextureConfig.TERRAIN_TEXTURE_SIZES[textureIndex]; array[array.Length - 1].tileOffset = m_confT.TerrainTextureConfig.TERRAIN_TEXTURE_OFFSETS[textureIndex]; m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes = array; m_doRebuildTerrainTab = true; if (LE_EventInterface.OnChangeLevelData != null) { LE_EventInterface.OnChangeLevelData(this, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.TERRAIN_TEXTURES)); } } else { Debug.LogError("LE_LogicTerrain: AddTerrainTexture: could not find given texture in TerrainTextureConfig!"); } } else { Debug.LogError("LE_LogicTerrain: AddTerrainTexture: LE_ConfigTerrain has no TerrainTextureConfig set!"); } } public void RemoveTerrainTexture(Texture2D p_texture) { if (m_confT.TerrainTextureConfig != null) { if (!(m_GUI3dTerrain != null) || m_GUI3dTerrain.TerrainManager == null || !(m_GUI3dTerrain.TerrainManager.TerrainData != null)) { return; } SplatPrototype[] splatPrototypes = m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes; if (splatPrototypes.Length > 0) { bool flag = false; SplatPrototype[] array = new SplatPrototype[splatPrototypes.Length - 1]; for (int i = 0; i < splatPrototypes.Length; i++) { if (!flag && splatPrototypes[i] != null && splatPrototypes[i].texture == p_texture) { flag = true; } else { array[(!flag) ? i : (i - 1)] = splatPrototypes[i]; } } if (flag) { m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes = array; m_doRebuildTerrainTab = true; if (LE_EventInterface.OnChangeLevelData != null) { LE_EventInterface.OnChangeLevelData(this, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.TERRAIN_TEXTURES)); } } else { Debug.LogError("LE_LogicTerrain: RemoveTerrainTexture: given texture is not a splat texture of the terrain!"); } } else { Debug.LogError("LE_LogicTerrain: RemoveTerrainTexture: terrain has no splat textures set!"); } } else { Debug.LogError("LE_LogicTerrain: RemoveTerrainTexture: LE_ConfigTerrain has no TerrainTextureConfig set!"); } } public static GameObject CreateOrRecycleTerrain(TerrainData p_terrainData, int p_terrainLayer) { LE_GUI3dTerrain lE_GUI3dTerrain = UnityEngine.Object.FindObjectOfType(); Terrain terrain = ((!(lE_GUI3dTerrain != null)) ? null : lE_GUI3dTerrain.TerrainInstance); GameObject gameObject; if (terrain != null) { gameObject = terrain.gameObject; lE_GUI3dTerrain.RecycleTerrain(p_terrainData, true); } else { gameObject = Terrain.CreateTerrainGameObject(p_terrainData); if (lE_GUI3dTerrain != null) { lE_GUI3dTerrain.SetTerrain(gameObject.GetComponent()); } } gameObject.layer = p_terrainLayer; gameObject.transform.position = new Vector3((0f - p_terrainData.size.x) * 0.5f, -2f, (0f - p_terrainData.size.z) * 0.5f); return gameObject; } public static void DestroyOrResetTerrain() { LE_GUI3dTerrain lE_GUI3dTerrain = UnityEngine.Object.FindObjectOfType(); if (lE_GUI3dTerrain != null) { lE_GUI3dTerrain.ResetToDefaultOrDestroyTerrain(); } } private static void CreateOrRecycleTerrain(TerrainData p_terrainData, int p_terrainLayer, LE_ConfigTerrain p_confT, int p_terrainBaseTextureIndex) { if (p_terrainData == null) { Debug.LogError("LE_LogicTerrain: CreateOrRecycleTerrain: passed terrain data was null!"); return; } Vector3 size = p_terrainData.size; float num = Mathf.Max(size.x, size.z); int heightmapResolution = p_confT.HeightmapResolutions[0]; for (int i = 1; i < p_confT.HeightmapResolutionSizes.Length && num >= p_confT.HeightmapResolutionSizes[i - 1]; i++) { heightmapResolution = p_confT.HeightmapResolutions[i]; } p_terrainData.heightmapResolution = heightmapResolution; int alphamapResolution = p_confT.AlphamapResolutions[0]; for (int j = 1; j < p_confT.AlphamapResolutionSizes.Length && num >= p_confT.AlphamapResolutionSizes[j - 1]; j++) { alphamapResolution = p_confT.AlphamapResolutions[j]; } p_terrainData.alphamapResolution = alphamapResolution; p_terrainData.size = size; SplatPrototype[] array = new SplatPrototype[1] { new SplatPrototype() }; array[0].texture = p_confT.TerrainTextureConfig.TERRAIN_TEXTURES[p_terrainBaseTextureIndex]; array[0].normalMap = p_confT.TerrainTextureConfig.TERRAIN_NORMALS[p_terrainBaseTextureIndex]; array[0].tileSize = p_confT.TerrainTextureConfig.TERRAIN_TEXTURE_SIZES[p_terrainBaseTextureIndex]; array[0].tileOffset = p_confT.TerrainTextureConfig.TERRAIN_TEXTURE_OFFSETS[p_terrainBaseTextureIndex]; p_terrainData.splatPrototypes = array; GameObject gameObject = CreateOrRecycleTerrain(p_terrainData, p_terrainLayer); if (LE_EventInterface.OnTerrainCreated != null) { LE_EventInterface.OnTerrainCreated(gameObject, new LE_TerrainCreatedEvent(gameObject)); } } private static void SetTerrainUIMode(LE_GUIInterface.Delegates.ETerrainUIMode p_uiMode) { if (LE_GUIInterface.Instance.delegates.SetTerrainUIMode != null) { LE_GUIInterface.Instance.delegates.SetTerrainUIMode(p_uiMode); } else { Debug.LogWarning("LE_LogicTerrain: SetTerrainUIMode: you have not set the LE_GUIInterface.delegates.SetTerrainUIMode delegate. You need to set it for example if you want to disable the create UI after terrain creation!"); } } private void OnLoadedLevelInEditor(object p_obj, EventArgs p_args) { LE_GUIInterface.Delegates.ETerrainUIMode terrainUIMode = GetTerrainUIMode(); if (terrainUIMode == LE_GUIInterface.Delegates.ETerrainUIMode.CREATE) { m_terrainDataToCreate = new TerrainData(); } else { m_terrainDataToCreate = null; } if (LE_GUIInterface.Instance.delegates.SetTerrainUIMode != null) { LE_GUIInterface.Instance.delegates.SetTerrainUIMode(terrainUIMode); } else { Debug.LogWarning("LE_LogicTerrain: you have not set the LE_GUIInterface.delegates.SetTerrainUIMode delegate. Set it to show the create UI if the loaded level has no terrain and the edit UI if the loaded level has a terrain!"); } m_doRebuildTerrainTab = true; } private void OnTerrainWidthChanged(object p_obj, LE_GUIInterface.EventHandlers.StringEventArgs p_args) { int result; if (int.TryParse(p_args.Value, out result)) { result = Mathf.Max(32, result); if (m_terrainDataToCreate != null) { m_terrainDataToCreate.size = new Vector3(result, m_terrainDataToCreate.size.y, m_terrainDataToCreate.size.z); } else { m_GUI3dTerrain.TerrainManager.TerrainData.size = new Vector3(result, m_GUI3dTerrain.TerrainManager.TerrainData.size.y, m_GUI3dTerrain.TerrainManager.TerrainData.size.z); } } } private void OnTerrainLengthChanged(object p_obj, LE_GUIInterface.EventHandlers.StringEventArgs p_args) { int result; if (int.TryParse(p_args.Value, out result)) { result = Mathf.Max(32, result); if (m_terrainDataToCreate != null) { m_terrainDataToCreate.size = new Vector3(m_terrainDataToCreate.size.x, m_terrainDataToCreate.size.y, result); } else { m_GUI3dTerrain.TerrainManager.TerrainData.size = new Vector3(m_GUI3dTerrain.TerrainManager.TerrainData.size.x, m_GUI3dTerrain.TerrainManager.TerrainData.size.y, result); } } } private void OnTerrainHeightChanged(object p_obj, LE_GUIInterface.EventHandlers.StringEventArgs p_args) { int result; if (int.TryParse(p_args.Value, out result)) { result = Mathf.Max(32, result); if (m_terrainDataToCreate != null) { m_terrainDataToCreate.size = new Vector3(m_terrainDataToCreate.size.x, result, m_terrainDataToCreate.size.z); } else { m_GUI3dTerrain.TerrainManager.TerrainData.size = new Vector3(m_GUI3dTerrain.TerrainManager.TerrainData.size.x, result, m_GUI3dTerrain.TerrainManager.TerrainData.size.z); } } } private void OnTerrainBaseTextureChanged(object p_obj, LE_GUIInterface.EventHandlers.IntEventArgs p_args) { m_selectedTextureIndex = p_args.Value; if (m_terrainDataToCreate == null) { Debug.LogWarning("LE_LogicTerrain: OnTerrainBaseTextureChanged: terrain base texture cannot be changed after the terrain was created! If a terrain already exists then you have changed the terrain paint texture with this call."); } } private void OnTerrainBrushChanged(object p_obj, LE_GUIInterface.EventHandlers.IntEventArgs p_args) { m_selectedBrushIndex = p_args.Value; m_GUI3dTerrain.BrushAlphaTexture = m_confT.Brushes[m_selectedBrushIndex]; m_GUI3dTerrain.SetCursorPosition(new Vector3(Screen.width / 2, Screen.height / 2, 0f)); } private void OnTerrainPaintTextureChanged(object p_obj, LE_GUIInterface.EventHandlers.IntEventArgs p_args) { m_selectedTextureIndex = p_args.Value; m_GUI3dTerrain.SelectedSplatPrototype = m_selectedTextureIndex; } private void OnTerrainPaintTextureAdded(object p_obj, LE_GUIInterface.EventHandlers.TextureEventArgs p_args) { UR_CommandMgr.Instance.Execute(new LE_CmdAddTerrainTexture(this, p_args.Value)); } private void OnTerrainEditBrushSizeChanged(object p_obj, LE_GUIInterface.EventHandlers.FloatEventArgs p_args) { float value = p_args.Value; value *= value; value = Mathf.Max(0.002f, value); m_GUI3dTerrain.Size = value; m_GUI3dTerrain.SetCursorPosition(new Vector3(Screen.width / 2, Screen.height / 2, 0f)); } private void OnTerrainEditBrushAmountChanged(object p_obj, LE_GUIInterface.EventHandlers.FloatEventArgs p_args) { float value = p_args.Value; value = Mathf.Max(0.002f, value); m_GUI3dTerrain.Amount = ((!m_isHeightRaise) ? (0f - value) : value); } private void OnTerrainEditBrushTargetValueChanged(object p_obj, LE_GUIInterface.EventHandlers.FloatEventArgs p_args) { m_GUI3dTerrain.TargetRelativeValue = p_args.Value; } private void OnTerrainEditBrushTextureTargetValueChanged(object p_obj, LE_GUIInterface.EventHandlers.FloatEventArgs p_args) { m_GUI3dTerrain.TargetTextureStrengthValue = p_args.Value; } private void OnTerrainEditDirectionChanged(object p_obj, LE_GUIInterface.EventHandlers.FloatEventArgs p_args) { m_GUI3dTerrain.DirectedSmoothAngle = Mathf.Round(p_args.Value * 360f / 22.5f) * 22.5f; m_GUI3dTerrain.SetCursorPosition(new Vector3(Screen.width / 2, Screen.height / 2, 0f)); } private void OnTerrainChangeHeightModeChanged(object p_obj, LE_GUIInterface.EventHandlers.TerrainChangeHeightModeEventArgs p_args) { if (p_args.ChangeHeightMode == LE_GUIInterface.EventHandlers.ETerrainChangeHeightMode.RAISE) { m_isHeightRaise = true; m_GUI3dTerrain.Amount = Mathf.Abs(m_GUI3dTerrain.Amount); } else { m_isHeightRaise = false; m_GUI3dTerrain.Amount = 0f - Mathf.Abs(m_GUI3dTerrain.Amount); } } private void OnTerrainIsDirectedSmoothChanged(object p_obj, LE_GUIInterface.EventHandlers.BoolEventArgs p_args) { m_GUI3dTerrain.IsDirectedSmooth = p_args.Value; m_GUI3dTerrain.SetCursorPosition(new Vector3(Screen.width / 2, Screen.height / 2, 0f)); } private void OnTerrainCreateBtn(object p_obj, EventArgs p_args) { m_doCreateTerrain = true; m_doRebuildTerrainTab = true; } private void OnTerrainEditModeBtn(object p_obj, LE_GUIInterface.EventHandlers.TerrainEditModeEventArgs p_args) { m_GUI3dTerrain.EditMode = p_args.EditMode; } private void OnTerrainReadPaintHeightBtn(object sender, EventArgs e) { if (LE_GUIInterface.Instance.delegates.SetTerrainIsReadingPaintHeight != null) { LE_GUIInterface.Instance.delegates.SetTerrainIsReadingPaintHeight(true); } else { Debug.LogWarning("LE_LogicTerrain: OnTerrainReadPaintHeightBtn: you have not set the LE_GUIInterface.delegates.SetTerrainIsReadingPaintHeight delegate. Set it if you want to give visual feedback to the user showing if the terrain paint height is currently being read!"); } m_GUI3dTerrain.IsReadingTerrainPaintHeight = true; m_GUI3dTerrain.StartCoroutine(ReadPaintHeightRoutine()); } private void CheckParameters() { if (string.IsNullOrEmpty(LayerMask.LayerToName(m_confT.TerrainLayer))) { Debug.LogWarning("LE_GUILogicTerrain: Inspector property 'LE_ConfigTerrain.TerrainLayer' is set to '" + m_confT.TerrainLayer + "', but this layer has no name in 'Tags & Layers' set. Please set the name of this layer to 'Terrain' or change the value of the 'LE_ConfigTerrain.TerrainLayer' property! To open the 'Tags & Layers' manager select any game object, in the inspector click on the layer drop down at top right then click on 'Add Layer...'."); } else if (LayerMask.LayerToName(m_confT.TerrainLayer) != "Terrain") { Debug.LogWarning("LE_GUILogicTerrain: Inspector property 'LE_ConfigTerrain.TerrainLayer' is set to '" + m_confT.TerrainLayer + "', but the name of this layer is '" + LayerMask.LayerToName(m_confT.TerrainLayer) + "'. Is this intended? If not please set the name of this layer to 'Terrain' or change the value of the 'LE_ConfigTerrain.TerrainLayer' property! To open the 'Tags & Layers' manager select any game object, in the inspector click on the layer drop down at top right then click on 'Add Layer...'."); } if (m_confT.HeightmapResolutions == null || m_confT.HeightmapResolutions.Length == 0) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainHeightmapResolutions is null or empty! Add supported heightmap resolutions e.g. {65, 129, 257, 513} etc."); } else if (m_confT.HeightmapResolutionSizes == null || m_confT.HeightmapResolutionSizes.Length == 0) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainHeightmapResolutionSizes is null or empty! Add the terrain size thresholds that define which of the supported heightmap resolutions is used e.g. TerrainHeightmapResolutions = {65, 129, 257, 513} and TerrainHeightmapResolutionSizes = {125, 250, 500, 9999} etc."); } else if (m_confT.HeightmapResolutions.Length != m_confT.HeightmapResolutionSizes.Length) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainHeightmapResolutions and TerrainHeightmapResolutionSizes must have the same length!"); } if (m_confT.AlphamapResolutions == null || m_confT.AlphamapResolutions.Length == 0) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainAlphamapResolutions is null or empty! Add supported alphamap resolutions e.g. {64, 128, 256, 512} etc."); } else if (m_confT.AlphamapResolutionSizes == null || m_confT.AlphamapResolutionSizes.Length == 0) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainAlphamapResolutionSizes is null or empty! Add the terrain size thresholds that define which of the supported alphamap resolutions is used e.g. TerrainAlphamapResolutions = {64, 128, 256, 512} and TerrainAlphamapResolutionSizes = {125, 250, 500, 9999} etc."); } else if (m_confT.AlphamapResolutions.Length != m_confT.AlphamapResolutionSizes.Length) { Debug.LogError("LE_GUILogicTerrain: LE_ConfigTerrain: TerrainAlphamapResolutions and TerrainAlphamapResolutionSizes must have the same length!"); } } private void InitTerrainValues() { int num; int num2; int num3; if (m_terrainDataToCreate != null) { num = m_confT.InitialWidth; num2 = m_confT.InitialLength; num3 = m_confT.InitialHeight; m_terrainDataToCreate.size = new Vector3(num, num3, num2); } else { num = (int)m_GUI3dTerrain.TerrainManager.TerrainData.size.x; num2 = (int)m_GUI3dTerrain.TerrainManager.TerrainData.size.z; num3 = (int)m_GUI3dTerrain.TerrainManager.TerrainData.size.y; } string format = "LE_GUILogicTerrain: InitTerrainValues: you have not provided {0} delegate. If you show the terrain size values then the real terrain size might be different than shown in your UI!"; if (LE_GUIInterface.Instance.delegates.SetTerrainWidth != null) { LE_GUIInterface.Instance.delegates.SetTerrainWidth(num); } else { Debug.LogWarning(string.Format(format, "LE_GUIInterface.delegates.SetTerrainWidth")); } if (LE_GUIInterface.Instance.delegates.SetTerrainLength != null) { LE_GUIInterface.Instance.delegates.SetTerrainLength(num2); } else { Debug.LogWarning(string.Format(format, "LE_GUIInterface.delegates.SetTerrainLength")); } if (LE_GUIInterface.Instance.delegates.SetTerrainHeight != null) { LE_GUIInterface.Instance.delegates.SetTerrainHeight(num3); } else { Debug.LogWarning(string.Format(format, "LE_GUIInterface.delegates.SetTerrainHeight")); } m_selectedTextureIndex = 0; if (m_confT.IsBaseTextureSelection) { if (LE_GUIInterface.Instance.delegates.SetTerrainBaseTextures != null) { LE_GUIInterface.Instance.delegates.SetTerrainBaseTextures(m_confT.TerrainTextureConfig.TERRAIN_TEXTURES, m_selectedTextureIndex); } else { Debug.LogError("LE_GUILogicTerrain: InitTerrainValues: you have not provided the LE_GUIInterface.delegates.SetTerrainBaseTextures delegate. If you want to use LE_ConfigTerrain.IsBaseTextureSelection==true, then you must set this delegate to show and update the base texture selection in your UI!"); } } m_selectedBrushIndex = 0; if (m_confT.Brushes.Length > 0) { m_GUI3dTerrain.BrushAlphaTexture = m_confT.Brushes[0]; } if (LE_GUIInterface.Instance.delegates.SetTerrainBrushes != null) { LE_GUIInterface.Instance.delegates.SetTerrainBrushes(m_confT.Brushes, m_selectedBrushIndex); } else { Debug.LogError("LE_GUILogicTerrain: InitTerrainValues: you have not provided the LE_GUIInterface.delegates.SetTerrainBrushes delegate. You must set this delegate to show and update the brush texture selection in your UI!"); } if (LE_GUIInterface.Instance.delegates.SetTerrainEditBrushSize != null) { LE_GUIInterface.Instance.delegates.SetTerrainEditBrushSize(Mathf.Sqrt(m_GUI3dTerrain.Size)); } else { Debug.LogWarning("LE_GUILogicTerrain: InitTerrainValues: you have not provided the LE_GUIInterface.delegates.SetTerrainEditBrushSize delegate. If you have a brush size slider, then its value might be different from the value used by the level editor."); } if (LE_GUIInterface.Instance.delegates.SetTerrainEditBrushAmount != null) { LE_GUIInterface.Instance.delegates.SetTerrainEditBrushAmount(Mathf.Abs(m_GUI3dTerrain.Amount)); } else { Debug.LogWarning("LE_GUILogicTerrain: InitTerrainValues: you have not provided the LE_GUIInterface.delegates.SetTerrainEditBrushAmount delegate. If you have a brush amount slider, then its value might be different from the value used by the level editor."); } if (LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue != null) { LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue(m_GUI3dTerrain.TargetRelativeValue); LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTextureTargetValue(m_GUI3dTerrain.TargetTextureStrengthValue); } else { Debug.LogWarning("LE_GUILogicTerrain: InitTerrainValues: you have not provided the LE_GUIInterface.delegates.SetTerrainEditBrushTargetValue delegate. If you have a brush target value slider, then its value might be different from the value used by the level editor."); } Texture2D[] terrainPaintTextures = GetTerrainPaintTextures(); bool flag = terrainPaintTextures.Length >= m_confT.TerrainTextureConfig.TERRAIN_TEXTURES.Length || terrainPaintTextures.Length >= m_confT.MaxTextureCount; m_selectedTextureIndex = Mathf.Max(0, terrainPaintTextures.Length - 1); m_GUI3dTerrain.SelectedSplatPrototype = m_selectedTextureIndex; if (LE_GUIInterface.Instance.delegates.SetTerrainPaintTextures != null) { LE_GUIInterface.Instance.delegates.SetTerrainPaintTextures(terrainPaintTextures, GetUnusedTerrainTextures(), m_selectedTextureIndex, !flag); } else { Debug.LogWarning("LE_LogicTerrain: InitTerrainValues: you have not set the LE_GUIInterface.delegates.SetTerrainPaintTextures delegate. You need to set it to visualize the available paint textures and allow the user to select one of them!"); } } private LE_GUIInterface.Delegates.ETerrainUIMode GetTerrainUIMode() { if (m_GUI3dTerrain.TerrainManager != null) { return LE_GUIInterface.Delegates.ETerrainUIMode.EDIT; } return LE_GUIInterface.Delegates.ETerrainUIMode.CREATE; } private Texture2D[] GetTerrainPaintTextures() { if (m_GUI3dTerrain.TerrainManager != null && m_GUI3dTerrain.TerrainManager.TerrainData != null) { SplatPrototype[] splatPrototypes = m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes; Texture2D[] array = new Texture2D[splatPrototypes.Length]; for (int i = 0; i < splatPrototypes.Length; i++) { array[i] = splatPrototypes[i].texture; } return array; } return new Texture2D[0]; } private int GetTextureIndex(Texture2D p_texture) { for (int i = 0; i < m_confT.TerrainTextureConfig.TERRAIN_TEXTURES.Length; i++) { if (p_texture == m_confT.TerrainTextureConfig.TERRAIN_TEXTURES[i]) { return i; } } return -1; } private IEnumerator ReadPaintHeightRoutine() { WaitForEndOfFrame wait = new WaitForEndOfFrame(); while (m_GUI3dTerrain.IsReadingTerrainPaintHeight) { if (LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue != null) { LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue(m_GUI3dTerrain.TargetRelativeValue); } yield return wait; } if (LE_GUIInterface.Instance.delegates.SetTerrainIsReadingPaintHeight != null) { LE_GUIInterface.Instance.delegates.SetTerrainIsReadingPaintHeight(false); } else { Debug.LogWarning("LE_LogicTerrain: OnTerrainReadPaintHeightBtn: you have not set the LE_GUIInterface.delegates.SetTerrainIsReadingPaintHeight delegate. Set it if you want to give visual feedback to the user showing if the terrain paint height is currently being read!"); } if (LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue != null) { LE_GUIInterface.Instance.delegates.SetTerrainEditBrushTargetValue(m_GUI3dTerrain.TargetRelativeValue); } else { Debug.LogWarning("LE_GUILogicTerrain: ReadPaintHeightRoutine: you have not provided the LE_GUIInterface.delegates.SetTerrainEditBrushTargetValue delegate. If you have a brush target value slider, then its value is now different from the value used by the level editor, because the terrain paint height was read."); } } private Texture2D[] GetUnusedTerrainTextures() { if (m_confT.TerrainTextureConfig != null) { if (m_GUI3dTerrain != null && m_GUI3dTerrain.TerrainManager != null && m_GUI3dTerrain.TerrainManager.TerrainData != null) { Texture2D[] tERRAIN_TEXTURES = m_confT.TerrainTextureConfig.TERRAIN_TEXTURES; SplatPrototype[] splatPrototypes = m_GUI3dTerrain.TerrainManager.TerrainData.splatPrototypes; List list = new List(); for (int i = 0; i < tERRAIN_TEXTURES.Length; i++) { bool flag = false; for (int j = 0; j < splatPrototypes.Length; j++) { if (splatPrototypes[j].texture == tERRAIN_TEXTURES[i]) { flag = true; break; } } if (!flag) { list.Add(tERRAIN_TEXTURES[i]); } } return list.ToArray(); } return m_confT.TerrainTextureConfig.TERRAIN_TEXTURES; } Debug.LogError("LE_LogicTerrain: GetUnusedTerrainTextures: LE_ConfigTerrain has no TerrainTextureConfig set!"); return new Texture2D[0]; } } }