summaryrefslogtreecommitdiff
path: root/config/picom/shaders/glitch_animation.glsl
blob: 801fc93f08804503d4b756e9c9dcf7344c36cc56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#version 330

float maxoff = 10;
float minoff = 0;
float hue = 0.3;

float block_max = 500;
float block_min = 200;

float pixelate_size = 3;

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);
}

vec4 alpha_effect(vec4 pix, vec2 coord) {
    if (random(coord.x * random(coord.y / 100)) < pix.w) {
        pix.w = 1;
        return pix;
    }
    return vec4(0, 0, 0, 0);

}

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.xyz = offset_color;

    return c;
}

vec4 window_shader() {
    vec4 c = texelFetch(tex, ivec2(texcoord), 0);
    c = default_post_processing(c);
    float opacity = opacity_threshold(c.w);
    c = anim(opacity);
    c.w = opacity;
    c = alpha_effect(c, ceil(texcoord / pixelate_size) * pixelate_size);
    //c = default_post_processing(c);
    return c;
}