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

134 lines
4.9 KiB
C#

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;
}
bool _isEnabled = false;
public void Update( double delta )
{
if ( gpuFoliageShaderMaterial != null )
{
if ( data.enabled != _isEnabled)
{
_isEnabled = data.enabled;
gpuParticles3D.SetEnabledState( _isEnabled );
return;
}
if ( ! _isEnabled )
{
return;
}
gpuFoliageShaderMaterial.cameraPosition.Set( renderer.GetAssignedCamera().GlobalPosition );
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 )
{
_lastCellSize = cellSize;
_lastMaxVisibility = visibilityRange;
gpuFoliageShaderMaterial.cellSize.Set( cellSize );
gpuParticles3D.Amount = sizeInt * sizeInt;
gpuFoliageShaderMaterial.width.Set( sizeInt );
gpuFoliageShaderMaterial.height.Set( sizeInt );
}
var hideStart = visibilityRange - ( visibilityRange * data.visibilityFadeRelative + data.visibilityFadeAbsolute );
gpuFoliageShaderMaterial.hideMax.Set( visibilityRange );
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 );
if ( gpuParticles3D.DrawPass1.SurfaceGetMaterial( 0 ) is ShaderMaterial drawMaterial )
{
drawMaterial.SetShaderParameter( "obstacle1", renderer.GetObstacleData( 0 ) );
drawMaterial.SetShaderParameter( "obstacle2", renderer.GetObstacleData( 1 ) );
drawMaterial.SetShaderParameter( "obstacle3", renderer.GetObstacleData( 2 ) );
drawMaterial.SetShaderParameter( "obstacle4", renderer.GetObstacleData( 3 ) );
// RJLog.Log( drawMaterial, renderer.GetObstacleData( 0 ) );
}
}
}
}
}