diff --git a/extension.js b/extension.js
index 531a85e..56304ca 100644
--- a/extension.js
+++ b/extension.js
@@ -25,6 +25,7 @@ const utils = Me.imports.src.common.utils;
const FireShader = Me.imports.src.extension.FireShader.FireShader;
const MatrixShader = Me.imports.src.extension.MatrixShader.MatrixShader;
const TVEffectShader = Me.imports.src.extension.TVEffectShader.TVEffectShader;
+const TRexShader = Me.imports.src.extension.TRexShader.TRexShader;
//////////////////////////////////////////////////////////////////////////////////////////
// This extensions modifies the window-close animation to look like the window was set //
@@ -158,6 +159,10 @@ class Extension {
} else if (mode == 3) {
shader = new TVEffectShader(this._settings);
tweakTransition('scale-y', 0.5);
+ } else if (mode == 4) {
+ shader = new TRexShader(this._settings);
+ tweakTransition('scale-x', 1.1);
+ tweakTransition('scale-y', 1.1);
}
if (shader) {
diff --git a/resources/img/claws.png b/resources/img/claws.png
new file mode 100644
index 0000000..9a21cac
Binary files /dev/null and b/resources/img/claws.png differ
diff --git a/resources/ui/gtk4.ui b/resources/ui/gtk4.ui
index ee3165b..7058153 100644
--- a/resources/ui/gtk4.ui
+++ b/resources/ui/gtk4.ui
@@ -20,6 +20,10 @@
TV Effect
tv
+
+ T-Rex Attack
+ trex
+
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
index 8de7d19..d20f685 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
@@ -5,6 +5,7 @@
+
diff --git a/src/extension/TRexShader.js b/src/extension/TRexShader.js
new file mode 100644
index 0000000..7d5c6dc
--- /dev/null
+++ b/src/extension/TRexShader.js
@@ -0,0 +1,136 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+// Copyright (c) 2021 Simon Schneegans //
+// Released under the GPLv3 or later. See LICENSE file for details. //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+'use strict';
+
+const {Clutter, GObject, GdkPixbuf, Cogl} = imports.gi;
+
+const ExtensionUtils = imports.misc.extensionUtils;
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const shaderSnippets = Me.imports.src.extension.shaderSnippets;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////
+
+var TRexShader = GObject.registerClass({Properties: {}, Signals: {}},
+ class TRexShader extends Clutter.ShaderEffect {
+ _init(settings) {
+ super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
+
+ // Load the font texture. As the shader is re-created for each window animation, this
+ // texture is also re-created each time. This could be improved in the future!
+ const clawData = GdkPixbuf.Pixbuf.new_from_resource('/img/claws.png');
+ this._clawTexture = new Clutter.Image();
+ this._clawTexture.set_data(
+ clawData.get_pixels(), Cogl.PixelFormat.RGB_888, clawData.width, clawData.height,
+ clawData.rowstride);
+
+ // This is partially based on https://www.shadertoy.com/view/ldccW4 (CC-BY-NC-SA).
+ this.set_shader_source(`
+
+ // Inject some common shader snippets.
+ ${shaderSnippets.standardUniforms()}
+ ${shaderSnippets.noise()}
+
+ uniform sampler2D uClawTexture;
+
+ const vec2 SEED = vec2(${Math.random()}, ${Math.random()});
+
+ vec2 getClawUV(vec2 texCoords, float globalScale, vec2 seed) {
+
+ vec2 coords = texCoords + rand2(seed);
+ coords *= uSizeX < uSizeY ? vec2(1.0, 1.0 * uSizeY / uSizeX) : vec2(1.0 * uSizeX / uSizeY, 1.0);
+
+ coords *= globalScale;
+
+ vec2 uv = mod(coords, vec2(1));
+ vec2 block = coords-uv + vec2(362.456);
+
+ float scale = mix(0.8, 1.0, rand(block*seed*134.451));
+ float offsetX = mix(0.0, 1.0 - scale, rand(block*seed*54.4129));
+ float offsetY = mix(0.0, 1.0 - scale, rand(block*seed*25.3089));
+ float rotation = mix(0.0, 2.0 * 3.141, rand(block*seed*2.99837));
+
+ uv -= vec2(offsetX, offsetY);
+ uv /= scale;
+
+ uv -= 0.5;
+ uv = vec2(uv.x * cos(rotation) - uv.y * sin(rotation),
+ uv.x * sin(rotation) + uv.y * cos(rotation));
+ uv += 0.5;
+
+ return clamp(uv, vec2(0), vec2(1));
+ }
+
+ void main() {
+
+
+
+ const float CLAW_SIZE = 1;
+ const float NUM_CLAWS = 5;
+ const float MAX_SPAWN_TIME = 0.5;
+ const float FF_TIME = 0.5; // Relative time for the final fade to transparency.
+
+ float fade = smoothstep(0, 1, 1 - clamp((uProgress - 1.0 + FF_TIME)/FF_TIME, 0, 1));
+
+ float mask = 1.0;
+
+ vec2 coords = cogl_tex_coord_in[0].st * 2.0 - 1.0;
+ float dist = length(coords);
+
+ coords = (coords/dist * pow(dist, 1.1)) * 0.5 + 0.5;
+
+ coords = mix(cogl_tex_coord_in[0].st, coords, uProgress);
+
+ for (int i=0; i= 1) {
+ flash = 0;
+ }
+
+ cogl_color_out *= (mask > uProgress ? 1 : 0);
+ cogl_color_out.rgb += flash * mix(vec3(1, 0, 0), vec3(0), uProgress);
+
+
+
+ cogl_color_out *= fade;
+
+ // cogl_color_out = vec4(vec3(flash), 1);
+ // cogl_color_out = vec4(vec3(mask), 1);
+
+ }
+ `);
+ };
+
+ // This is overridden to bind the claw texture for drawing. Sadly, this seems to be
+ // impossible under GNOME 3.3x as this.get_pipeline() is not available. It was called
+ // get_target() back then but this is not wrapped in GJS.
+ // https://gitlab.gnome.org/GNOME/mutter/-/blob/gnome-3-36/clutter/clutter/clutter-offscreen-effect.c#L598
+ vfunc_paint_target(node, paint_context) {
+ const pipeline = this.get_pipeline();
+ pipeline.set_layer_texture(1, this._clawTexture.get_texture());
+ this.set_uniform_value('uClawTexture', 1);
+ super.vfunc_paint_target(node, paint_context);
+ }
+});
\ No newline at end of file