Browse Source

Introduce bg_color vert attrib for glyphs

rexim 4 years ago
parent
commit
386b030ea1
3 changed files with 34 additions and 15 deletions
  1. 4 2
      shaders/font.frag
  2. 7 3
      shaders/font.vert
  3. 23 10
      src/main.c

+ 4 - 2
shaders/font.frag

@@ -17,7 +17,8 @@ uniform float time;
 
 in vec2 uv;
 flat in int glyph_ch;
-in vec4 glyph_color;
+in vec4 glyph_fg_color;
+in vec4 glyph_bg_color;
 
 void main() {
     int ch = glyph_ch;
@@ -32,5 +33,6 @@ void main() {
     vec2 size = vec2(FONT_CHAR_WIDTH_UV, -FONT_CHAR_HEIGHT_UV);
     vec2 t = pos + size * uv;
 
-    gl_FragColor = texture(font, t) * glyph_color;
+    vec4 tc = texture(font, t);
+    gl_FragColor = glyph_bg_color * (1.0 - tc.x) + tc.x * glyph_fg_color;
 }

+ 7 - 3
shaders/font.vert

@@ -12,11 +12,13 @@ uniform vec2 scale;
 
 layout(location = 0) in ivec2 tile;
 layout(location = 1) in int ch;
-layout(location = 2) in vec4 color;
+layout(location = 2) in vec4 fg_color;
+layout(location = 3) in vec4 bg_color;
 
 out vec2 uv;
 flat out int glyph_ch;
-out vec4 glyph_color;
+out vec4 glyph_fg_color;
+out vec4 glyph_bg_color;
 
 vec2 project_point(vec2 point)
 {
@@ -29,5 +31,7 @@ void main() {
     vec2 pos = tile * char_size * scale;
     gl_Position = vec4(project_point(uv * char_size * scale + pos), 0.0, 1.0);
     glyph_ch = ch;
-    glyph_color = color;
+
+    glyph_fg_color = fg_color;
+    glyph_bg_color = bg_color;
 }

+ 23 - 10
src/main.c

@@ -75,7 +75,7 @@ void usage(FILE *stream)
 // TODO: Delete line
 // TODO: Split the line on Enter
 
-// #define OPENGL_RENDERER
+#define OPENGL_RENDERER
 
 #ifdef OPENGL_RENDERER
 void MessageCallback(GLenum source,
@@ -98,13 +98,15 @@ void MessageCallback(GLenum source,
 typedef struct {
     Vec2i tile;
     int ch;
-    Vec4f color;
+    Vec4f fg_color;
+    Vec4f bg_color;
 } Glyph;
 
 typedef enum {
     GLYPH_ATTR_TILE = 0,
     GLYPH_ATTR_CH,
-    GLYPH_ATTR_COLOR,
+    GLYPH_ATTR_FG_COLOR,
+    GLYPH_ATTR_BG_COLOR,
     COUNT_GLYPH_ATTRS,
 } Glyph_Attr;
 
@@ -125,13 +127,18 @@ static const Glyph_Attr_Def glyph_attr_defs[COUNT_GLYPH_ATTRS] = {
         .comps = 1,
         .type = GL_INT
     },
-    [GLYPH_ATTR_COLOR] = {
-        .offset = offsetof(Glyph, color),
+    [GLYPH_ATTR_FG_COLOR] = {
+        .offset = offsetof(Glyph, fg_color),
+        .comps = 4,
+        .type = GL_FLOAT
+    },
+    [GLYPH_ATTR_BG_COLOR] = {
+        .offset = offsetof(Glyph, bg_color),
         .comps = 4,
         .type = GL_FLOAT
     },
 };
-static_assert(COUNT_GLYPH_ATTRS == 3, "The amount of glyph vertex attributes have changed");
+static_assert(COUNT_GLYPH_ATTRS == 4, "The amount of glyph vertex attributes have changed");
 
 #define GLYPH_BUFFER_CAP 1024
 
@@ -152,17 +159,23 @@ void glyph_buffer_sync(void)
                     glyph_buffer);
 }
 
-void gl_render_text(const char *text, size_t text_size, Vec2i tile, Vec4f color)
+void gl_render_text_sized(const char *text, size_t text_size, Vec2i tile, Vec4f fg_color, Vec4f bg_color)
 {
     for (size_t i = 0; i < text_size; ++i) {
         glyph_buffer_push((Glyph) {
             .tile = vec2i_add(tile, vec2i(i, 0)),
             .ch = text[i],
-            .color = color
+            .fg_color = fg_color,
+            .bg_color = bg_color,
         });
     }
 }
 
+void gl_render_text(const char *text, Vec2i tile, Vec4f fg_color, Vec4f bg_color)
+{
+    gl_render_text_sized(text, strlen(text), tile, fg_color, bg_color);
+}
+
 int main(int argc, char **argv)
 {
     (void) argc;
@@ -323,8 +336,8 @@ int main(int argc, char **argv)
 
     const char *text = "Hello, World";
     const char *foobar = "Foo Bar";
-    gl_render_text(text, strlen(text), vec2is(0), vec4f(1.0f, 0.0f, 0.0f, 1.0f));
-    gl_render_text(foobar, strlen(foobar), vec2i(0, -1), vec4f(0.0f, 1.0f, 0.0f, 1.0f));
+    gl_render_text(text, vec2is(0), vec4f(1.0f, 0.0f, 0.0f, 1.0f), vec4fs(1.0f));
+    gl_render_text(foobar, vec2i(0, -1), vec4f(0.0f, 1.0f, 0.0f, 1.0f), vec4fs(0.0f));
     glyph_buffer_sync();
 
     bool quit = false;