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);
 }