49 lines
1.5 KiB
C#
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;
|
|
}
|
|
}
|
|
} |