using System.Collections.Generic; using UnityEngine; namespace Gaia { [ExecuteAlways] public class TerrainDetailOverwrite : MonoBehaviour { #region Public Variables public GaiaConstants.TerrainDetailQuality m_detailQuality { get; set; } public int m_detailDistance { get; set; } public float m_detailDensity { get; set; } public Terrain m_terrain { get; set; } #endregion #region Private Variables private bool m_applyTerrainChanges = false; #endregion #region Startup /// /// Apply on enable /// private void OnEnable() { if (m_terrain == null) { m_terrain = gameObject.GetComponent(); } m_detailDistance = (int)m_terrain.detailObjectDistance; m_detailDensity = m_terrain.detailObjectDensity; GetResolutionPatches(); } #endregion #region Updates /// /// Applies detail distance settings if global then it'll apply to all instances /// /// public void ApplySettings(bool isGlobal) { if (isGlobal) { TerrainDetailOverwrite[] detailOverwrites = FindObjectsOfType(); List terains = new List(); if (detailOverwrites.Length > 0) { foreach (TerrainDetailOverwrite detailOverwrite in detailOverwrites) { detailOverwrite.m_detailDistance = m_detailDistance; detailOverwrite.m_detailDensity = m_detailDensity; terains.Add(detailOverwrite.GetComponent()); } foreach (Terrain terrain in terains) { if (terrain.detailObjectDistance != m_detailDistance) { m_applyTerrainChanges = true; terrain.detailObjectDistance = m_detailDistance; } if (terrain.detailObjectDensity != m_detailDensity) { m_applyTerrainChanges = true; terrain.detailObjectDensity = m_detailDensity; } if (m_applyTerrainChanges) { terrain.Flush(); m_applyTerrainChanges = false; } } } } else { if (m_terrain == null) { m_terrain = gameObject.GetComponent(); } if (m_terrain != null) { if (m_terrain.detailObjectDistance != m_detailDistance) { m_applyTerrainChanges = true; m_terrain.detailObjectDistance = m_detailDistance; } if (m_terrain.detailObjectDensity != m_detailDensity) { m_applyTerrainChanges = true; m_terrain.detailObjectDensity = m_detailDensity; } if (m_applyTerrainChanges) { m_terrain.Flush(); m_applyTerrainChanges = false; } } } } /// /// Gets the detail patch resolution /// public void GetResolutionPatches() { if (m_terrain == null) { return; } if (m_terrain.terrainData == null) { return; } if (m_terrain.terrainData.detailResolutionPerPatch == 2) { m_detailQuality = GaiaConstants.TerrainDetailQuality.Ultra2; } else if (m_terrain.terrainData.detailResolutionPerPatch == 4) { m_detailQuality = GaiaConstants.TerrainDetailQuality.VeryHigh4; } else if (m_terrain.terrainData.detailResolutionPerPatch == 8) { m_detailQuality = GaiaConstants.TerrainDetailQuality.High8; } else if (m_terrain.terrainData.detailResolutionPerPatch == 16) { m_detailQuality = GaiaConstants.TerrainDetailQuality.Medium16; } else if (m_terrain.terrainData.detailResolutionPerPatch == 32) { m_detailQuality = GaiaConstants.TerrainDetailQuality.Low32; } else { m_detailQuality = GaiaConstants.TerrainDetailQuality.VeryLow64; } } #endregion } }