rj-action-library/Runtime/VirtualCameras/PostProcess/FogEffect.cs

148 lines
3.4 KiB
C#

using Godot;
using System.Collections.Generic;
using System;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class FogEffect:PostProcessVolumeEffect
{
[Export]
public ColorValue lightColor;
[Export]
public Float16Value lightEnergy;
[Export]
public NormalizedValue sunScatter;
[Export]
public PowerValue density;
[Export]
public NormalizedValue aerialPerspective;
[Export]
public NormalizedValue skyEffect;
[Export]
public Polar1024Value height;
[Export]
public Polar16Value heightDensity;
BoxedFloatValue[] _values = new BoxedFloatValue[ 7 ];
public override BoxedFloatValue[] GetFloatValues()
{
_values[ 0 ] = lightEnergy;
_values[ 1 ] = sunScatter;
_values[ 2 ] = density;
_values[ 3 ] = aerialPerspective;
_values[ 4 ] = skyEffect;
_values[ 5 ] = height;
_values[ 6 ] = heightDensity;
return _values;
}
public override void SetFloatValues( BoxedFloatValue[] values )
{
lightEnergy = Float16Value.Create( _values[ 0 ] );
sunScatter = NormalizedValue.Create( _values[ 1 ] );
density = PowerValue.Create( _values[ 2 ] );
aerialPerspective = NormalizedValue.Create( _values[ 3 ] );
skyEffect = NormalizedValue.Create( _values[ 4 ] );
height = Polar1024Value.Create( _values[ 5 ] );
heightDensity = Polar16Value.Create( _values[ 6 ] );
}
ColorValue[] _colors = new ColorValue[ 1 ];
public override ColorValue[] GetColorValues()
{
_colors[ 0 ] = lightColor;
return _colors;
}
public override void SetColorValues( ColorValue[] values )
{
lightColor = ColorValue.Create( values[ 0 ] );
}
public override void Lerp( object fogEffects, List<PostProcessVolume> volumes )
{
LerpFrom( (List<FogEffect>) fogEffects, volumes );
}
public void LerpFrom( List<FogEffect> fogEffects, List<PostProcessVolume> volumes )
{
LerpColors( fogEffects, volumes );
LerpFloats( fogEffects, volumes );
}
public override void Apply( WorldEnvironment worldEnvironment )
{
if ( worldEnvironment == null || worldEnvironment.Environment == null )
{
return;
}
if ( lightColor != null )
{
worldEnvironment.Environment.FogLightColor = lightColor.value;
}
/*
_values[ 0 ] = lightEnergy;
_values[ 1 ] = sunScatter;
_values[ 2 ] = density;
_values[ 3 ] = aerialPerspective;
_values[ 4 ] = skyEffect;
_values[ 5 ] = height;
_values[ 6 ] = heightDensity;
*/
if ( lightEnergy != null )
{
worldEnvironment.Environment.FogLightEnergy = lightEnergy.value;
}
if ( sunScatter != null )
{
worldEnvironment.Environment.FogSunScatter = sunScatter.value;
}
if ( density != null )
{
worldEnvironment.Environment.FogDensity = density.value;
}
if ( aerialPerspective != null )
{
worldEnvironment.Environment.FogAerialPerspective = aerialPerspective.value;
}
if ( skyEffect != null )
{
worldEnvironment.Environment.FogSkyAffect = skyEffect.value;
}
if ( height != null )
{
worldEnvironment.Environment.FogHeight = height.value;
}
if ( heightDensity != null )
{
worldEnvironment.Environment.FogHeightDensity = heightDensity.value;
}
}
}
}