diff options
Diffstat (limited to 'config/picom/shaders/glitch_animation.glsl')
| -rw-r--r-- | config/picom/shaders/glitch_animation.glsl | 119 |
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); +} + |
