{
    "QEN": {
        "description": "Adds RGB or unified noise to the source item.",
        "fragmentCode": [
            "@requires NoiseHelper",
            "@main",
            "{",
            "#if (NOISE_USE_RGB == 1)",
            "#if (NOISE_USE_RANDOM == 1)",
            "    uvec2 noiseCoord = uvec2(fragCoord) + HASH_BOX_SIZE * uint(iTime * 60);",
            "    vec3 noiseColor = _hash13(noiseCoord.x + HASH_BOX_SIZE * noiseCoord.y);",
            "#else",
            "    vec3 noiseColor = hash23(fragCoord);",
            "#endif // NOISE_USE_RANDOM",
            "#else",
            "#if (NOISE_USE_RANDOM == 1)",
            "    uvec2 noiseCoord = uvec2(fragCoord) + HASH_BOX_SIZE * uint(iTime * 60);",
            "    vec3 noiseColor = vec3(_hash21(noiseCoord));",
            "#else",
            "    vec3 noiseColor = vec3(hash21(fragCoord));",
            "#endif // NOISE_USE_RANDOM",
            "#endif // NOISE_USE_RGB",
            "",
            "    fragColor.rgb = mix(fragColor.rgb, noiseColor * fragColor.a, noiseAmount);",
            "}"
        ],
        "name": "Noise",
        "properties": [
            {
                "defaultValue": "1",
                "description": "When this is set to 1, the noise affects all RGB color channels separately. When this is set to 0, noise affects all channels similarly.",
                "name": "NOISE_USE_RGB",
                "type": "define"
            },
            {
                "defaultValue": "1",
                "description": "When set to 1, noise animates randomly. When set to 0, noise remains static.",
                "name": "NOISE_USE_RANDOM",
                "type": "define"
            },
            {
                "defaultValue": "0",
                "description": "The amount of noise applied to the source.",
                "maxValue": "1",
                "minValue": "0",
                "name": "noiseAmount",
                "type": "float"
            }
        ],
        "version": 1
    }
}
