aboutsummaryrefslogtreecommitdiff
path: root/src/main/resources/shaders/seigaiha.glsl
blob: b3afb4c7f29b5c98304109a96e347ba6352a3246 (plain) (blame)
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
#version 430
layout(local_size_x = 1, local_size_y = 1) in;

uniform float seconds = 0.;
layout(rgba8) uniform writeonly image2D output_image;

const float anti_aliasing = 0.0006;
const float scale = 460.;
const vec3 bg_color = vec3(1);
const vec3 odd_color = vec3(0.156, 0.22, 0.396);
const vec3 even_color = vec3(0.861, 0.702, 0.246);

bool sdf(in vec2 p, bool even, inout float dist) {
  float l = length(p);
  float size = 0.13;
  float ring_thickness = 0.006;
  float min_gap = 0.01;
  float speed = 1. / 200.;
  if (even) speed = -speed;
  bool even_iteration = int(seconds * speed / 0.05) % 2 == 0;
  float gap_factor = even_iteration ? mod(seconds * speed, 0.05) : mod(-seconds * speed, 0.05);
  if (l < size) {
    float v = (l - size) * (l - size - 10);
    for (float r = 0.02 + gap_factor, i = 0; r <= size; i++, r += ring_thickness) {
      v *= (l - r);
      r += min_gap + i * (0.0024 + gap_factor / 10);
      v *= (l - r);
    }
    dist = v;
    return true;
  }
  return false;
}

vec3 draw_shtuff(vec2 uv) {
  vec2 period = vec2(0.11, 0.11);
  vec2 pos = round(uv / period);

  int odd = int(pos.x) % 2;
  float yoffset = pos.y - 0.5 * odd;
  float wing_yoffset = pos.y - odd - 0.5 * (1 - odd);
  vec3 wing_color = mix(odd_color, even_color, 1 - odd);
  vec3 body_color = mix(odd_color, even_color, odd);

  float dist = -1;
  vec3 active_color = bg_color;
  if (sdf(uv - vec2(pos.x, yoffset) * period, odd == 0, dist))
    active_color = body_color;
  if (sdf(uv - vec2(pos.x + 1, wing_yoffset) * period, odd == 1, dist))
    active_color = wing_color;
  if (sdf(uv - vec2(pos.x - 1, wing_yoffset) * period, odd == 1, dist))
    active_color = wing_color;
  if (sdf(uv - vec2(pos.x, yoffset - 1) * period, odd == 0, dist))
    active_color = body_color;

  return dist > 0 ? vec3(pow(active_color.x, 2.2), pow(active_color.y, 2.2), pow(active_color.z, 2.2)) : bg_color;
}

vec3 anti_aliased_draw_shtuff(vec2 uv) {
  vec3 sum = vec3(0);
  int count = 0;
  for (int i = -2; i < 2; i++)
    for (int j = -2; j < 2; j++, count++)
      sum += draw_shtuff(uv + vec2(i, j) * anti_aliasing);
  return sum / count;
}

void main() {
  vec2 uv = gl_GlobalInvocationID.xy / scale;
  vec3 color = anti_aliased_draw_shtuff(uv);
  imageStore(output_image, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1));
}