using UnityEngine; namespace BitGames.Terrain { internal static class RuntimeGlobals { public const float TILE_SIZE = 2.5f; public static readonly SizeOption[] SizeOptions = { new(32), new(64), new(128), new(256) }; private static Material _instancedMaterial; private static int _materialDependencies; private static TerrainAsset _currentAsset; private static readonly int ControlMapId = Shader.PropertyToID("ControlMap"); private static readonly int ShadowMapId = Shader.PropertyToID("ShadowMap"); private static readonly int ShadowColorId = Shader.PropertyToID("ShadowColor"); private static readonly int TileSizeId = Shader.PropertyToID("TileSize"); public static Material RegisterMaterialUser(ITerrainMaterialUser user) { if (_materialDependencies == 0 || _instancedMaterial == null) { _instancedMaterial = new Material(Shader.Find("Terrain/Tile Terrain")) { name = "Terrain (instance)" }; } _materialDependencies++; return _instancedMaterial; } public static void RemoveMaterialUser(ITerrainMaterialUser user) { _materialDependencies--; if (_materialDependencies == 0) { SafeDestroy(_instancedMaterial); } } private static void SafeDestroy(Object obj) { #if UNITY_EDITOR if(UnityEditor.EditorApplication.isPlaying) Object.Destroy(obj); else Object.DestroyImmediate(obj); #else Object.Destroy(obj); #endif } public static void ActivateAsset(TerrainAsset asset) { _currentAsset = asset; Shader.SetGlobalTexture(ControlMapId, asset.ControlTexture); Shader.SetGlobalTexture(ShadowMapId, asset.ShadowTexture); Shader.SetGlobalColor(ShadowColorId, asset.ShadowColor); Shader.SetGlobalFloat(TileSizeId, TILE_SIZE); } } }