Files
Reimagined/shaderpacks/Reimagined - Low/shaders/lib/misc/shockwave.glsl
T
2026-05-07 21:38:27 +03:00

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;
}