summaryrefslogtreecommitdiff
path: root/src/assets/shaders/text/frag.glsl
blob: 3a1694f3301ffbc1d07516e70d7bfbfc1c2c2cc0 (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
#version 300 es
precision highp float;

uniform sampler2D texture_data;
uniform int text_length;
uniform int text[256];
uniform int char_width;
uniform int char_height;
uniform int font_width;
uniform int font_height;
uniform int text_width;
uniform int text_height;

in vec2 vertex_texcoord;
out vec4 frag_color;

void main()
{
    vec2 inverted_texcoord = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
    vec2 texcoord_pixels = inverted_texcoord * vec2(float(text_width), float(text_height));
    int texcoord_char_x = int(floor(texcoord_pixels.x)) / char_width;
    int texcoord_char_y = int(floor(texcoord_pixels.y)) / char_height;

    int x = 0;
    int y = 0;
    int i = 0;
    for (; i < text_length; ++i) {
        if (x == texcoord_char_x && y == texcoord_char_y) {
            break;
        }
        if (text[i] == 10) {
            x = 0;
            y += 1;
        } else {
            x += 1;
        }
    }
    if (i == text_length || text[i] == 10) discard;

    int entry = text[i] - 32;
    vec2 texcoord_base = vec2(
        float(entry % (font_width / char_width)) * float(char_width),
        float(entry / (font_width / char_width)) * float(char_height)
    );
    // vec2 texcoord_base = vec2(8.0, 0.0);
    vec2 texcoord_off = vec2(
        mod(texcoord_pixels.x, float(char_width)),
        mod(texcoord_pixels.y, float(char_height))
    );
    vec2 texcoord_final = (texcoord_base + texcoord_off) / vec2(float(font_width), float(font_height));

    vec4 texel = texture(texture_data, texcoord_final);
    if (texel.rgb == vec3(0.0, 0.0, 0.0)) discard;
    frag_color = texel;
}