#version 450

// Name: Test
// Author: JailDesigner
//
// Vulkan port of test.gl.glsl. Bindings follow the SDL3 GPU convention:
//   set=3, binding=0 — fragment uniform buffer (anonymous block: members
//   are accessible directly as iTime / iResolution, like Shadertoy).

layout(location = 0) in  vec2 vUV;
layout(location = 0) out vec4 FragColor;

layout(set = 3, binding = 0) uniform ShadertoyUBO {
    float iTime;
    vec2  iResolution;
};

vec3 palette(float t) {
    vec3 a = vec3(1.0, 0.5, 0.5);
    vec3 b = vec3(1.0, 0.5, 0.5);
    vec3 c = vec3(1.0, 1.0, 1.0);
    vec3 d = vec3(0.263, 0.416, 0.557);
    return a + b * cos(6.28318 * (c * t * d));
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = (fragCoord * 2.0 - iResolution) / iResolution.y;
    float d = length(uv);
    vec3 col = palette(d);
    d = sin(d * 8.0 + iTime) / 8.0;
    d = abs(d);
    d = 0.02 / d;
    col *= d;
    fragColor = vec4(col, 1.0);
}

void main() {
    vec2 fragCoordPixels = vUV * iResolution;
    vec4 outColor;
    mainImage(outColor, fragCoordPixels);
    FragColor = outColor;
}
