From 2eca2c737407d859827d1e7ba9ad2e6344ce7ca1 Mon Sep 17 00:00:00 2001 From: Simon Schneegans Date: Wed, 11 May 2022 05:44:36 +0200 Subject: [PATCH] :truck: Move uForOpening to standard uniforms --- docs/changelog.md | 4 ++++ docs/how-to-create-new-effects.md | 1 + extension.js | 2 ++ src/Apparition.js | 3 --- src/BrokenGlass.js | 3 --- src/EnergizeA.js | 11 ++++------- src/EnergizeB.js | 11 ++++------- src/Fire.js | 3 --- src/Hexagon.js | 3 --- src/Matrix.js | 3 --- src/SnapOfDisintegration.js | 9 +++------ src/TRexAttack.js | 3 --- src/TVEffect.js | 10 ++-------- src/Wisps.js | 15 ++++++--------- src/shaderSnippets.js | 2 ++ 15 files changed, 28 insertions(+), 55 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 364c815..c97f699 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,10 @@ **Release Date:** TBD +#### Enhancements + +* The standard uniforms of all shaders have been updated: The window size is now passed as a `vec2` and there is a new `bool uForOpening` which is set to `true` if a window-open animation is ongoing, to `false` otherwise. + #### Bug Fixes * **Fixed a major memory leak**. Now, shaders are not re-created anymore whenever a window is opened or closed. Instead, previously created shaders are re-used as often as possible. This requires that all settings are set as uniform values (previously they were injected into the shader source) which in turn requires that `Shell.GLSLEffect` is used instead of `Clutter.ShaderEffect`. This change also requires that all shaders now work with straight instead of premultiplied alpha. Anyways, a lot needed to be refactored for this fix and I hope that it did not bring too many visual changes. diff --git a/docs/how-to-create-new-effects.md b/docs/how-to-create-new-effects.md index 36c6ad6..0194691 100644 --- a/docs/how-to-create-new-effects.md +++ b/docs/how-to-create-new-effects.md @@ -234,6 +234,7 @@ if (utils.isInShellProcess()) { const declarations = ` // The code below injects some standard uniforms which will be updated during the // animation. This includes: + // bool uForOpening: True if a window-open animation is ongoing, false otherwise. // sampler2D uTexture: Contains the texture of the window. // float uProgress: A value which transitions from 0 to 1 during the entire animation. // float uTime: A steadily increasing value in seconds. diff --git a/extension.js b/extension.js index fa31c9e..19dbac7 100644 --- a/extension.js +++ b/extension.js @@ -487,6 +487,8 @@ class Extension { // Update uniforms at each frame. transition.connect('new-frame', (t) => { + shader.set_uniform_float(shader.get_uniform_location('uForOpening'), 1, + [forOpening]); shader.set_uniform_float(shader.get_uniform_location('uProgress'), 1, [testMode ? 0.5 : t.get_progress()]); shader.set_uniform_float( diff --git a/src/Apparition.js b/src/Apparition.js index e7c31c4..df1a844 100644 --- a/src/Apparition.js +++ b/src/Apparition.js @@ -146,7 +146,6 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); this._uSeed = this.get_uniform_location('uSeed'); this._uShake = this.get_uniform_location('uShake'); this._uTwirl = this.get_uniform_location('uTwirl'); @@ -161,7 +160,6 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); this.set_uniform_float(this._uShake, 1, [settings.get_double('apparition-shake-intensity')]); this.set_uniform_float(this._uTwirl, 1, [settings.get_double('apparition-twirl-intensity')]); @@ -183,7 +181,6 @@ if (utils.isInShellProcess()) { // Inject some common shader snippets. ${shaderSnippets.standardUniforms()} - uniform bool uForOpening; uniform vec2 uSeed; uniform float uShake; uniform float uTwirl; diff --git a/src/BrokenGlass.js b/src/BrokenGlass.js index 5f17be9..be7b770 100644 --- a/src/BrokenGlass.js +++ b/src/BrokenGlass.js @@ -167,7 +167,6 @@ if (utils.isInShellProcess()) { shardData.width, shardData.height, shardData.rowstride); } - this._uForOpening = this.get_uniform_location('uForOpening'); this._uShardTexture = this.get_uniform_location('uShardTexture'); this._uSeed = this.get_uniform_location('uSeed'); this._uEpicenter = this.get_uniform_location('uEpicenter'); @@ -198,7 +197,6 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); this.set_uniform_float(this._uEpicenter, 2, [epicenterX, epicenterY]); this.set_uniform_float(this._uShardScale, 1, [settings.get_double('broken-glass-scale')]); @@ -220,7 +218,6 @@ if (utils.isInShellProcess()) { // Inject some common shader snippets. ${shaderSnippets.standardUniforms()} - uniform bool uForOpening; uniform sampler2D uShardTexture; uniform vec2 uSeed; uniform vec2 uEpicenter; diff --git a/src/EnergizeA.js b/src/EnergizeA.js index 06fd74f..8cfc328 100644 --- a/src/EnergizeA.js +++ b/src/EnergizeA.js @@ -140,9 +140,8 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); - this._uColor = this.get_uniform_location('uColor'); - this._uScale = this.get_uniform_location('uScale'); + this._uColor = this.get_uniform_location('uColor'); + this._uScale = this.get_uniform_location('uScale'); } // This is called each time the effect is used. This can be used to retrieve the @@ -151,9 +150,8 @@ if (utils.isInShellProcess()) { const c = Clutter.Color.from_string(settings.get_string('energize-a-color'))[1]; // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); - this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); - this.set_uniform_float(this._uScale, 1, [settings.get_double('energize-a-scale')]); + this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); + this.set_uniform_float(this._uScale, 1, [settings.get_double('energize-a-scale')]); // clang-format on } @@ -172,7 +170,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.noise()} ${shaderSnippets.edgeMask()} - uniform bool uForOpening; uniform vec3 uColor; uniform float uScale; diff --git a/src/EnergizeB.js b/src/EnergizeB.js index 039cf23..6a4486a 100644 --- a/src/EnergizeB.js +++ b/src/EnergizeB.js @@ -140,9 +140,8 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); - this._uColor = this.get_uniform_location('uColor'); - this._uScale = this.get_uniform_location('uScale'); + this._uColor = this.get_uniform_location('uColor'); + this._uScale = this.get_uniform_location('uScale'); } // This is called each time the effect is used. This can be used to retrieve the @@ -151,9 +150,8 @@ if (utils.isInShellProcess()) { const c = Clutter.Color.from_string(settings.get_string('energize-b-color'))[1]; // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); - this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); - this.set_uniform_float(this._uScale, 1, [settings.get_double('energize-b-scale')]); + this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); + this.set_uniform_float(this._uScale, 1, [settings.get_double('energize-b-scale')]); // clang-format on } @@ -172,7 +170,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.noise()} ${shaderSnippets.edgeMask()} - uniform bool uForOpening; uniform vec3 uColor; uniform float uScale; diff --git a/src/Fire.js b/src/Fire.js index 4eb7b0f..93a65ba 100644 --- a/src/Fire.js +++ b/src/Fire.js @@ -259,7 +259,6 @@ if (utils.isInShellProcess()) { this.get_uniform_location('uGradient5'), ]; - this._uForOpening = this.get_uniform_location('uForOpening'); this._u3DNoise = this.get_uniform_location('u3DNoise'); this._uScale = this.get_uniform_location('uScale'); this._uMovementSpeed = this.get_uniform_location('uMovementSpeed'); @@ -277,7 +276,6 @@ if (utils.isInShellProcess()) { } // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._u3DNoise, 1, [settings.get_boolean('flame-3d-noise')]); this.set_uniform_float(this._uScale, 1, [settings.get_double('flame-scale')]); this.set_uniform_float(this._uMovementSpeed, 1, [settings.get_double('flame-movement-speed')]); @@ -301,7 +299,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.edgeMask()} ${shaderSnippets.compositing()} - uniform bool uForOpening; uniform bool u3DNoise; uniform float uScale; uniform float uMovementSpeed; diff --git a/src/Hexagon.js b/src/Hexagon.js index 9be51dd..78f6fa1 100644 --- a/src/Hexagon.js +++ b/src/Hexagon.js @@ -144,7 +144,6 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); this._uAdditiveBlending = this.get_uniform_location('uAdditiveBlending'); this._uSeed = this.get_uniform_location('uSeed'); this._uScale = this.get_uniform_location('uScale'); @@ -166,7 +165,6 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._uAdditiveBlending, 1, [settings.get_boolean('hexagon-additive-blending')]); this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); this.set_uniform_float(this._uScale, 1, [settings.get_double('hexagon-scale')]); @@ -193,7 +191,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.standardUniforms()} ${shaderSnippets.noise()} - uniform bool uForOpening; uniform bool uAdditiveBlending; uniform vec2 uSeed; uniform float uScale; diff --git a/src/Matrix.js b/src/Matrix.js index a3770b4..7b5161d 100644 --- a/src/Matrix.js +++ b/src/Matrix.js @@ -163,7 +163,6 @@ if (utils.isInShellProcess()) { fontData.width, fontData.height, fontData.rowstride); } - this._uForOpening = this.get_uniform_location('uForOpening'); this._uFontTexture = this.get_uniform_location('uFontTexture'); this._uTrailColor = this.get_uniform_location('uTrailColor'); this._uTipColor = this.get_uniform_location('uTipColor'); @@ -179,7 +178,6 @@ if (utils.isInShellProcess()) { const c2 = Clutter.Color.from_string(settings.get_string('matrix-tip-color'))[1]; // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._uTrailColor, 3, [c1.red / 255, c1.green / 255, c1.blue / 255]); this.set_uniform_float(this._uTipColor, 3, [c2.red / 255, c2.green / 255, c2.blue / 255]); this.set_uniform_float(this._uLetterSize, 1, [settings.get_int('matrix-scale')]); @@ -206,7 +204,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.edgeMask()} ${shaderSnippets.compositing()} - uniform bool uForOpening; uniform sampler2D uFontTexture; uniform vec3 uTrailColor; uniform vec3 uTipColor; diff --git a/src/SnapOfDisintegration.js b/src/SnapOfDisintegration.js index 4e9a819..983b0ed 100644 --- a/src/SnapOfDisintegration.js +++ b/src/SnapOfDisintegration.js @@ -159,7 +159,6 @@ if (utils.isInShellProcess()) { dustData.width, dustData.height, dustData.rowstride); } - this._uForOpening = this.get_uniform_location('uForOpening'); this._uDustTexture = this.get_uniform_location('uDustTexture'); this._uDustColor = this.get_uniform_location('uDustColor'); this._uSeed = this.get_uniform_location('uSeed'); @@ -176,10 +175,9 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); - this.set_uniform_float(this._uDustColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); - this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); - this.set_uniform_float(this._uDustScale, 1, [settings.get_double('snap-scale')]); + this.set_uniform_float(this._uDustColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); + this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); + this.set_uniform_float(this._uDustScale, 1, [settings.get_double('snap-scale')]); // clang-format on } @@ -198,7 +196,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.noise()} ${shaderSnippets.math2D()} - uniform bool uForOpening; uniform sampler2D uDustTexture; uniform vec4 uDustColor; uniform vec2 uSeed; diff --git a/src/TRexAttack.js b/src/TRexAttack.js index 4286cde..31a4d1f 100644 --- a/src/TRexAttack.js +++ b/src/TRexAttack.js @@ -156,7 +156,6 @@ if (utils.isInShellProcess()) { clawData.width, clawData.height, clawData.rowstride); } - this._uForOpening = this.get_uniform_location('uForOpening'); this._uClawTexture = this.get_uniform_location('uClawTexture'); this._uFlashColor = this.get_uniform_location('uFlashColor'); this._uSeed = this.get_uniform_location('uSeed'); @@ -174,7 +173,6 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); this.set_uniform_float(this._uFlashColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]); this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); this.set_uniform_float(this._uClawSize, 1, [settings.get_double('claw-scratch-scale')]); @@ -199,7 +197,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.compositing()} // See assets/README.md for how this texture was created. - uniform bool uForOpening; uniform sampler2D uClawTexture; uniform vec4 uFlashColor; uniform vec2 uSeed; diff --git a/src/TVEffect.js b/src/TVEffect.js index f6463ef..19eb601 100644 --- a/src/TVEffect.js +++ b/src/TVEffect.js @@ -141,19 +141,14 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); - this._uColor = this.get_uniform_location('uColor'); + this._uColor = this.get_uniform_location('uColor'); } // This is called each time the effect is used. This can be used to retrieve the // configuration from the settings and update all uniforms accordingly. setUniforms(actor, settings, forOpening) { const c = Clutter.Color.from_string(settings.get_string('tv-effect-color'))[1]; - - // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); - this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); - // clang-format on + this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); } // This is called by extension.js when the shader is not used anymore. We will store @@ -169,7 +164,6 @@ if (utils.isInShellProcess()) { // Inject some common shader snippets. ${shaderSnippets.standardUniforms()} - uniform bool uForOpening; uniform vec3 uColor; const float BLUR_WIDTH = 0.01; // Width of the gradients. diff --git a/src/Wisps.js b/src/Wisps.js index f10e694..6d3151e 100644 --- a/src/Wisps.js +++ b/src/Wisps.js @@ -141,10 +141,9 @@ if (utils.isInShellProcess()) { _init() { super._init(); - this._uForOpening = this.get_uniform_location('uForOpening'); - this._uSeed = this.get_uniform_location('uSeed'); - this._uColor = this.get_uniform_location('uColor'); - this._uScale = this.get_uniform_location('uScale'); + this._uSeed = this.get_uniform_location('uSeed'); + this._uColor = this.get_uniform_location('uColor'); + this._uScale = this.get_uniform_location('uScale'); } // This is called each time the effect is used. This can be used to retrieve the @@ -156,10 +155,9 @@ if (utils.isInShellProcess()) { const testMode = settings.get_boolean('test-mode'); // clang-format off - this.set_uniform_float(this._uForOpening, 1, [forOpening]); - this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); - this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); - this.set_uniform_float(this._uScale, 1, [settings.get_double('wisps-scale')]); + this.set_uniform_float(this._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]); + this.set_uniform_float(this._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]); + this.set_uniform_float(this._uScale, 1, [settings.get_double('wisps-scale')]); // clang-format on } @@ -179,7 +177,6 @@ if (utils.isInShellProcess()) { ${shaderSnippets.edgeMask()} ${shaderSnippets.compositing()} - uniform bool uForOpening; uniform vec2 uSeed; uniform vec3 uColor; uniform float uScale; diff --git a/src/shaderSnippets.js b/src/shaderSnippets.js index 4b265e2..6178315 100644 --- a/src/shaderSnippets.js +++ b/src/shaderSnippets.js @@ -18,12 +18,14 @@ ////////////////////////////////////////////////////////////////////////////////////////// // These should be included in every shader. +// uForOpening: True if a window-open animation is ongoing, false otherwise. // uTexture: Contains the texture of the window. // uProgress: A value which transitions from 0 to 1 during the entire animation. // uTime: A steadily increasing value in seconds. // uSize: The size of uTexture in pixels. function standardUniforms() { return ` + uniform bool uForOpening; uniform sampler2D uTexture; uniform float uProgress; uniform float uTime;