95 lines
2.3 KiB
C#
95 lines
2.3 KiB
C#
using Godot;
|
|
using System.Reflection;
|
|
using System.Collections.Generic;
|
|
using System;
|
|
|
|
namespace Rokojori
|
|
{
|
|
[Tool]
|
|
[GlobalClass]
|
|
public partial class GeometryGlobalWind:GeometryModifier
|
|
{
|
|
|
|
public override List<ShaderCode> GetGeometryCode( ShaderGenerationContext context, int offsetIndex )
|
|
{
|
|
if ( offsetIndex != 0 )
|
|
{
|
|
throw new Exception( "Unique component, can't be used multiple times");
|
|
}
|
|
|
|
if ( ShaderPhase.Includes == context.phase )
|
|
{
|
|
return IncludeFromLibrary( "Wind" );
|
|
}
|
|
|
|
if ( ShaderPhase.Variables == context.phase )
|
|
{
|
|
return AsUniformGroup( "Wind",
|
|
|
|
@"
|
|
|
|
uniform float windMaxStrength = 1;
|
|
uniform float windMaxRotation = 1;
|
|
uniform float windStrengthCurve:hint_range(0,1) = 0.5f;
|
|
uniform float windStart = 0;
|
|
uniform float windEnd = 1;
|
|
uniform float windWeightCurve:hint_range(0,1) = 0.5f;
|
|
uniform float windHeightCompensation :hint_range(0,1) = 0.5f;
|
|
uniform float windNormalBending :hint_range(0,1) = 0.1f;
|
|
uniform float windOcclusionAmount = 0;
|
|
global uniform sampler2D rj_GlobalWindNoiseTexture;
|
|
global uniform vec2 rj_GlobalWindPosition;
|
|
global uniform vec2 rj_GlobalWindDirection;
|
|
global uniform float rj_GlobalWindSpeed;
|
|
varying float vertexWindAO;
|
|
"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if ( ShaderPhase.Vertex == context.phase )
|
|
{
|
|
|
|
return ToInnerBlock( "Wind",
|
|
|
|
@"
|
|
|
|
float cachedVertexWindAO = 0.0;
|
|
|
|
applyGlobalWind(
|
|
MODEL_MATRIX,
|
|
VERTEX,
|
|
NORMAL,
|
|
cachedVertexWindAO,
|
|
windOcclusionAmount,
|
|
rj_GlobalWindNoiseTexture,
|
|
rj_GlobalWindPosition,
|
|
rj_GlobalWindDirection,
|
|
rj_GlobalWindSpeed,
|
|
windMaxStrength,
|
|
windMaxRotation,
|
|
windStrengthCurve,
|
|
windStart,
|
|
windEnd,
|
|
windWeightCurve,
|
|
windHeightCompensation,
|
|
windNormalBending
|
|
);
|
|
|
|
vertexWindAO = cachedVertexWindAO;
|
|
|
|
"
|
|
|
|
) ;
|
|
}
|
|
|
|
if ( ShaderPhase.Fragment == context.phase )
|
|
{
|
|
return ToCode( "AO *= vertexWindAO;".Indent( " " ).LineBreaks() );
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
} |