namespace DanieleMarotta.RiversongCodeShowcase { public class GrassLodGameSystem : GameSystem, IUpdatable { [InjectService] private GameConfig _config; [InjectService] private IScene _scene; [InjectService] private WorldRenderingState _renderingState; public GrassLodGameSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public void Update() { var grassConfig = _config.Terrain.GrassLODs; var cropsConfig = _config.Terrain.CropsLODs; foreach (var chunk in _renderingState.TerrainChunks) { SelectLOD(chunk.GrassLODs, grassConfig); SelectLOD(chunk.CropsLODs, cropsConfig); } } private void SelectLOD(TerrainChunk.RenderData[] lods, GameConfig.TerrainConfig.GrassLOD[] config) { // We can assume all LODs have almost the same center, so we just use the center of the first one var position = lods[0].Renderer.bounds.center; var viewSpacePosition = _scene.CinemachineCamera.transform.InverseTransformPoint(position); var selectedLod = int.MaxValue; for (var lod = 0; lod < config.Length; lod++) if (viewSpacePosition.z < config[lod].Threshold) { selectedLod = lod; break; } for (var lod = 0; lod < lods.Length; lod++) lods[lod].Renderer.enabled = lod == selectedLod; } } }