#define PI 3.14159265359

float a = 1.5;
float b = 2.0;
float m = 1.0;
float n = 2.0;
float p1 = 1.0;
float p2 = 1.0;
float p3 = -1.0;
float p4 = -1.0;

// A function to generate Chladni patterns :)
float Chladni(float a, float b, float m, float n, vec4 p, vec2 z, float t) {
  float v1 = a * sin(PI * n * z.x + p.x * t ) * sin(PI * m * z.y + p.y * t);
  float v2 = b * sin(PI * m * z.x + p.z * t) * sin(PI * n * z.y + p.w * t);
  return v1 + v2;
} 

// A mapping function from p5js
float map(float value, float min1, float max1, float min2, float max2) {
  return min2 + (value - min1) * (max2 - min2) / (max1 - min1);
}

 // Convert from Hue,Saturation/Value to RGB
 // http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl
 vec3 hsv2rgb(vec3 c) {
   vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
   vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
   return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
 }

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = ( fragCoord -.5* iResolution.xy ) / iResolution.y;
    
    vec4 po = vec4(p1, p2, p3, p4);
    float col = Chladni(a, b, m, n, po, uv, float(iTime) * 0.3);
    
    float c1 = map(col, -1.0, 1.0, 0.0, 0.9);
    
    vec3 hsv = vec3(c1, 1.0, 0.9);
    //vec3 hsv = vec3(_arg, 1.0, 1.0);
    vec3 rgb = hsv2rgb( hsv );

    // Time varying pixel color
    //vec3 col = 0.5 + 0.5*cos(iTime+uv.xyx+vec3(0,2,4));

    // Output to screen
    fragColor = vec4(rgb,1.0);
}
