Mindustry/core/assets/shaders/shockwave.frag
2022-03-13 21:39:35 -04:00

42 lines
1.1 KiB
GLSL

#define MAX_SHOCKWAVES 64
#define WAVE_RADIUS 5.0
#define DIFF_SCL 1.5
#define WAVE_POW 0.8
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform vec2 u_resolution;
uniform vec2 u_campos;
uniform vec4 u_shockwaves[MAX_SHOCKWAVES];
uniform int u_shockwave_count;
void main(){
vec2 worldCoords = v_texCoords * u_resolution + u_campos;
vec2 uv = v_texCoords;
vec2 displacement = vec2(0.0, 0.0);
for(int i = 0; i < MAX_SHOCKWAVES; i ++){
vec4 wave = u_shockwaves[i];
float radius = wave.z;
float dst = distance(worldCoords, wave.xy);
float strength = wave.w * (1.0 - abs(dst - radius) / WAVE_RADIUS);
if(abs(dst - radius) <= WAVE_RADIUS){
float diff = (dst - radius);
float pdiff = 1.0 - pow(abs(diff * DIFF_SCL), WAVE_POW);
float diffTime = diff * pdiff;
vec2 relative = normalize(worldCoords - wave.xy);
displacement += (relative * diffTime * strength) / u_resolution;
}
if(i >= u_shockwave_count - 1){
break;
}
}
vec4 c = texture2D(u_texture, uv + displacement);
gl_FragColor = c;
}