229 lines
7.2 KiB
C#
229 lines
7.2 KiB
C#
![]() |
using Godot;
|
||
|
using System.Reflection;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
|
||
|
namespace Rokojori
|
||
|
{
|
||
|
[Tool]
|
||
|
[GlobalClass]
|
||
|
public partial class LineFading:FadingModifier
|
||
|
{
|
||
|
public enum Mode
|
||
|
{
|
||
|
World,
|
||
|
WorldPoint_To_Camera,
|
||
|
Screen
|
||
|
}
|
||
|
|
||
|
[Export]
|
||
|
public Mode mode;
|
||
|
|
||
|
public override bool IsSameType( FadingModifier modifier )
|
||
|
{
|
||
|
if ( modifier is LineFading lf )
|
||
|
{
|
||
|
return lf.mode == mode;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public override List<ShaderCode> GetFadingCode( ShaderGenerationContext context, int offsetIndex, AlphaFadeMode parentFadeMode )
|
||
|
{
|
||
|
var alphaFadeMode = GetFadeMode( parentFadeMode );
|
||
|
|
||
|
var suffix = GetSuffix( offsetIndex );
|
||
|
|
||
|
if ( context.isIncludesPhase )
|
||
|
{
|
||
|
return IncludeTransformLibrary().Concat( IncludeFromLibrary( "Line3" ) ).Concat( IncludeSDFLibrary() );
|
||
|
}
|
||
|
|
||
|
if ( context.isVariablesPhase )
|
||
|
{
|
||
|
if ( Mode.Screen == mode )
|
||
|
{
|
||
|
List<string> variables =
|
||
|
[
|
||
|
Uniform( "screenLineDistanceFadeWorldPositionA" + suffix, Vector3.Zero ),
|
||
|
Uniform( "screenLineDistanceFadeWorldPositionB" + suffix, Vector3.One ),
|
||
|
VaryingVec3( "screenLineDistanceFadeScreenPositionA" + suffix ),
|
||
|
VaryingVec3( "screenLineDistanceFadeScreenPositionB" + suffix ),
|
||
|
Uniform( "screenLineDistanceFadeInnerRadius" + suffix, 0.1f ),
|
||
|
Uniform( "screenLineDistanceFadeOuterRadius" + suffix, 0.15f ),
|
||
|
VaryingVec2( "screenLineDistanceViewportRatio" + suffix )
|
||
|
];
|
||
|
|
||
|
variables = variables.Map( v => v.LineBreak() );
|
||
|
|
||
|
return ToCode( variables );
|
||
|
}
|
||
|
else if ( Mode.World == mode )
|
||
|
{
|
||
|
List<string> variables =
|
||
|
[
|
||
|
Uniform( "worldLineDistanceFadeWorldPositionA" + suffix, Vector3.Zero ),
|
||
|
Uniform( "worldLineDistanceFadeWorldPositionB" + suffix, Vector3.One ),
|
||
|
VaryingVec3( "worldLineDistanceFadeViewPositionA" + suffix ),
|
||
|
VaryingVec3( "worldLineDistanceFadeViewPositionB" + suffix ),
|
||
|
Uniform( "worldLineDistanceFadeInnerRadius" + suffix, 0.1f ),
|
||
|
Uniform( "worldLineDistanceFadeOuterRadius" + suffix, 0.15f )
|
||
|
];
|
||
|
|
||
|
variables = variables.Map( v => v.LineBreak() );
|
||
|
|
||
|
return ToCode( variables );
|
||
|
}
|
||
|
else if ( Mode.WorldPoint_To_Camera == mode )
|
||
|
{
|
||
|
List<string> variables =
|
||
|
[
|
||
|
Uniform( "worldCameraLineDistanceFadeWorldPosition" + suffix, Vector3.Zero ),
|
||
|
VaryingVec3( "worldCameraLineDistanceFadeViewPosition" + suffix ),
|
||
|
Uniform( "worldCameraLineDistanceFadeInnerRadius" + suffix, 0.1f ),
|
||
|
Uniform( "worldCameraLineDistanceFadeOuterRadius" + suffix, 0.15f )
|
||
|
];
|
||
|
|
||
|
variables = variables.Map( v => v.LineBreak() );
|
||
|
|
||
|
return ToCode( variables );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( context.isVertexPhase )
|
||
|
{
|
||
|
if ( Mode.Screen == mode )
|
||
|
{
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
screenLineDistanceFadeScreenPositionA{suffix} = vec3( worldToScreen( screenLineDistanceFadeWorldPositionA{suffix}, VIEW_MATRIX, PROJECTION_MATRIX ), 0.0 );
|
||
|
screenLineDistanceFadeScreenPositionB{suffix} = vec3( worldToScreen( screenLineDistanceFadeWorldPositionB{suffix}, VIEW_MATRIX, PROJECTION_MATRIX ), 0.0 );
|
||
|
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
}
|
||
|
else if ( Mode.World == mode )
|
||
|
{
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
worldLineDistanceFadeViewPositionA{suffix} = worldToView( worldLineDistanceFadeWorldPositionA{suffix}, VIEW_MATRIX );
|
||
|
worldLineDistanceFadeViewPositionB{suffix} = worldToView( worldLineDistanceFadeWorldPositionB{suffix}, VIEW_MATRIX );
|
||
|
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
|
||
|
}
|
||
|
else if ( Mode.WorldPoint_To_Camera == mode )
|
||
|
{
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
worldCameraLineDistanceFadeViewPosition{suffix} = worldToView( worldCameraLineDistanceFadeWorldPosition{suffix}, VIEW_MATRIX );
|
||
|
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
if ( context.isFragmentPhase )
|
||
|
{
|
||
|
if ( Mode.Screen == mode )
|
||
|
{
|
||
|
var fadeVariable = "screenLineDistanceFadeAmount" + suffix;
|
||
|
var fade = AlphaFade.Fragment( fadeVariable, alphaFadeMode );
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
{{
|
||
|
|
||
|
vec2 screenRatioMultiply = VIEWPORT_SIZE;
|
||
|
|
||
|
if ( screenRatioMultiply.x > screenRatioMultiply.y )
|
||
|
{{
|
||
|
screenRatioMultiply /= VIEWPORT_SIZE.x;
|
||
|
}}
|
||
|
else
|
||
|
{{
|
||
|
screenRatioMultiply /= VIEWPORT_SIZE.y;
|
||
|
}}
|
||
|
|
||
|
vec2 screenVertex = viewToScreen( VERTEX, PROJECTION_MATRIX ) * screenRatioMultiply;
|
||
|
|
||
|
|
||
|
|
||
|
Line3 screenLineDistanceFadeLine3;
|
||
|
screenLineDistanceFadeLine3.start = screenLineDistanceFadeScreenPositionA{suffix} * vec3( screenRatioMultiply, 1.0 );
|
||
|
screenLineDistanceFadeLine3.end = screenLineDistanceFadeScreenPositionB{suffix} * vec3( screenRatioMultiply, 1.0 );
|
||
|
|
||
|
float screenLineDistanceFadeDistance = Line3_getDistance( screenLineDistanceFadeLine3, vec3( screenVertex, 0.0 ) );
|
||
|
|
||
|
float {fadeVariable} = clamp( smoothstep( screenLineDistanceFadeInnerRadius{suffix}, screenLineDistanceFadeOuterRadius{suffix}, screenLineDistanceFadeDistance ), 0.0, 1.0 );
|
||
|
|
||
|
{fade}
|
||
|
|
||
|
}}
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
}
|
||
|
else if ( Mode.World == mode )
|
||
|
{
|
||
|
var fadeVariable = "worldLineDistanceFadeAmount" + suffix;
|
||
|
var fade = AlphaFade.Fragment( fadeVariable, alphaFadeMode );
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
{{
|
||
|
|
||
|
Line3 worldLineDistanceFadeLine3;
|
||
|
worldLineDistanceFadeLine3.start = worldLineDistanceFadeViewPositionA{suffix};
|
||
|
worldLineDistanceFadeLine3.end = worldLineDistanceFadeViewPositionB{suffix};
|
||
|
|
||
|
float worldLineDistanceFadeDistance = Line3_getDistance( worldLineDistanceFadeLine3, VERTEX );
|
||
|
|
||
|
float {fadeVariable} = clamp( smoothstep( worldLineDistanceFadeInnerRadius{suffix}, worldLineDistanceFadeOuterRadius{suffix}, worldLineDistanceFadeDistance ), 0.0, 1.0 );
|
||
|
|
||
|
{fade}
|
||
|
|
||
|
}}
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
}
|
||
|
else if ( Mode.WorldPoint_To_Camera == mode )
|
||
|
{
|
||
|
var fadeVariable = "worldLineDistanceFadeAmount" + suffix;
|
||
|
var fade = AlphaFade.Fragment( fadeVariable, alphaFadeMode );
|
||
|
var code =
|
||
|
$@"
|
||
|
|
||
|
{{
|
||
|
|
||
|
float worldLineDistanceFadeDistance = sdRoundCone( VERTEX, vec3( 0.0, 0.0, 0.0), worldCameraLineDistanceFadeViewPosition{suffix}, 0, worldCameraLineDistanceFadeInnerRadius );
|
||
|
|
||
|
|
||
|
float {fadeVariable} = clamp( smoothstep( 0, ( worldCameraLineDistanceFadeOuterRadius{suffix} - worldCameraLineDistanceFadeInnerRadius{suffix} ), worldLineDistanceFadeDistance ), 0.0, 1.0 );
|
||
|
|
||
|
{fade}
|
||
|
|
||
|
}}
|
||
|
";
|
||
|
|
||
|
return ToCode( code.Indent( " ") );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|