70 lines
3.0 KiB
GLSL
70 lines
3.0 KiB
GLSL
#include "/lib/shaderSettings/shockwave.glsl"
|
|
// SDF from https://iquilezles.org/articles/distfunctions2d/
|
|
float sdBox(vec2 p, vec2 b) {
|
|
vec2 d = abs(p)-b;
|
|
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
|
|
}
|
|
float sdCircle(vec2 p, float r) {
|
|
return length(p) - r;
|
|
}
|
|
|
|
float getOffsetStrength(float animation, vec2 dir, float maxRadius) {
|
|
#if SHOCKWAVE == 1
|
|
float wave = sdCircle(vec2(dir / aspectRatio), animation * maxRadius);
|
|
#elif SHOCKWAVE == 2
|
|
float wave = sdBox(dir / aspectRatio, vec2(animation * maxRadius));
|
|
#endif
|
|
|
|
wave *= 1.0 - smoothstep(0.0, 0.2, abs(wave)); // Mask the ripple
|
|
|
|
wave *= smoothstep(0.0, 0.2, animation); // Smooth intro
|
|
wave *= 1.0 - smoothstep(0.5, 1.0, animation); // Smooth outro
|
|
return wave * 0.05;
|
|
}
|
|
|
|
vec4 doShockwave(vec3 playerPos, vec2 texCoord){ // Based on https://editor.p5js.org/BarneyCodes/sketches/ELbA93Ugb by BarneyCodes
|
|
vec2 centre = playerPos.xz + 0.4;
|
|
vec2 dir = centre - texCoord;
|
|
float animation = pow(isShockwave, 1.0 / 1.2);
|
|
vec4 shockwaveColor = vec4(0);
|
|
float maxRadius = 4;
|
|
|
|
// Chromatic aberration
|
|
float aberrationOffset = 0.05 * sin(animation * pi);
|
|
float rWave = getOffsetStrength(animation + aberrationOffset, dir, maxRadius);
|
|
float gWave = getOffsetStrength(animation, dir, maxRadius);
|
|
float bWave = getOffsetStrength(animation - aberrationOffset, dir, maxRadius);
|
|
|
|
dir = normalize(dir);
|
|
|
|
float value = 1.0;
|
|
#if defined GBUFFERS_TERRAIN || defined GBUFFERS_WATER
|
|
float blockRes = absMidCoordPos.x * atlasSize.x;
|
|
vec2 signMidCoordPosM = abs((floor((signMidCoordPos + 1.0) * blockRes) + 0.5) / blockRes - 1.0);
|
|
value = 1.0 - max(signMidCoordPosM.x, signMidCoordPosM.y); // Prevent from distorting into a different atlas texture
|
|
#endif
|
|
|
|
float waveFactor = abs(max(gWave, max(rWave, bWave)) * 100.0);
|
|
|
|
value *= step(0.01, animation);
|
|
|
|
#if ANISOTROPIC_FILTER != 0 && defined GBUFFERS_TERRAIN
|
|
float r = waveFactor > 0.0001 ? texture2D(tex, texCoord + dir * rWave * value).r : textureAF(tex, texCoord).r;
|
|
float g = waveFactor > 0.0001 ? texture2D(tex, texCoord + dir * gWave * value).g : textureAF(tex, texCoord).g;
|
|
float b = waveFactor > 0.0001 ? texture2D(tex, texCoord + dir * bWave * value).b : textureAF(tex, texCoord).b;
|
|
float a = waveFactor > 0.0001 ? texture2D(tex, texCoord).a : textureAF(tex, texCoord).a; // Use the non AF method during the wave
|
|
#else
|
|
float r = texture2D(tex, texCoord + dir * rWave * value).r;
|
|
float g = texture2D(tex, texCoord + dir * gWave * value).g;
|
|
float b = texture2D(tex, texCoord + dir * bWave * value).b;
|
|
float a = texture2D(tex, texCoord).a;
|
|
#endif
|
|
|
|
float shading = gWave * 15.0; // use gWave as it has no chromatic aberration
|
|
|
|
shockwaveColor = vec4(r, g, b, a);
|
|
shockwaveColor.rgb += shading * 1.5;
|
|
// shockwaveColor += waveFactor > 0.0001 ? vec4(3,0,0,1) : vec4(0,0,0,0); // Debugging
|
|
return shockwaveColor;
|
|
}
|