92 lines
2.1 KiB
JavaScript
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}
|
||
|
|
}
|
||
|
|
`;
|
||
|
|
}
|