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

108 lines
3.1 KiB
JavaScript

/**
* Shader specialized in wave like senses (tremorsenses)
*/
class WaveBackgroundVisionShader extends BackgroundVisionShader {
/** @inheritdoc */
static fragmentShader = `
${this.SHADER_HEADER}
${this.WAVE()}
${this.PERCEIVED_BRIGHTNESS}
void main() {
${this.FRAGMENT_BEGIN}
// Normalize vUvs and compute base time
vec2 uvs = (2.0 * vUvs) - 1.0;
float t = time * -8.0;
// Rotate uvs
float sinX = sin(t * 0.02);
float cosX = cos(t * 0.02);
mat2 rotationMatrix = mat2( cosX, -sinX, sinX, cosX);
vec2 ruv = ((vUvs - 0.5) * rotationMatrix) + 0.5;
// Produce 4 arms smoothed to the edges
float angle = atan(ruv.x * 2.0 - 1.0, ruv.y * 2.0 - 1.0) * INVTWOPI;
float beam = fract(angle * 4.0);
beam = smoothstep(0.3, 1.0, max(beam, 1.0 - beam));
// Construct final color
vec3 grey = vec3(perceivedBrightness(baseColor.rgb));
finalColor = mix(baseColor.rgb, grey * 0.5, sqrt(beam)) * mix(vec3(1.0), colorTint, 0.3);
${this.ADJUSTMENTS}
${this.BACKGROUND_TECHNIQUES}
${this.FALLOFF}
${this.FRAGMENT_END}
}`;
/** @inheritdoc */
static defaultUniforms = ({...super.defaultUniforms, colorTint: [0.8, 0.1, 0.8]});
/** @inheritdoc */
get isRequired() {
return true;
}
}
/* -------------------------------------------- */
/**
* The wave vision shader, used to create waves emanations (ex: tremorsense)
*/
class WaveColorationVisionShader extends ColorationVisionShader {
/** @inheritdoc */
static fragmentShader = `
${this.SHADER_HEADER}
${this.WAVE()}
${this.PERCEIVED_BRIGHTNESS}
void main() {
${this.FRAGMENT_BEGIN}
// Normalize vUvs and compute base time
vec2 uvs = (2.0 * vUvs) - 1.0;
float t = time * -8.0;
// Rotate uvs
float sinX = sin(t * 0.02);
float cosX = cos(t * 0.02);
mat2 rotationMatrix = mat2( cosX, -sinX, sinX, cosX);
vec2 ruv = ((vUvs - 0.5) * rotationMatrix) + 0.5;
// Prepare distance from 4 corners
float dst[4];
dst[0] = distance(vec2(0.0), ruv);
dst[1] = distance(vec2(1.0), ruv);
dst[2] = distance(vec2(1.0,0.0), ruv);
dst[3] = distance(vec2(0.0,1.0), ruv);
// Produce 4 arms smoothed to the edges
float angle = atan(ruv.x * 2.0 - 1.0, ruv.y * 2.0 - 1.0) * INVTWOPI;
float beam = fract(angle * 4.0);
beam = smoothstep(0.3, 1.0, max(beam, 1.0 - beam));
// Computing the 4 corner waves
float multiWaves = 0.0;
for ( int i = 0; i <= 3 ; i++) {
multiWaves += smoothstep(0.6, 1.0, max(multiWaves, wcos(-10.0, 1.30 - dst[i], dst[i] * 120.0, t)));
}
// Computing the central wave
multiWaves += smoothstep(0.6, 1.0, max(multiWaves, wcos(-10.0, 1.35 - dist, dist * 120.0, -t)));
// Construct final color
finalColor = vec3(mix(multiWaves, 0.0, sqrt(beam))) * colorEffect;
${this.COLORATION_TECHNIQUES}
${this.ADJUSTMENTS}
${this.FALLOFF}
${this.FRAGMENT_END}
}`;
/** @inheritdoc */
static defaultUniforms = ({...super.defaultUniforms, colorEffect: [0.8, 0.1, 0.8]});
/** @inheritdoc */
get isRequired() {
return true;
}
}