#include "cl_video.h"
cvar_t r_textshadow = {CVAR_SAVE, "r_textshadow", "0", "draws a shadow on all text to improve readability (note: value controls offset, 1 = 1 pixel, 1.5 = 1.5 pixels, etc)"};
+cvar_t r_textbrightness = {CVAR_SAVE, "r_textbrightness", "0", "additional brightness for text color codes (0 keeps colors as is, 1 makes them all white)"};
static rtexture_t *char_texture;
cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
flags |= TEXF_CLAMP;
// load a high quality image from disk if possible
- pic->tex = loadtextureimage(drawtexturepool, path, 0, 0, false, flags);
+ pic->tex = loadtextureimage(drawtexturepool, path, 0, 0, false, flags | (gl_texturecompression_2d.integer ? TEXF_COMPRESS : 0));
if (pic->tex == NULL && !strncmp(path, "gfx/", 4))
{
// compatibility with older versions which did not require gfx/ prefix
- pic->tex = loadtextureimage(drawtexturepool, path + 4, 0, 0, false, flags);
+ pic->tex = loadtextureimage(drawtexturepool, path + 4, 0, 0, false, flags | (gl_texturecompression_2d.integer ? TEXF_COMPRESS : 0));
}
// if a high quality image was loaded, set the pic's size to match it, just
// in case there's no low quality version to get the size from
void GL_Draw_Init (void)
{
Cvar_RegisterVariable(&r_textshadow);
+ Cvar_RegisterVariable(&r_textbrightness);
R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap);
}
GL_DepthMask(true);
GL_DepthRange(0, 1);
+ GL_PolygonOffset(0, 0);
GL_DepthTest(false);
GL_Color(1,1,1,1);
GL_AlphaTest(false);
void DrawQ_Pic(float x, float y, cachepic_t *pic, float width, float height, float red, float green, float blue, float alpha, int flags)
{
- DrawQ_SuperPic(x,y,pic,width,height,0,0,red,green,blue,alpha,1,0,red,green,blue,alpha,0,1,red,green,blue,alpha,1,1,red,green,blue,alpha,flags);
+ float floats[20];
+
+ _DrawQ_ProcessDrawFlag(flags);
+ GL_Color(red, green, blue, alpha);
+
+ R_Mesh_VertexPointer(floats, 0, 0);
+ R_Mesh_ColorPointer(NULL, 0, 0);
+ R_Mesh_ResetTextureState();
+ if (pic)
+ {
+ if (width == 0)
+ width = pic->width;
+ if (height == 0)
+ height = pic->height;
+ R_Mesh_TexBind(0, R_GetTexture(pic->tex));
+ R_Mesh_TexCoordPointer(0, 2, floats + 12, 0, 0);
+
+ // AK07: lets be texel correct on the corners
+ {
+ float horz_offset = 0.5f / pic->width;
+ float vert_offset = 0.5f / pic->height;
+
+ floats[12] = 0.0f + horz_offset;floats[13] = 0.0f + vert_offset;
+ floats[14] = 1.0f - horz_offset;floats[15] = 0.0f + vert_offset;
+ floats[16] = 1.0f - horz_offset;floats[17] = 1.0f - vert_offset;
+ floats[18] = 0.0f + horz_offset;floats[19] = 1.0f - vert_offset;
+ }
+ }
+
+ floats[2] = floats[5] = floats[8] = floats[11] = 0;
+ floats[0] = floats[9] = x;
+ floats[1] = floats[4] = y;
+ floats[3] = floats[6] = x + width;
+ floats[7] = floats[10] = y + height;
+
+ R_Mesh_Draw(0, 4, 2, polygonelements, 0, 0);
+}
+
+void DrawQ_Fill(float x, float y, float width, float height, float red, float green, float blue, float alpha, int flags)
+{
+ float floats[12];
+
+ _DrawQ_ProcessDrawFlag(flags);
+ GL_Color(red, green, blue, alpha);
+
+ R_Mesh_VertexPointer(floats, 0, 0);
+ R_Mesh_ColorPointer(NULL, 0, 0);
+ R_Mesh_ResetTextureState();
+
+ floats[2] = floats[5] = floats[8] = floats[11] = 0;
+ floats[0] = floats[9] = x;
+ floats[1] = floats[4] = y;
+ floats[3] = floats[6] = x + width;
+ floats[7] = floats[10] = y + height;
+
+ R_Mesh_Draw(0, 4, 2, polygonelements, 0, 0);
}
// color tag printing
static void DrawQ_GetTextColor(float color[4], int colorindex, float r, float g, float b, float a, qboolean shadow)
{
+ float v = r_textbrightness.value;
Vector4Copy(string_colors[colorindex], color);
- Vector4Set(color, color[0] * r, color[1] * g, color[2] * b, color[3] * a);
+ Vector4Set(color, (color[0] * (1-v) + v) * r, (color[1] * (1-v) + v) * g, (color[2] * (1-v) + v) * b, color[3] * a);
if (shadow)
{
float shadowalpha = color[0]+color[1]+color[2] * 0.8;
float DrawQ_String(float startx, float starty, const char *text, int maxlen, float w, float h, float basered, float basegreen, float baseblue, float basealpha, int flags, int *outcolor, qboolean ignorecolorcodes)
{
- int i, num, shadow, colorindex;
- float x, y, s, t, u, v;
+ int i, num, shadow, colorindex = STRING_COLOR_DEFAULT;
+ float x = startx, y, s, t, u, v;
float *av, *at, *ac;
float color[4];
int batchcount;
x += r_textshadow.value;
y += r_textshadow.value;
}
- // because this loop increments x before it draws, we must bias x first
- x -= w;
- for (i = 0;i < maxlen && text[i];)
+ for (i = 0;i < maxlen && text[i];i++, x += w)
{
+ if (text[i] == ' ')
+ continue;
if (text[i] == STRING_COLOR_TAG && !ignorecolorcodes && i + 1 < maxlen)
{
if (text[i+1] == STRING_COLOR_TAG)
+ {
i++;
+ if (text[i] == ' ')
+ continue;
+ }
else if (text[i+1] >= '0' && text[i+1] <= '9')
{
colorindex = text[i+1] - '0';
DrawQ_GetTextColor(color, colorindex, basered, basegreen, baseblue, basealpha, shadow);
- i += 2;
+ i++;
+ x -= w;
continue;
}
}
- num = text[i++];
- x += w;
- if (num == ' ')
- continue;
+ num = text[i];
s = (num & 15)*0.0625f + (0.5f / 256.0f);
t = (num >> 4)*0.0625f + (0.5f / 256.0f);
u = 0.0625f - (1.0f / 256.0f);
GL_LockArrays(0, 0);
}
}
+
+ if (outcolor)
+ *outcolor = colorindex;
+
// note: this relies on the proper text (not shadow) being drawn last
return x;
}
height = pic->height;
R_Mesh_TexBind(0, R_GetTexture(pic->tex));
R_Mesh_TexCoordPointer(0, 2, floats + 12, 0, 0);
- floats[12] = s1;floats[13] = t1;
- floats[14] = s2;floats[15] = t2;
- floats[16] = s4;floats[17] = t4;
- floats[18] = s3;floats[19] = t3;
+
+ // AK07: lets be texel correct on the corners
+ {
+ float horz_offset = 0.5f / pic->width;
+ float vert_offset = 0.5f / pic->height;
+
+ floats[12] = s1 + horz_offset;floats[13] = t1 + vert_offset;
+ floats[14] = s2 - horz_offset;floats[15] = t2 + vert_offset;
+ floats[16] = s4 - horz_offset;floats[17] = t4 - vert_offset;
+ floats[18] = s3 + horz_offset;floats[19] = t3 - vert_offset;
+ }
}
floats[2] = floats[5] = floats[8] = floats[11] = 0;
R_Mesh_ResetTextureState();
GL_DepthMask(true);
GL_DepthRange(0, 1);
+ GL_PolygonOffset(0, 0);
GL_DepthTest(false);
if (v_color_enable.integer)
{