84 lines
2.2 KiB
C#
84 lines
2.2 KiB
C#
![]() |
using Godot;
|
||
|
using System.Reflection;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
|
||
|
namespace Rokojori
|
||
|
{
|
||
|
[Tool]
|
||
|
[GlobalClass]
|
||
|
public partial class CameraDistanceFading:FadingModifier
|
||
|
{
|
||
|
public enum Mode
|
||
|
{
|
||
|
Near_Camera,
|
||
|
Far_Camera
|
||
|
}
|
||
|
|
||
|
[Export]
|
||
|
public Mode mode;
|
||
|
|
||
|
|
||
|
public override bool IsSameType( FadingModifier modifier )
|
||
|
{
|
||
|
if ( modifier is CameraDistanceFading cdf )
|
||
|
{
|
||
|
return cdf.mode == mode;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public override List<ShaderCode> GetFadingCode( ShaderGenerationContext context, int offsetIndex, AlphaFadeMode parentFadeMode )
|
||
|
{
|
||
|
bool isNear = mode == Mode.Near_Camera;
|
||
|
|
||
|
var alphaFadeMode = GetFadeMode( parentFadeMode );
|
||
|
|
||
|
var suffix = GetSuffix( offsetIndex );
|
||
|
|
||
|
if ( context.isIncludesPhase )
|
||
|
{
|
||
|
return IncludeNoiseLibrary().Concat( IncludeCamerasLibrary() );
|
||
|
}
|
||
|
|
||
|
var fadeOutVariable = isNear ? "nearCameraFadeOutDistance" : "farCameraFadeOutDistance";
|
||
|
var fadeInVariable = isNear ? "nearCameraFadeInDistance" : "farCameraFadeInDistance";
|
||
|
|
||
|
fadeOutVariable += suffix;
|
||
|
fadeInVariable += suffix;
|
||
|
|
||
|
if ( context.isVariablesPhase )
|
||
|
{
|
||
|
if ( isNear )
|
||
|
{
|
||
|
var nearFadeOutDistance = Uniform( fadeOutVariable, 0.0f, 0.1f, 5000 ).LineBreak();
|
||
|
var nearFadeInDistance = Uniform( fadeInVariable, 0.0f, 0.5f, 5000 ).LineBreak();
|
||
|
|
||
|
return ToCode( nearFadeOutDistance, nearFadeInDistance );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var farFadeInDistance = Uniform( fadeInVariable, 0.0f, 0.1f, 5000 ).LineBreak();
|
||
|
var farFadeOutDistance = Uniform( fadeOutVariable, 0.0f, 0.5f, 5000 ).LineBreak();
|
||
|
|
||
|
return ToCode( farFadeInDistance, farFadeOutDistance );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if ( context.isFragmentPhase )
|
||
|
{
|
||
|
var prefix = isNear ? "near" : "far";
|
||
|
var variable = $"{prefix}CameraDistanceFadeAlpha{suffix}";
|
||
|
var code = $"float {variable} = cameraDistanceFade( VERTEX, {fadeOutVariable}, {fadeInVariable});\n";
|
||
|
|
||
|
return ToCode( code.Indent( " ") ).Concat( ToCode( AlphaFade.Fragment( variable, alphaFadeMode ) ) );
|
||
|
}
|
||
|
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|