Files
Foundry-VTT-Docker/resources/app/client/pixi/webgl/shaders/lighting/effects/smoke-patch.js
2025-01-04 00:34:03 +01:00

92 lines
2.1 KiB
JavaScript

/**
* A patch of smoke
*/
class SmokePatchColorationShader extends AdaptiveColorationShader {
static fragmentShader = `
${this.SHADER_HEADER}
${this.PERCEIVED_BRIGHTNESS}
${this.PRNG}
${this.NOISE}
${this.FBMHQ(3)}
vec2 transform(in vec2 uv, in float dist) {
float t = time * 0.1;
float cost = cos(t);
float sint = sin(t);
mat2 rotmat = mat2(cost, -sint, sint, cost);
mat2 scalemat = mat2(10.0, uv.x, uv.y, 10.0);
uv -= PIVOT;
uv *= (rotmat * scalemat);
uv += PIVOT;
return uv;
}
float smokefading(in float dist) {
float t = time * 0.4;
vec2 uv = transform(vUvs, dist);
return pow(1.0 - dist,
mix(fbm(uv, 1.0 + intensity * 0.4),
max(fbm(uv + t, 1.0),
fbm(uv - t, 1.0)),
pow(dist, intensity * 0.5)));
}
void main() {
${this.FRAGMENT_BEGIN}
finalColor = color * smokefading(dist) * colorationAlpha;
${this.COLORATION_TECHNIQUES}
${this.ADJUSTMENTS}
${this.FALLOFF}
${this.FRAGMENT_END}
}
`;
}
/* -------------------------------------------- */
/**
* A patch of smoke
*/
class SmokePatchIlluminationShader extends AdaptiveIlluminationShader {
static fragmentShader = `
${this.SHADER_HEADER}
${this.PERCEIVED_BRIGHTNESS}
${this.PRNG}
${this.NOISE}
${this.FBMHQ(3)}
vec2 transform(in vec2 uv, in float dist) {
float t = time * 0.1;
float cost = cos(t);
float sint = sin(t);
mat2 rotmat = mat2(cost, -sint, sint, cost);
mat2 scalemat = mat2(10.0, uv.x, uv.y, 10.0);
uv -= PIVOT;
uv *= (rotmat * scalemat);
uv += PIVOT;
return uv;
}
float smokefading(in float dist) {
float t = time * 0.4;
vec2 uv = transform(vUvs, dist);
return pow(1.0 - dist,
mix(fbm(uv, 1.0 + intensity * 0.4),
max(fbm(uv + t, 1.0),
fbm(uv - t, 1.0)),
pow(dist, intensity * 0.5)));
}
void main() {
${this.FRAGMENT_BEGIN}
${this.TRANSITION}
finalColor *= smokefading(dist);
${this.ADJUSTMENTS}
${this.FALLOFF}
${this.FRAGMENT_END}
}
`;
}