{
    "QEN": {
        "description": "This node generates a water waves effect.",
        "fragmentCode": [
            "#define TAU 6.28318530718",
            "",
            "@main",
            "{",
            "    const float time = 1.0 + iTime * 0.6;",
            "    const vec2 uv = texCoord;",
            "    const vec2 p = mod(uv * TAU, TAU) + 10.0;",
            "    const float inten = 0.05;",
            "    vec2 ip = p;",
            "    float c = 0.0;",
            "    for (int n = 0; n < WATER_ITERATIONS; n++) {",
            "        float t = time * (1.0 / float(n + 0.4));",
            "        ip = p + vec2(cos(t - ip.x) + sin(t + ip.y), sin(t - ip.y) + cos(t + ip.x));",
            "        c += 1.0 / length(vec2(p.x / (sin(ip.x + t) / inten), p.y / (cos(ip.y + t) / inten)));",
            "    }",
            "    c /= float(WATER_ITERATIONS);",
            "    c = 1.2 - (c * c);",
            "    vec3 water = waterColor.rgb + vec3(pow(c, 4.0)) * (2.0 * waterWavesColor.rgb - 1.0);",
            "    fragColor = mix(fragColor, vec4(water, 1.0) * fragColor.a, waterColor.a);",
            "}"
        ],
        "name": "Water",
        "properties": [
            {
                "defaultValue": "4",
                "description": "How many water wave levels there are. More iterations means more resource usage. Meaningfull range is between 2 and 8.",
                "name": "WATER_ITERATIONS",
                "type": "define"
            },
            {
                "defaultValue": "0, 0.2, 0.4, 0.5",
                "description": "Color used for the water. Alpha channel defines the opacity of the effect.",
                "name": "waterColor",
                "type": "color"
            },
            {
                "defaultValue": "0.2, 0.8, 0.8, 1",
                "description": "Color used for the water waves.",
                "name": "waterWavesColor",
                "type": "color"
            }
        ],
        "version": 1
    }
}
