Files
Foundry-VTT-Docker/resources/app/client/pixi/webgl/shaders/lighting/effects/light-dome.js

58 lines
1.5 KiB
JavaScript
Raw Normal View History

2025-01-04 00:34:03 +01:00
/**
* Light dome animation coloration shader
*/
class LightDomeColorationShader extends AdaptiveColorationShader {
/** @override */
static forceDefaultColor = true;
/** @override */
static fragmentShader = `
${this.SHADER_HEADER}
${this.PRNG}
${this.NOISE}
${this.FBM(2)}
${this.PERCEIVED_BRIGHTNESS}
// Rotate and scale uv
vec2 transform(in vec2 uv, in float dist) {
float hspherize = (1.0 - sqrt(1.0 - dist)) / dist;
float t = time * 0.02;
mat2 rotmat = mat2(cos(t), -sin(t), sin(t), cos(t));
mat2 scalemat = mat2(8.0 * intensity, 0.0, 0.0, 8.0 * intensity);
uv -= PIVOT;
uv *= rotmat * scalemat * hspherize;
uv += PIVOT;
return uv;
}
vec3 ripples(in vec2 uv) {
// creating the palette
vec3 c1 = color * 0.550;
vec3 c2 = color * 0.020;
vec3 c3 = color * 0.3;
vec3 c4 = color;
vec3 c5 = color * 0.025;
vec3 c6 = color * 0.200;
vec2 p = uv + vec2(5.0);
float q = 2.0 * fbm(p + time * 0.2);
vec2 r = vec2(fbm(p + q + ( time ) - p.x - p.y), fbm(p * 2.0 + ( time )));
return clamp( mix( c1, c2, abs(fbm(p + r)) ) + mix( c3, c4, abs(r.x * r.x * r.x) ) - mix( c5, c6, abs(r.y * r.y)), vec3(0.0), vec3(1.0));
}
void main() {
${this.FRAGMENT_BEGIN}
// to hemispherize, rotate and magnify
vec2 uv = transform(vUvs, dist);
finalColor = ripples(uv) * pow(1.0 - dist, 0.25) * colorationAlpha;
${this.COLORATION_TECHNIQUES}
${this.ADJUSTMENTS}
${this.FALLOFF}
${this.FRAGMENT_END}
}`;
}