#version 300 es
precision highp float;
#define PI 3.1415926535897932384626433832795
uniform vec2 u_resolution;
uniform float u_time;
uniform float u_amplitude;
uniform float u_wavelength;
uniform float u_speed;
// uniform float u_midline;
out vec4 outColor;
const float TWO_PI = 2. * PI;
const vec3 color_1 = vec3(0.97, 0.83, 0.21);
const vec3 color_2 = vec3(0.93, 0.11, 0.57);
float noise(float x, float time) {
// Set up wave params
float L = TWO_PI * u_wavelength; // wavelength
float A = u_amplitude; // amplitude
float S = u_speed * TWO_PI; // period/speed
// Create a stack of sin waves
float sum = 0.;
sum += sin(x * (L / 1.000) + time * (0.90 * S)) * (A * 0.64);
sum += sin(x * (L / 1.153) + time * (1.15 * S)) * (A * 0.40);
sum += sin(x * (L / 1.622) + time * (-0.75 * S)) * (A * 0.48);
sum += sin(x * (L / 1.871) + time * (0.65 * S)) * (A * 0.43);
sum += sin(x * (L / 2.013) + time * (-1.05 * S)) * (A * 0.32);
return sum;
}
float wave_alpha(float x, float midline, float time) {
float sum = noise(x, time);
float dist = midline + sum;
float alpha = (sign(dist) + 1.0) / 2.0;
return alpha;
}
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution.xy;
uv.y = 1. - uv.y;
float lp_1 = 0.;
float hp_1 = 0.625;
vec3 gradient_1 = mix(color_1, color_2, max(min((uv.y - lp_1) / (hp_1 - lp_1), 1.0), 0.0));
float lp_2 = 0.125;
float hp_2 = 0.875;
vec3 gradient_2 = mix(color_1, color_2, max(min((uv.y - lp_2) / (hp_2 - lp_2), 1.0), 0.0));
float lp_3 = 0.375;
float hp_3 = 1.;
vec3 gradient_3 = mix(color_1, color_2, max(min((uv.y - lp_3) / (hp_3 - lp_3), 1.0), 0.0));
// float blur = mix(0.0, (210. - u_blur), (1. - uv.x));
// float alpha = clamp(dist, 0., 1.);
float alpha_1 = wave_alpha(uv.x, uv.y - 0.3, u_time * 0.5);
float alpha_2 = wave_alpha(uv.x, uv.y - 0.6, u_time + PI * 1.333);
vec3 color = gradient_1;
color = mix(color, gradient_2, alpha_1);
color = mix(color, gradient_3, alpha_2);
outColor = vec4(color, 1.0);
}