🔀 Merge pull request #149 from Schneegans/fix/#63

This commit is contained in:
Simon Schneegans
2022-05-16 07:50:16 +02:00
committed by GitHub
9 changed files with 30 additions and 8 deletions
+1
View File
@@ -8,6 +8,7 @@
* 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.
* Refactored how the size and opacity transitions of the window actors are set up. Effects can now only specify a desired actor scale which will not change during the animation. All dynamic scaling and fading must be implemented in the shaders now.
* The shaders are now aware of the actual window size (e.g. excluding the area where the shadow is drawn). For instance, this fixes the drawing of the effects outside the window bounds for `libadwaita` apps.
#### Bug Fixes
+1
View File
@@ -92,6 +92,7 @@ Please study this code carefully, all of it is explained with inline comments.
// float uProgress: A value which transitions from 0 to 1 during the entire animation.
// float uTime: A steadily increasing value in seconds.
// vec2 uSize: The size of uTexture in pixels.
// float uPadding: The empty area around the actual window (e.g. where the shadow is drawn).
#include "common/uniforms.glsl"
// The width of the fading effect is loaded from the settings.
+14 -3
View File
@@ -11,11 +11,22 @@ float getEdgeMask(vec2 uv, vec2 maxUV, float fadeWidth) {
return mask;
}
float getAbsoluteEdgeMask(float fadePixels) {
vec2 uv = cogl_tex_coord_in[0].st * uSize;
return getEdgeMask(uv, uSize, fadePixels);
// Returns an edge mask which fades to zero at the boundaries of the actor. The width of
// the fade zone is given in pixels. This uses the standard uniforms uSize and uPadding.
// This means that the fading zone is not actually at the actors boundaries but at the
// position of the window border in the texture.
// The offset paramter controls whether the fading is placed inside the window borders
// (offset = 0), ontop the window borders (offset = 0.5) or outside the window borders
// (offset = 1).
float getAbsoluteEdgeMask(float fadePixels, float offset) {
float padding = max(0, uPadding - fadePixels * offset);
vec2 uv = cogl_tex_coord_in[0].st * uSize - padding;
return getEdgeMask(uv, uSize - 2.0 * padding, fadePixels);
}
// Returns an edge mask which fades to zero at the boundaries of the actor. The width of
// the fade zone is given relative to the actor size. This neither uses uSize and
// uPadding.
float getRelativeEdgeMask(float fadeAmount) {
vec2 uv = cogl_tex_coord_in[0].st;
return getEdgeMask(uv, vec2(1.0), fadeAmount);
+3 -1
View File
@@ -4,8 +4,10 @@
// 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.
// uPadding: The empty area around the actual window (e.g. where the shadow is drawn).
uniform bool uForOpening;
uniform sampler2D uTexture;
uniform float uProgress;
uniform float uTime;
uniform vec2 uSize;
uniform vec2 uSize;
uniform float uPadding;
+1 -1
View File
@@ -30,7 +30,7 @@ vec2 getMasks(float progress) {
atomMask *= smoothstep(1.0, 0.0, fadeOutProgress);
// Fade-out the masks at the window edges.
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE_WIDTH);
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE_WIDTH, 0.5);
atomMask *= edgeFade;
float heartMask = getRelativeEdgeMask(0.5);
+1 -1
View File
@@ -47,7 +47,7 @@ vec4 getMasks(float progress) {
streakMask = max(streakMask, showerMask);
// Fade-out the masks at the window edges.
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE);
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE, 0.5);
streakMask *= edgeFade;
showerMask *= edgeFade;
+1 -1
View File
@@ -72,7 +72,7 @@ vec2 effectMask(float hideTime, float fadeWidth, float edgeFadeWidth) {
}
// Fade at window borders.
effectMask *= getAbsoluteEdgeMask(edgeFadeWidth);
effectMask *= getAbsoluteEdgeMask(edgeFadeWidth, 0.5);
if (uForOpening) {
windowMask = 1.0 - windowMask;
+1 -1
View File
@@ -52,7 +52,7 @@ vec2 getRain(vec2 fragCoord) {
float windowAlpha = 1 - clamp(uSize.y * distToDrop, 0, FADE_WIDTH) / FADE_WIDTH;
// Fade at window borders.
rainAlpha *= getAbsoluteEdgeMask(EDGE_FADE);
rainAlpha *= getAbsoluteEdgeMask(EDGE_FADE, 0.5);
// Add some variation to the drop start and end position.
float shorten =
+7
View File
@@ -70,10 +70,17 @@ var Shader = GObject.registerClass(
this._uProgress = this.get_uniform_location('uProgress');
this._uTime = this.get_uniform_location('uTime');
this._uSize = this.get_uniform_location('uSize');
this._uPadding = this.get_uniform_location('uPadding');
}
// This is called once each time the shader is used.
beginAnimation(settings, forOpening, actor) {
// This is not necessarily symmetric, but I haven't figured out a way to
// get the actual values...
const padding = (actor.width - actor.meta_window.get_frame_rect().width) / 2;
this.set_uniform_float(this._uPadding, 1, [padding]);
this.set_uniform_float(this._uForOpening, 1, [forOpening]);
this.set_uniform_float(this._uSize, 2, [actor.width, actor.height]);