Files
2026-05-21 16:04:49 +02:00

49 lines
1.5 KiB
C#

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;
}
}
}