commit 386b030ea1c85fec3907d0ae3355ae466118cc57
parent 8d68d0c9765c67fdae6c3c993169eaeabbb8c12b
Author: rexim <reximkut@gmail.com>
Date: Tue, 6 Jul 2021 22:07:48 +0700
Introduce bg_color vert attrib for glyphs
Diffstat:
3 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/shaders/font.frag b/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;
}
diff --git a/shaders/font.vert b/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;
}
diff --git a/src/main.c b/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;