rj-action-library/Runtime/Rendering/Assets/Foliage/FoliageRenderLayer.cs

111 lines
4.1 KiB
C#
Raw Normal View History

2025-07-17 11:50:37 +00:00
using System.Collections;
using System.Collections.Generic;
using Godot;
using System;
using System.Threading.Tasks;
namespace Rokojori
{
/** <summary for="class FoliageRenderLayer">
<title>
Is used by the FoliageRenderer to book keep and render a layer defined by the FoliageData.
</title>
<description>
</description>
</summary>
*/
public class FoliageRenderLayer
{
public FoliageRenderer renderer;
public FoliageData data;
public GpuParticles3D gpuParticles3D;
public GPUFoliageShaderMaterial gpuFoliageShaderMaterial;
float _lastCellSize = -1;
float _lastMaxVisibility = -1;
public static FoliageRenderLayer Create( FoliageRenderer renderer, FoliageData data )
{
var rl = new FoliageRenderLayer();
rl.renderer = renderer;
rl.data = data;
return rl;
}
public void Update( double delta )
{
if ( gpuFoliageShaderMaterial != null )
{
gpuFoliageShaderMaterial.cameraPosition.Set( renderer.GetAssignedCamera().GlobalPosition );
2025-07-18 14:45:23 +00:00
2025-07-17 11:50:37 +00:00
2025-07-18 14:45:23 +00:00
var cellSize = FoliageQualitySettings.GetCellSize( renderer.quality, renderer.qualitySettingsAll, data.qualitySettings, data.cellSize );
var visibilityRange = FoliageQualitySettings.GetVisibilityRange( renderer.quality, renderer.qualitySettingsAll, data.qualitySettings, data.visibilityRange );
var sizeInt = Mathf.CeilToInt( visibilityRange / cellSize ) * 2;
if ( _lastCellSize != cellSize || _lastMaxVisibility != visibilityRange )
2025-07-17 11:50:37 +00:00
{
2025-07-18 14:45:23 +00:00
_lastCellSize = cellSize;
_lastMaxVisibility = visibilityRange;
2025-07-17 11:50:37 +00:00
2025-07-18 14:45:23 +00:00
gpuFoliageShaderMaterial.cellSize.Set( cellSize );
2025-07-17 11:50:37 +00:00
gpuParticles3D.Amount = sizeInt * sizeInt;
gpuFoliageShaderMaterial.width.Set( sizeInt );
gpuFoliageShaderMaterial.height.Set( sizeInt );
}
2025-07-18 14:45:23 +00:00
var hideStart = visibilityRange - ( visibilityRange * data.visibilityFadeRelative + data.visibilityFadeAbsolute );
gpuFoliageShaderMaterial.hideMax.Set( visibilityRange );
2025-07-17 11:50:37 +00:00
gpuFoliageShaderMaterial.hideStart.Set( hideStart );
gpuFoliageShaderMaterial.hideOffset.Set( data.visibilityFadeHidingOffset );
gpuFoliageShaderMaterial.positionVariance.Set( renderer.noise );
gpuFoliageShaderMaterial.rotationVariance.Set( renderer.noise );
gpuFoliageShaderMaterial.scaleVariance.Set( renderer.noise );
gpuFoliageShaderMaterial.occupancyVariance.Set( renderer.noise );
gpuFoliageShaderMaterial.maxPositionOffset.Set( data.positionVarianceMaxOffset );
gpuFoliageShaderMaterial.positionUvScale.Set( Vector2.One * data.positionVarianceScale );
gpuFoliageShaderMaterial.positionUvOffset.Set( Vector2.One * data.positionVarianceOffset );
gpuFoliageShaderMaterial.minRotation.Set( data.rotationMin );
gpuFoliageShaderMaterial.maxRotation.Set( data.rotationMax );
gpuFoliageShaderMaterial.rotationUvScale.Set( Vector2.One * data.rotationVarianceScale );
gpuFoliageShaderMaterial.rotationUvOffset.Set( Vector2.One * data.rotationVarianceOffset );
gpuFoliageShaderMaterial.minScale.Set( data.scaleVarianceMinScale );
gpuFoliageShaderMaterial.maxScale.Set( data.scaleVarianceMaxScale );
gpuFoliageShaderMaterial.scaleUvScale.Set( Vector2.One * data.scaleVarianceScale );
gpuFoliageShaderMaterial.scaleUvOffset.Set( Vector2.One * data.scaleVarianceOffset );
gpuFoliageShaderMaterial.occupancyAmount.Set( data.occupancyVarianceAmount );
gpuFoliageShaderMaterial.occupancyPower.Set( data.occupancyVariancePower );
gpuFoliageShaderMaterial.occupancyTreshold.Set( data.occupancyTreshold );
gpuFoliageShaderMaterial.occupancyHideOffset.Set( data.occupancyHideOffset );
gpuFoliageShaderMaterial.occupancyHideScale.Set( data.occupancyHideScale );
gpuFoliageShaderMaterial.occupancyUvScale.Set( Vector2.One * data.occupancyVarianceScale );
gpuFoliageShaderMaterial.occupancyUvOffset.Set( Vector2.One * data.occupancyVarianceOffset );
}
}
}
}