Revision control

++ {
++ "QEN": {
++ "description": "The Glow effect adds soft glowing effect for the source content.",
++ "fragmentCode": [
++ "@requires BlurHelper",
++ "@main",
++ "{",
++ " vec4 glow = texture(iSource, texCoord) * blurWeight1[0];",
++ " glow += texture(iSourceBlur1, texCoord) * blurWeight1[1];",
++ "#if (BLUR_HELPER_MAX_LEVEL > 2)",
++ " glow += texture(iSourceBlur2, texCoord) * blurWeight1[2];",
++ "#endif",
++ "#if (BLUR_HELPER_MAX_LEVEL > 8)",
++ " glow += texture(iSourceBlur3, texCoord) * blurWeight1[3];",
++ "#endif",
++ "#if (BLUR_HELPER_MAX_LEVEL > 16)",
++ " glow += texture(iSourceBlur4, texCoord) * blurWeight2[0];",
++ "#endif",
++ "#if (BLUR_HELPER_MAX_LEVEL > 32)",
++ " glow += texture(iSourceBlur5, texCoord) * blurWeight2[1];",
++ "#endif",
++ "",
++ " glow = min(glow * glowBloom, vec4(glowMaxBrightness));",
++ " glow = mix(glow, glow.a * glowColor, glowColor.a);",
++ " ",
++ " // Blend in the Glow",
++ " if (glowBlendMode == 0) {",
++ " // Additive",
++ " fragColor += glow;",
++ " } else if (glowBlendMode == 1) {",
++ " // Screen",
++ " fragColor = clamp(fragColor, vec4(0.0), vec4(1.0));",
++ " fragColor = max((fragColor + glow) - (fragColor * glow), vec4(0.0));",
++ " } else if (glowBlendMode == 2) {",
++ " // Replace",
++ " fragColor = glow;",
++ " } else {",
++ " // Outer",
++ " fragColor = mix(glow, fragColor, fragColor.a);",
++ " }",
++ "}"
++ ],
++ "name": "Glow",
++ "properties": [
++ {
++ "defaultValue": "1",
++ "description": "Blending mode for the glow effect. 0 = Additive, 1 = Screen, 2 = Replace, 3 = Outer.",
++ "maxValue": "3",
++ "minValue": "0",
++ "name": "glowBlendMode",
++ "type": "int"
++ },
++ {
++ "defaultValue": "1",
++ "description": "This value defines the softness of the glow. Values are between 0..1.",
++ "maxValue": "1",
++ "minValue": "0",
++ "name": "glowBlurAmount",
++ "type": "float"
++ },
++ {
++ "defaultValue": "1",
++ "description": "This value defines the bloom strength of the glow. Suitable values are between 0..2.",
++ "maxValue": "2",
++ "minValue": "0",
++ "name": "glowBloom",
++ "type": "float"
++ },
++ {
++ "defaultValue": "1",
++ "description": "Sets the maximum brightness of the glow.",
++ "maxValue": "1",
++ "minValue": "0",
++ "name": "glowMaxBrightness",
++ "type": "float"
++ },
++ {
++ "defaultValue": "1, 1, 1, 0.5",
++ "description": "Color of the glow. Alpha chanel defines how much color is applied vs. using the colors of the source item. The default value is white with 0.5 alpha.",
++ "name": "glowColor",
++ "type": "color"
++ }
++ ],
++ "version": 1,
++ "vertexCode": [
++ "out vec4 blurWeight1;",
++ "out vec2 blurWeight2;",
++ "",
++ "float blurWeight(float v) {",
++ " return max(0.0, min(1.0, 1.0 - v * 2.0));",
++ "}",
++ "",
++ "@main",
++ "{",
++ " float blurLod = sqrt(glowBlurAmount * (BLUR_HELPER_MAX_LEVEL / 64.0)) * 1.2 - 0.2;",
++ " float bw1 = blurWeight(abs(blurLod - 0.1));",
++ " float bw2 = blurWeight(abs(blurLod - 0.3));",
++ " float bw3 = blurWeight(abs(blurLod - 0.5));",
++ " float bw4 = blurWeight(abs(blurLod - 0.7));",
++ " float bw5 = blurWeight(abs(blurLod - 0.9));",
++ " float bw6 = blurWeight(abs(blurLod - 1.1));",
++ "",
++ " float bsum = bw1 + bw2 + bw3 + bw4 + bw5 + bw6;",
++ " blurWeight1 = vec4(bw1 / bsum, bw2 / bsum, bw3 / bsum, bw4 / bsum);",
++ " blurWeight2 = vec2(bw5 / bsum, bw6 / bsum);",
++ "}"
++ ]
++ }
++ }