rj-action-library/Runtime/Shading/Shaders/Flares/EllipseFlare/EllipseFlareBase.gdshaderinc

156 lines
6.1 KiB
Plaintext

#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Colors.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Depth.gdshaderinc"
uniform sampler2D depthTexture:hint_depth_texture;
uniform vec4 color : source_color = vec4( 0.887, 0.434, 0.233, 1.0 );
uniform float alphaScale = 1;
uniform float circleAmount = 1;
uniform float circleDistortion = 1;
uniform float ellipseAmount = 1;
uniform float ellipseDistortion = 1;
uniform vec2 ellipseScale = vec2( 1, 0.5 );
uniform float add_vs_max:hint_range(0,1) = 0.5;
uniform vec4 centerHSL = vec4( 0.08, 0.0, 0.18, 1.0 );
varying vec4 centerColor;
uniform vec4 outsideHSL = vec4( -0.05, 1.65, 0.02, 0.0 );
varying vec4 outsideColor;
uniform float sizeX:hint_range(1,100) = 10;
uniform float sizeY:hint_range(1,100) = 1;
uniform float scaleAll = 1;
uniform float worldSize_vs_screenSize:hint_range(0,1) = 1;
varying vec2 stretch;
uniform bool usSpectralsNoise = false;
uniform vec3 spectralsAmount = vec3( 0.1, 0.05, 0.02 );
uniform float nonSpectralAmount = 0.95;
uniform vec3 spectralsSize = vec3( 1,0.8, 0.5 );
uniform vec3 spectralsSharpness = vec3( 0, 0, 0 );
uniform vec3 spectralsFrequency = vec3( 50.0, 200.0, 500.0 );
uniform vec3 spectralsSpeed = vec3( 5.0, -3.0, -2.0 );
uniform sampler2D fading;
uniform sampler2D sizeXfading;
uniform sampler2D sizeYfading;
uniform bool useQuickOcclusionTest = false;
uniform float occlusionZOffset:hint_range(-30,30) = 0;
uniform int occlusionTestMaxSteps = 10;
uniform float occlusionTestStepStride = 1;
uniform float occlusionTest_ViewDependingScaleAmount:hint_range(0,1) = 0.5;
uniform float occlusionTest_ViewDependingDistance = 100;
varying float occlusionAlpha;
void vertex()
{
vec3 viewOffset = viewToWorldDirection( vec3( 0, 0, occlusionZOffset ), INV_VIEW_MATRIX );
vec3 nodePositionView = worldToView( NODE_POSITION_WORLD + viewOffset, VIEW_MATRIX );
vec2 screenPosition = viewToScreen( nodePositionView, PROJECTION_MATRIX );
float fadeValue = textureLod( fading, screenPosition, 0.0 ).r;
float sizeXFade = textureLod( sizeXfading, screenPosition, 0.0 ).r;
float sizeYFade = textureLod( sizeYfading, screenPosition, 0.0 ).r;
float nodeScale = length( extractScale( MODEL_MATRIX ) );
float sX = sizeX * sizeXFade;
float sY = sizeY * sizeYFade;
vec2 uvPixelSize = vec2( 1.0, 1.0 ) / VIEWPORT_SIZE ;
vec2 scaledUVPixelSize = uvPixelSize * max( 1.0, nodePositionView.z / occlusionTest_ViewDependingDistance );
uvPixelSize = mix( uvPixelSize, scaledUVPixelSize, occlusionTest_ViewDependingScaleAmount );
float occlusionValue = useQuickOcclusionTest ?
getQuickOcclusionAt( depthTexture, nodePositionView, uvPixelSize,
occlusionTestMaxSteps, occlusionTestStepStride,
PROJECTION_MATRIX, INV_PROJECTION_MATRIX ) :
getOcclusionAt( depthTexture, nodePositionView, uvPixelSize,
occlusionTestMaxSteps, occlusionTestStepStride,
PROJECTION_MATRIX, INV_PROJECTION_MATRIX );
occlusionAlpha = occlusionValue * fadeValue;
float camDist = length( NODE_POSITION_WORLD - CAMERA_POSITION_WORLD );
vec2 sizeScaled = vec2( sX, sY ) * scaleAll * occlusionAlpha * nodeScale;
vec2 size = mix( sizeScaled, sizeScaled * camDist * 0.1, worldSize_vs_screenSize );
stretch = vec2( sX, sY );
vec3 worldOffset = billboardWorldOffsetWithSize( size, UV, INV_VIEW_MATRIX, MODEL_MATRIX );
VERTEX += worldOffset;
vec3 hsl = RGBtoHSL( color.rgb );
vec3 shiftedHSL = shiftHSL( hsl, centerHSL.rgb, 60.0 );
vec3 shiftedRGB = HSLtoRGB( shiftedHSL );
centerColor = vec4( shiftRGBwithHSL( color.rgb, centerHSL.rgb, 60.0 ), centerHSL.a * color.a);
outsideColor = vec4( shiftRGBwithHSL( color.rgb, outsideHSL.rgb, 60.0 ), outsideHSL.a * color.a );
}
float psin( float x, float power )
{
float v = sin( x ) * 0.5 + 0.5;
return mix( v, v * v * v, power );
}
void fragment()
{
vec2 circleUV = ( UV - vec2( 0.5 ) ) * stretch + vec2( 0.5 );
vec2 centerUV = UV - vec2( 0.5 );
float angle = atan( centerUV.y, centerUV.x );
vec3 sizes = vec3( 1.0 ) * length( circleUV ) / 0.701;
float distanceToCircle = 1.0 - min( 1, length( circleUV - vec2( 0.5, 0.5 ) ) / 0.5 );
float noise = 1.0;
if ( usSpectralsNoise )
{
noise = nonSpectralAmount;
float spX = max( 0, mix( psin( TIME * spectralsSpeed.x + angle * spectralsFrequency.x, spectralsSharpness.x ) * spectralsAmount.x, 0.0, -spectralsSize.x - distanceToCircle ) );
float spY = max( 0, mix( psin( TIME * spectralsSpeed.y + angle * spectralsFrequency.y, spectralsSharpness.y ) * spectralsAmount.y, 0.0, -spectralsSize.y - distanceToCircle ) );
float spZ = max( 0, mix( psin( TIME * spectralsSpeed.z + angle * spectralsFrequency.z, spectralsSharpness.z ) * spectralsAmount.z, 0.0, -spectralsSize.z - distanceToCircle ) );
float oa = occlusionAlpha * occlusionAlpha;
noise += spX * oa;
noise += spY * oa;
noise += spZ * oa;
noise = mix( noise, 1.0, 1.0 - oa );
}
vec2 ellipseUV = ( UV - vec2( 0.5 ) ) / ellipseScale + vec2( 0.5 );
float distanceToEllipse = 1.0 - min( 1, length( ellipseUV - vec2( 0.5, 0.5 ) ) / 0.5 );
distanceToCircle = clamp01( distanceToCircle * noise );
distanceToEllipse = clamp01( distanceToEllipse );
distanceToCircle = pow( distanceToCircle, circleDistortion );
distanceToEllipse = pow( distanceToEllipse, ellipseDistortion );
distanceToCircle *= circleAmount;
distanceToEllipse *= ellipseAmount;
float addResult = min( 1, distanceToEllipse + distanceToCircle );
float maxResult = min( 1, max( distanceToEllipse, distanceToCircle ) );
float t = mix( addResult, maxResult, add_vs_max );
vec4 mixedColor = mixThreeColors( outsideColor, color, centerColor, t );
ALBEDO = mixedColor.rgb;
ALPHA = mixedColor.a * occlusionAlpha * alphaScale;
}