{
    "name": "Electric Plasma",
    "description": "Elektrisches Plasma mit Audio-Reaktivitaet",
    "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_audioLow;\nuniform float u_audioMid;\nuniform float u_audioHigh;\n\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }\nfloat noise(vec2 p) {\n    vec2 i = floor(p), f = fract(p);\n    f = f*f*(3.0-2.0*f);\n    return mix(mix(hash(i), hash(i+vec2(1.0,0.0)), f.x),\n               mix(hash(i+vec2(0.0,1.0)), hash(i+vec2(1.0,1.0)), f.x), f.y);\n}\n\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    float t = u_time * 0.5;\n    vec2 p = uv * 4.0;\n    float n1 = noise(p + vec2(t, t*0.7));\n    float n2 = noise(p * 2.0 - vec2(t*0.8, t));\n    float n3 = noise(p * 4.0 + vec2(t*0.3, -t*0.5));\n    float plasma = n1 + n2 * 0.5 + n3 * 0.25;\n    plasma += u_audioLow * 0.3 + u_audioMid * 0.2;\n    vec3 col = vec3(0.0);\n    col.r = smoothstep(0.4, 0.6, plasma) + u_audioHigh * 0.5;\n    col.g = smoothstep(0.3, 0.5, plasma) * 0.8;\n    col.b = smoothstep(0.5, 0.7, plasma) * 0.6 + u_audioLow * 0.4;\n    col += vec3(0.1, 0.3, 0.8) * pow(plasma, 4.0);\n    float mouseDist = length(uv - u_mouseNorm);\n    col += vec3(0.5, 0.8, 1.0) * smoothstep(0.3, 0.0, mouseDist) * 0.4;\n    gl_FragColor = vec4(col, 1.0);\n}"
}