mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-01-10 23:28:52 +07:00
42 lines
1.1 KiB
GLSL
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;
|
|
} |