{
    "name": "Julia Set",
    "description": "Animierte Julia-Menge mit Maus-Steuerung",
    "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 float u_zoom;\n\nvec2 csqr(vec2 z) { return vec2(z.x*z.x - z.y*z.y, 2.0*z.x*z.y); }\n\nvoid main() {\n    vec2 uv = (gl_FragCoord.xy - 0.5*u_resolution.xy) \/ u_resolution.y;\n    float zoom = 1.5 \/ u_zoom;\n    vec2 z = uv * zoom;\n    vec2 c = vec2(-0.8 + 0.2*cos(u_time*0.3), 0.156 + 0.2*sin(u_time*0.3));\n    c += (u_mouseNorm - 0.5) * 0.4;\n    float iter = 0.0;\n    for (int i = 0; i < 100; i++) {\n        z = csqr(z) + c;\n        if (dot(z, z) > 4.0) break;\n        iter++;\n    }\n    float col = iter \/ 100.0;\n    vec3 color = vec3(0.5 + 0.5*cos(6.2831*col + vec3(0.0, 0.5, 1.0)));\n    color = mix(vec3(0.02, 0.0, 0.05), color, smoothstep(0.0, 0.1, col));\n    gl_FragColor = vec4(color, 1.0);\n}"
}