From 7bd5ab882c37aaf8137cb33ae5fd84c6c01a2ffb Mon Sep 17 00:00:00 2001 From: Bill Currie <bill@taniwha.org> Date: Mon, 26 Dec 2011 10:16:16 +0900 Subject: [PATCH] Get text rendering working. It comes out as a funky green (that's not in the quake palette!!!), but it's mostly readable. --- libs/video/renderer/glsl/glsl_draw.c | 15 ++++++++++++--- libs/video/renderer/glsl/glsl_screen.c | 2 ++ libs/video/renderer/glsl/quaketxt.frag | 2 ++ libs/video/renderer/glsl/quaketxt.vert | 6 +++--- libs/video/targets/vid_common_glsl.c | 5 +++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libs/video/renderer/glsl/glsl_draw.c b/libs/video/renderer/glsl/glsl_draw.c index b20256c85..b2de9ba24 100644 --- a/libs/video/renderer/glsl/glsl_draw.c +++ b/libs/video/renderer/glsl/glsl_draw.c @@ -190,13 +190,18 @@ Draw_Init (void) qfglBindTexture (GL_TEXTURE_2D, char_texture); qfglTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 128, 128, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, draw_chars); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + qfglGenerateMipmap (GL_TEXTURE_2D); } static inline void queue_character (int x, int y, byte chr) { unsigned short *v; - int i; + unsigned i, c; const int size = 5 * 2 * 4; char_queue->size += size; @@ -205,8 +210,9 @@ queue_character (int x, int y, byte chr) for (i = 0; i < 4; i++) { *v++ = x; *v++ = y; - *v++ = i & 1; - *v++ = (i >> 1) & 1; + c = i ^ (i >> 1); + *v++ = c & 1; + *v++ = (c >> 1) & 1; *v++ = chr; } } @@ -219,12 +225,15 @@ flush_text (void) qfglEnableVertexAttribArray (dchar.location); qfglUniformMatrix4fv (matrix.location, 1, false, proj_matrix); + qfglUniform1i (charmap.location, 0); qfglActiveTexture(GL_TEXTURE0 + 0); + qfglEnable (GL_TEXTURE_2D); qfglBindTexture(GL_TEXTURE_2D, char_texture); qfglUniform1i (palette.location, 1); qfglActiveTexture(GL_TEXTURE0 + 1); + qfglEnable (GL_TEXTURE_2D); qfglBindTexture(GL_TEXTURE_2D, glsl_palette); qfglVertexAttribPointer (vertex.location, 4, GL_UNSIGNED_SHORT, 0, 10, diff --git a/libs/video/renderer/glsl/glsl_screen.c b/libs/video/renderer/glsl/glsl_screen.c index 5ba1157a5..ba3919786 100644 --- a/libs/video/renderer/glsl/glsl_screen.c +++ b/libs/video/renderer/glsl/glsl_screen.c @@ -101,6 +101,8 @@ SCR_UpdateScreen (double realtime, SCR_Func *scr_funcs) if (!scr_initialized) return; + qfglClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + begun = 1; if (oldfov != scr_fov->value) { diff --git a/libs/video/renderer/glsl/quaketxt.frag b/libs/video/renderer/glsl/quaketxt.frag index d80ed0858..e0bb556e2 100644 --- a/libs/video/renderer/glsl/quaketxt.frag +++ b/libs/video/renderer/glsl/quaketxt.frag @@ -9,5 +9,7 @@ main (void) float pix; pix = texture2D (charmap, st).r; + if (pix == 1.0) + discard; gl_FragColor = texture2D (palette, vec2 (pix, 0.5)); } diff --git a/libs/video/renderer/glsl/quaketxt.vert b/libs/video/renderer/glsl/quaketxt.vert index dfa90f59b..70c0d7700 100644 --- a/libs/video/renderer/glsl/quaketxt.vert +++ b/libs/video/renderer/glsl/quaketxt.vert @@ -26,7 +26,7 @@ main (void) { float row, col; vec2 pos, corner, uv; - const vec2 inset = vec2 (0.25, 0.25); + const vec2 inset = vec2 (0.03125, 0.03125); const vec2 size = vec2 (0.0625, 0.0625); row = floor (char / 16.0); @@ -34,8 +34,8 @@ main (void) pos = vertex.xy; corner = vertex.zw; - uv = vec2 (row, col) + inset * (1.0 - 2.0 * corner) + 8.0 * corner; + uv = vec2 (col, row) + inset * (1.0 - 2.0 * corner) + corner; uv *= size; gl_Position = mvp_mat * vec4 (pos + corner * 8.0, 0.0, 1.0); - st = uv + corner; + st = uv; } diff --git a/libs/video/targets/vid_common_glsl.c b/libs/video/targets/vid_common_glsl.c index 877ff9aa5..89f0ea8ed 100644 --- a/libs/video/targets/vid_common_glsl.c +++ b/libs/video/targets/vid_common_glsl.c @@ -113,6 +113,11 @@ VID_SetPalette (unsigned char *palette) qfglBindTexture (GL_TEXTURE_2D, glsl_palette); qfglTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pal); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + qfglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + qfglGenerateMipmap (GL_TEXTURE_2D); free (pal); }