From 28d6531a87192376be86f7e990368a117ebd53de Mon Sep 17 00:00:00 2001 From: Simon Schneegans Date: Mon, 23 Jan 2023 17:15:47 +0100 Subject: [PATCH] :tada: Add support for alpha channel in color of TV Effect, TV Glitch, and Glitch --- docs/changelog.md | 3 ++- kwin/glitch/onSettingsChanged.js | 2 +- kwin/tv-glitch/onSettingsChanged.js | 2 +- kwin/tv/onSettingsChanged.js | 2 +- resources/shaders/glitch.frag | 12 ++++++------ resources/shaders/tv-glitch.frag | 15 ++++++++------- resources/shaders/tv.frag | 5 +++-- resources/ui/adw/Glitch.ui | 2 +- resources/ui/adw/TVEffect.ui | 2 +- resources/ui/adw/TVGlitch.ui | 2 +- resources/ui/gtk3/Glitch.ui | 2 +- resources/ui/gtk3/TVEffect.ui | 2 +- resources/ui/gtk3/TVGlitch.ui | 2 +- resources/ui/gtk4/Glitch.ui | 2 +- resources/ui/gtk4/TVEffect.ui | 2 +- resources/ui/gtk4/TVGlitch.ui | 2 +- src/Glitch.js | 2 +- src/TVEffect.js | 4 ++-- src/TVGlitch.js | 2 +- 19 files changed, 35 insertions(+), 32 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 0e4dccb..2d6c333 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -11,11 +11,12 @@ SPDX-License-Identifier: CC-BY-4.0 #### New Features -* **New Effect: TV-Glitch.** This effect combines the Glitch and the TV Effect into one. Credits go to Kurt Wilson (https://github.com/Kurtoid) for this idea! +* **New Effect: TV-Glitch.** This effect combines the Glitch and the TV Effect into one. Credits go to [Kurt Wilson](https://github.com/Kurtoid) for this idea! #### Other Enhancements * On KDE, the effect configuration dialogs can now be translated. The translations for GNOME are re-used, so we already have many translations! This requires at least KWin 5.27 to be working. +* The effect colors for the Glitch and TV Effect now support an alpha channel. With this you can control how much color gets mixed into the window color. ## [Burn My Windows 25](https://github.com/schneegans/Burn-My-Windows/releases/tag/v25) diff --git a/kwin/glitch/onSettingsChanged.js b/kwin/glitch/onSettingsChanged.js index 03c946f..c3ef467 100644 --- a/kwin/glitch/onSettingsChanged.js +++ b/kwin/glitch/onSettingsChanged.js @@ -9,4 +9,4 @@ effect.setUniform(this.shader, 'uDuration', this.duration * 0.001); effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0)); effect.setUniform(this.shader, 'uStrength', effect.readConfig('Strength', 1.0)); effect.setUniform(this.shader, 'uSpeed', effect.readConfig('Speed', 1.0)); -effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color')); \ No newline at end of file +effect.setUniform(this.shader, 'uColor', this.readRGBAConfig('Color')); \ No newline at end of file diff --git a/kwin/tv-glitch/onSettingsChanged.js b/kwin/tv-glitch/onSettingsChanged.js index 03c946f..c3ef467 100644 --- a/kwin/tv-glitch/onSettingsChanged.js +++ b/kwin/tv-glitch/onSettingsChanged.js @@ -9,4 +9,4 @@ effect.setUniform(this.shader, 'uDuration', this.duration * 0.001); effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0)); effect.setUniform(this.shader, 'uStrength', effect.readConfig('Strength', 1.0)); effect.setUniform(this.shader, 'uSpeed', effect.readConfig('Speed', 1.0)); -effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color')); \ No newline at end of file +effect.setUniform(this.shader, 'uColor', this.readRGBAConfig('Color')); \ No newline at end of file diff --git a/kwin/tv/onSettingsChanged.js b/kwin/tv/onSettingsChanged.js index 1623774..d98793c 100644 --- a/kwin/tv/onSettingsChanged.js +++ b/kwin/tv/onSettingsChanged.js @@ -5,4 +5,4 @@ // The code below is called whenever the user changes something in the configuration of // the effect. -effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color')); \ No newline at end of file +effect.setUniform(this.shader, 'uColor', this.readRGBAConfig('Color')); \ No newline at end of file diff --git a/resources/shaders/glitch.frag b/resources/shaders/glitch.frag index 105ee44..0bf2421 100644 --- a/resources/shaders/glitch.frag +++ b/resources/shaders/glitch.frag @@ -14,7 +14,7 @@ // The content from common.glsl is automatically prepended to each shader effect. -uniform vec3 uColor; +uniform vec4 uColor; uniform float uSeed; uniform float uScale; uniform float uStrength; @@ -37,18 +37,18 @@ void main() { vec4 oColor = getInputColor(vec2(xPos, iTexCoord.y)); // Mix in some random interference lines. - vec3 interference = uColor * hash12(vec2(yPos * time)); + vec3 interference = uColor.rgb * hash12(vec2(yPos * time)); float interferenceStrength = noise * min(strength, 1.0); - oColor.rgb = mix(oColor.rgb, interference, interferenceStrength); + oColor.rgb = mix(oColor.rgb, interference, uColor.a * interferenceStrength); // Mix in some grainy noise. - vec3 grain = uColor * simplex2D(uSize * iTexCoord + vec2(time * 100.0)); + vec3 grain = uColor.rgb * simplex2D(uSize * iTexCoord + vec2(time * 100.0)); float grainStrength = 0.2 * min(strength, 1.0); - oColor.rgb = mix(oColor.rgb, grain, grainStrength); + oColor.rgb = mix(oColor.rgb, grain, uColor.a * grainStrength); // Add a subtle line pattern every 4 pixels. if (floor(mod(yPos * 0.25, 2.0)) == 0.0) { - oColor.rgb = mix(uColor, oColor.rgb, 1.0 - (0.15 * noise)); + oColor.rgb = mix(oColor.rgb, uColor.rgb, uColor.a * (0.15 * noise)); } // Shift green/blue channels. diff --git a/resources/shaders/tv-glitch.frag b/resources/shaders/tv-glitch.frag index 049e130..8d861f3 100644 --- a/resources/shaders/tv-glitch.frag +++ b/resources/shaders/tv-glitch.frag @@ -14,7 +14,7 @@ // The content from common.glsl is automatically prepended to each shader effect. -uniform vec3 uColor; +uniform vec4 uColor; uniform float uSeed; uniform float uScale; uniform float uStrength; @@ -57,18 +57,18 @@ void main() { vec4 oColor = getInputColor(vec2(xPos, coords.y)); // Mix in some random interference lines. - vec3 interference = uColor * hash12(vec2(yPos * time)); + vec3 interference = uColor.rgb * hash12(vec2(yPos * time)); float interferenceStrength = noise * min(strength, 1.0); - oColor.rgb = mix(oColor.rgb, interference, interferenceStrength); + oColor.rgb = mix(oColor.rgb, interference, uColor.a * interferenceStrength); // Mix in some grainy noise. - vec3 grain = uColor * simplex2D(uSize * coords + vec2(time * 100.0)); + vec3 grain = uColor.rgb * simplex2D(uSize * coords + vec2(time * 100.0)); float grainStrength = 0.2 * min(strength, 1.0); - oColor.rgb = mix(oColor.rgb, grain, grainStrength); + oColor.rgb = mix(oColor.rgb, grain, uColor.a * grainStrength); // Add a subtle line pattern every 4 pixels. if (floor(mod(yPos * 0.25, 2.0)) == 0.0) { - oColor.rgb = mix(uColor, oColor.rgb, 1.0 - (0.15 * noise)); + oColor.rgb = mix(oColor.rgb, uColor.rgb, uColor.a * (0.15 * noise)); } // Shift green/blue channels. @@ -101,7 +101,8 @@ void main() { float ffMask = 1.0 - smoothstep(0.0, 1.0, ffProg); // Assemble the final color value. - oColor.rgb = mix(oColor.rgb, uColor * oColor.a, smoothstep(0.0, 1.0, tvProgress)); + oColor.rgb = + mix(oColor.rgb, uColor.rgb * oColor.a, uColor.a * smoothstep(0.0, 1.0, tvProgress)); float mask = tbMask * lrMask * ffMask; oColor.a *= mask; diff --git a/resources/shaders/tv.frag b/resources/shaders/tv.frag index cf81c39..5b8f72b 100644 --- a/resources/shaders/tv.frag +++ b/resources/shaders/tv.frag @@ -14,7 +14,7 @@ // The content from common.glsl is automatically prepended to each shader effect. -uniform vec3 uColor; +uniform vec4 uColor; const float BLUR_WIDTH = 0.01; // Width of the gradients. const float TB_TIME = 0.7; // Relative time for the top/bottom animation. @@ -56,7 +56,8 @@ void main() { float mask = tbMask * lrMask * ffMask; vec4 oColor = getInputColor(coords); - oColor.rgb = mix(oColor.rgb, uColor * oColor.a, smoothstep(0.0, 1.0, prog)); + oColor.rgb = + mix(oColor.rgb, uColor.rgb * oColor.a, uColor.a * smoothstep(0.0, 1.0, prog)); oColor.a *= mask; // These are pretty useful for understanding how this works. diff --git a/resources/ui/adw/Glitch.ui b/resources/ui/adw/Glitch.ui index 23775d2..f2cfe78 100644 --- a/resources/ui/adw/Glitch.ui +++ b/resources/ui/adw/Glitch.ui @@ -149,7 +149,7 @@ SPDX-License-Identifier: GPL-3.0-or-later center 250 - 0 + 1 1 diff --git a/resources/ui/adw/TVEffect.ui b/resources/ui/adw/TVEffect.ui index fc3d1e8..4992734 100644 --- a/resources/ui/adw/TVEffect.ui +++ b/resources/ui/adw/TVEffect.ui @@ -48,7 +48,7 @@ SPDX-License-Identifier: GPL-3.0-or-later tv-effect-color - 0 + 1 1 250 center diff --git a/resources/ui/adw/TVGlitch.ui b/resources/ui/adw/TVGlitch.ui index 84539a3..d1b28d2 100644 --- a/resources/ui/adw/TVGlitch.ui +++ b/resources/ui/adw/TVGlitch.ui @@ -149,7 +149,7 @@ SPDX-License-Identifier: GPL-3.0-or-later center 250 - 0 + 1 1 diff --git a/resources/ui/gtk3/Glitch.ui b/resources/ui/gtk3/Glitch.ui index 79fb5b3..ab45f1b 100644 --- a/resources/ui/gtk3/Glitch.ui +++ b/resources/ui/gtk3/Glitch.ui @@ -263,7 +263,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/resources/ui/gtk3/TVEffect.ui b/resources/ui/gtk3/TVEffect.ui index 25f91f7..7b8902a 100644 --- a/resources/ui/gtk3/TVEffect.ui +++ b/resources/ui/gtk3/TVEffect.ui @@ -95,7 +95,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/resources/ui/gtk3/TVGlitch.ui b/resources/ui/gtk3/TVGlitch.ui index 122177f..144d48e 100644 --- a/resources/ui/gtk3/TVGlitch.ui +++ b/resources/ui/gtk3/TVGlitch.ui @@ -263,7 +263,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/resources/ui/gtk4/Glitch.ui b/resources/ui/gtk4/Glitch.ui index ade6471..ae0553e 100644 --- a/resources/ui/gtk4/Glitch.ui +++ b/resources/ui/gtk4/Glitch.ui @@ -220,7 +220,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/resources/ui/gtk4/TVEffect.ui b/resources/ui/gtk4/TVEffect.ui index 48babef..6e0b7f3 100644 --- a/resources/ui/gtk4/TVEffect.ui +++ b/resources/ui/gtk4/TVEffect.ui @@ -82,7 +82,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/resources/ui/gtk4/TVGlitch.ui b/resources/ui/gtk4/TVGlitch.ui index f10fa9c..dc12bf8 100644 --- a/resources/ui/gtk4/TVGlitch.ui +++ b/resources/ui/gtk4/TVGlitch.ui @@ -220,7 +220,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 + 1 1 diff --git a/src/Glitch.js b/src/Glitch.js index f9d8878..044c71a 100644 --- a/src/Glitch.js +++ b/src/Glitch.js @@ -59,7 +59,7 @@ var Glitch = class { // clang-format off shader.set_uniform_float(shader._uSeed, 1, [testMode ? 0 : Math.random()]); - shader.set_uniform_float(shader._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); + shader.set_uniform_float(shader._uColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); shader.set_uniform_float(shader._uScale, 1, [settings.get_double('glitch-scale')]); shader.set_uniform_float(shader._uStrength, 1, [settings.get_double('glitch-strength')]); shader.set_uniform_float(shader._uSpeed, 1, [settings.get_double('glitch-speed')]); diff --git a/src/TVEffect.js b/src/TVEffect.js index 2dabded..b7097f7 100644 --- a/src/TVEffect.js +++ b/src/TVEffect.js @@ -51,8 +51,8 @@ var TVEffect = class { // Write all uniform values at the start of each animation. shader.connect('begin-animation', (shader, settings) => { const c = Clutter.Color.from_string(settings.get_string('tv-effect-color'))[1]; - shader.set_uniform_float(shader._uColor, 3, - [c.red / 255, c.green / 255, c.blue / 255]); + shader.set_uniform_float( + shader._uColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); }); }); } diff --git a/src/TVGlitch.js b/src/TVGlitch.js index 8510535..4faebf9 100644 --- a/src/TVGlitch.js +++ b/src/TVGlitch.js @@ -60,7 +60,7 @@ var TVGlitch = class { // clang-format off shader.set_uniform_float(shader._uSeed, 1, [testMode ? 0 : Math.random()]); - shader.set_uniform_float(shader._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); + shader.set_uniform_float(shader._uColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); shader.set_uniform_float(shader._uScale, 1, [settings.get_double('tv-glitch-scale')]); shader.set_uniform_float(shader._uStrength, 1, [settings.get_double('tv-glitch-strength')]); shader.set_uniform_float(shader._uSpeed, 1, [settings.get_double('tv-glitch-speed')]);