{
    "name": "Voronoi Cells",
    "description": "Animiertes Voronoi-Diagramm mit Metaball-Effekt",
    "vertex_shader": "attribute vec2 a_position;\nvoid main() {\n    gl_Position = vec4(a_position, 0.0, 1.0);\n}",
    "fragment_shader": "precision mediump float;\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform vec2 u_mouseNorm;\nuniform vec4 u_mouseClick;\n\nvec2 hash2(vec2 p) {\n    return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453);\n}\n\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    float t = u_time * 0.2;\n    vec2 mouse = u_mouseNorm;\n    vec3 col = vec3(0.05);\n    float m_dist = 1.0;\n    vec2 m_point = vec2(0.0);\n    for (float j = 0.0; j < 3.0; j++) {\n        for (float i = 0.0; i < 3.0; i++) {\n            vec2 g = vec2(i, j);\n            vec2 o = hash2(g + floor(uv * 6.0) + j * 50.0);\n            o = 0.5 + 0.4 * sin(t + 6.2831 * o);\n            vec2 r = g + o - fract(uv * 6.0);\n            float d = dot(r, r);\n            if (d < m_dist) {\n                m_dist = d;\n                m_point = o;\n            }\n        }\n    }\n    col = vec3(0.5 + 0.5*cos(6.2831*m_point.x + vec3(0.0, 1.0, 2.0)));\n    col *= 1.0 - 0.5 * m_dist;\n    float mouseDist = length(uv - mouse);\n    col += vec3(1.0, 0.3, 0.1) * smoothstep(0.15, 0.0, mouseDist) * u_mouseClick.z;\n    gl_FragColor = vec4(col, 1.0);\n}"
}