// Ported from party-stage's "Classic Wave". The original picked a hue from a
// rolling HSV ramp; here the ramp indexes the palette instead, so the look
// generator can actually recolour it.

export const classicWave = {
    name: 'Classic Wave',
    family: 'flow',
    kind: 'fragment',

    params: {
        rings:     { type: 'float', range: [4, 40],    default: 18,  uniform: 'u_rings', bias: 'density' },
        spokes:    { type: 'int',   range: [0, 12],    default: 5,   uniform: 'u_spokes' },
        speed:     { type: 'float', range: [0.2, 2.5], default: 1.0, uniform: 'u_speed', bias: 'motion', rate: true },
        // colorRoll is capped low on purpose. palRamp() steps through all six
        // palette entries per unit of t, and the palette generator deliberately
        // spreads their luminance — so this multiplies into a whole-frame
        // brightness oscillation at six times its own rate. At the original
        // range of [0, 0.5] this scene measured 7 flashes per second at every
        // output resolution, well past the WCAG 2.3.1 ceiling of 3. Capped here,
        // the worst case is ~0.9 Hz. See engine/flash.js.
        colorRoll: { type: 'float', range: [0, 0.06],  default: 0.02, uniform: 'u_colorRoll', rate: true },
        softness:  { type: 'float', range: [0, 1],     default: 0.4, uniform: 'u_softness' },
        bloomCore: { type: 'float', range: [0, 1.5],   default: 0.5, uniform: 'u_bloomCore', bias: 'energy' },
        palette:   { type: 'palette', count: 5 },
    },

    reactive: {
        bloomCore: { feature: 'beat',    amount: 0.4, response: 'spike' },
        rings:     { feature: 'bandMid', amount: 0.12 },
    },

    shader: `
vec4 scene(vec2 uv, vec2 p) {
    float d = length(p);
    float angle = atan(p.y, p.x);
    float t = u_time * u_speed + u_seed;

    float wave = sin(d * u_rings - t * 2.0);
    float spoke = u_spokes > 0 ? sin(angle * float(u_spokes) + t) * u_beat : 0.0;

    float v = 0.5 + 0.5 * sin(wave + spoke);
    v = mix(v, smoothstep(0.2, 0.8, v), u_softness);

    vec3 col = palRamp(t * u_colorRoll + d * 0.25) * v;

    // Core glow, the part that reads as the "hit".
    col += pal(0) * (1.0 - smoothstep(0.0, 0.7, d)) * u_bloomCore * 0.6;

    // Keep the corners from clipping to flat colour.
    col *= 0.6 + 0.4 * (1.0 - smoothstep(0.8, 1.8, d));

    return vec4(col, 1.0);
}
`,
};

export default classicWave;
