#version 120
varying vec2  vertex;
varying vec3  velocity;
varying float decay;

varying float explCenterDist;

float pi = 3.14159;

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);
}

float hash(float n)
{
    return fract(sin(n)*43758.5453);
}

void main()
{
    // normalize radius from 0..1
    vec2 vn = 2.0*vertex;
    float rn = length(vn);
    float angle = atan(vn.y, vn.x);
    float hs = 20.0;
    float removeCorners = 0.5 * (hash(fract(hs*vertex.x)) + hash(fract(hs*vertex.y)));
    if (rn+removeCorners > 1.0) {
        discard;
    }

    //float rf = 0.5-0.5*rn;
    float rf = 1.0;

    float d = decay/(1.0+max(0.0, 1.0-2.0*explCenterDist));
    float h = max(0.0, (1.0-d)/6.0) * rf;
    float v = max(0.0, (1.0-log(d)));
    float s = max(0.0, min(30.0 * sqrt(decay) * explCenterDist, 1.0));

    //v /= 1.0 + max(0.0, min(35.0*(decay-0.2), 1.0)) + 10.0 * explCenterDist;
    v /= 1.0 + 10.0 * explCenterDist;

    gl_FragColor = vec4(hsv2rgb(vec3(h, s, v)), v*0.2);

    //gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
    //gl_FragColor.rgb = vec3(0.5+0.5*(a/pi));
}
