Initial
This commit is contained in:
107
resources/app/client/pixi/webgl/shaders/vision/effects/wave.js
Normal file
107
resources/app/client/pixi/webgl/shaders/vision/effects/wave.js
Normal file
@@ -0,0 +1,107 @@
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user