{
    "name": "Ripple Displacement",
    "description": "Wasser-Wellen mit Ripple-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\nvoid main() {\n    vec2 uv = gl_FragCoord.xy \/ u_resolution.xy;\n    float t = u_time;\n    vec2 p = uv * 10.0;\n    float wave = sin(p.x + t) * sin(p.y + t * 0.7);\n    wave += sin(p.x * 2.0 - t * 1.3) * sin(p.y * 2.0 + t) * 0.5;\n    wave += sin(p.x * 0.5 + t * 0.5) * sin(p.y * 0.5 - t * 0.3) * 0.3;\n    float ripple = 0.0;\n    if (u_mouseClick.z > 0.5) {\n        float d = length(uv - u_mouseNorm);\n        ripple = sin(d * 30.0 - t * 5.0) * exp(-d * 3.0) * 0.5;\n    }\n    float h = wave + ripple;\n    vec3 deep = vec3(0.0, 0.15, 0.25);\n    vec3 surf = vec3(0.0, 0.4, 0.5);\n    vec3 foam = vec3(0.7, 0.9, 1.0);\n    vec3 col = mix(deep, surf, smoothstep(-1.0, 1.0, h));\n    col = mix(col, foam, smoothstep(0.8, 1.2, h));\n    float spec = pow(max(sin(p.x * 0.5 + t) * sin(p.y * 0.5 + t * 0.7), 0.0), 8.0);\n    col += vec3(1.0, 0.95, 0.9) * spec * 0.3;\n    gl_FragColor = vec4(col, 1.0);\n}"
}