summaryrefslogtreecommitdiff
path: root/config/picom/shaders/glitch_animation.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'config/picom/shaders/glitch_animation.glsl')
-rw-r--r--config/picom/shaders/glitch_animation.glsl119
1 files changed, 119 insertions, 0 deletions
diff --git a/config/picom/shaders/glitch_animation.glsl b/config/picom/shaders/glitch_animation.glsl
new file mode 100644
index 0000000..be1e16c
--- /dev/null
+++ b/config/picom/shaders/glitch_animation.glsl
@@ -0,0 +1,119 @@
+#version 330
+
+float maxoff = 10;
+float minoff = 2;
+float hue = 0.3;
+
+float block_max = 500;
+float block_min = 200;
+
+in vec2 texcoord; // texture coordinate of the fragment
+uniform sampler2D tex; // texture of the window
+
+vec4 default_post_processing(vec4 c);
+
+uniform float time; // Time in miliseconds.
+
+float max_opacity = 0.9;
+float opacity_threshold(float opacity)
+{
+ // if statement jic?
+ if (opacity >= max_opacity)
+ {
+ return 1.0;
+ }
+ else
+ {
+ return min(1, opacity/max_opacity);
+ }
+
+}
+
+// Pseudo-random function (from original shader)
+float random(float n) {
+ return fract(sin(n) * 43758.5453f);
+}
+
+float rand_offset(float b, float off) {
+ return (random(b*64) - 0.5) * (off*2);
+}
+
+vec3 hueShift( vec3 color, float hueAdjust ){
+
+ const vec3 kRGBToYPrime = vec3 (0.299, 0.587, 0.114);
+ const vec3 kRGBToI = vec3 (0.596, -0.275, -0.321);
+ const vec3 kRGBToQ = vec3 (0.212, -0.523, 0.311);
+
+ const vec3 kYIQToR = vec3 (1.0, 0.956, 0.621);
+ const vec3 kYIQToG = vec3 (1.0, -0.272, -0.647);
+ const vec3 kYIQToB = vec3 (1.0, -1.107, 1.704);
+
+ float YPrime = dot (color, kRGBToYPrime);
+ float I = dot (color, kRGBToI);
+ float Q = dot (color, kRGBToQ);
+ float hue = atan (Q, I);
+ float chroma = sqrt (I * I + Q * Q);
+
+ hue += hueAdjust;
+
+ Q = chroma * sin (hue);
+ I = chroma * cos (hue);
+
+ vec3 yIQ = vec3 (YPrime, I, Q);
+
+ return vec3( dot (yIQ, kYIQToR), dot (yIQ, kYIQToG), dot (yIQ, kYIQToB) );
+
+}
+
+vec4 anim(float alpha) {
+ float block = mix(block_max, block_min, alpha);
+ vec2 bs = floor(texcoord / block) * block + block/2;
+
+ float b = random(bs.y) * random(mod(time/10000,2));
+
+ float off = mix(maxoff, minoff, alpha);
+ if (b > alpha) {
+ off = 0;
+ }
+
+ // Offsets in pixels for each color
+ vec2 uvr = vec2(rand_offset(b*1, off), rand_offset(b*6, off));
+ vec2 uvg = vec2(rand_offset(b*2, off), rand_offset(b*7, off));
+ vec2 uvb = vec2(rand_offset(b*3, off), rand_offset(b*8, off));
+
+ // Calculate offset coords
+ uvr += texcoord;
+ uvg += texcoord;
+ uvb += texcoord;
+
+ // Fetch colors using offset coords
+ vec3 offset_color;
+ offset_color.x = texelFetch(tex, ivec2(uvr), 0).x;
+ offset_color.y = texelFetch(tex, ivec2(uvg), 0).y;
+
+ offset_color.x = hueShift(texelFetch(tex, ivec2(uvr), 0).xyz, hue).x;
+ offset_color.y = hueShift(texelFetch(tex, ivec2(uvg), 0).xyz, hue).y;
+ offset_color.z = hueShift(texelFetch(tex, ivec2(uvb), 0).xyz, hue).z;
+
+ offset_color.xyz = hueShift(offset_color.xyz, -hue);
+
+ // Set the new color
+ vec4 c;
+ c.w = texelFetch(tex, ivec2(uvr), 0).w;
+ c.xyz = offset_color;
+
+ return default_post_processing(c);
+}
+
+vec4 window_shader() {
+ vec4 c = texelFetch(tex, ivec2(texcoord), 0);
+ c = default_post_processing(c);
+ float opacity = opacity_threshold(c.w);
+ if (opacity != 1.0)
+ {
+ c = anim(opacity);
+ }
+ //c = anim(opacity);
+ return default_post_processing(c);
+}
+