riversong code showcase
This commit is contained in:
49
Source/Riversong/Game/World/Terrain/GrassLodGameSystem.cs
Normal file
49
Source/Riversong/Game/World/Terrain/GrassLodGameSystem.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user