Files
Foundry-VTT-Docker/resources/app/client/pixi/webgl/shaders/weather/rain.js
2025-01-04 00:34:03 +01:00

49 lines
1.3 KiB
JavaScript

/**
* Rain shader effect.
*/
class RainShader extends AbstractWeatherShader {
/** @inheritdoc */
static defaultUniforms = {
opacity: 1,
intensity: 1,
strength: 1,
rotation: 0.5,
resolution: [3200, 80] // The resolution to have nice rain ropes with the voronoi cells
};
/* -------------------------------------------- */
/** @inheritdoc */
static fragmentShader = `
${this.FRAGMENT_HEADER}
${this.CONSTANTS}
${this.PERCEIVED_BRIGHTNESS}
${this.ROTATION}
${this.PRNG2D}
${this.VORONOI}
uniform float intensity;
uniform float opacity;
uniform float strength;
uniform float rotation;
uniform vec2 resolution;
// Compute rain according to uv and dimensions for layering
float computeRain(in vec2 uv, in float t) {
vec2 tuv = uv;
vec2 ruv = ((tuv + 0.5) * rot(rotation)) - 0.5;
ruv.y -= t * 0.8;
vec2 st = ruv * resolution;
vec3 d2 = voronoi(vec3(st - t * 0.5, t * 0.8), 10.0);
float df = perceivedBrightness(d2);
return (1.0 - smoothstep(-df * strength, df * strength + 0.001, 1.0 - smoothstep(0.3, 1.0, d2.z))) * intensity;
}
void main() {
${this.COMPUTE_MASK}
gl_FragColor = vec4(vec3(computeRain(vUvs, time)) * tint, 1.0) * alpha * mask * opacity;
}
`;
}