#include "cl_video.h"
-cvar_t r_textshadow = {0, "r_textshadow", "0" "draws a shadow on all text to improve readability"};
+cvar_t r_textshadow = {0, "r_textshadow", "0", "draws a shadow on all text to improve readability"};
static rtexture_t *char_texture;
cachepic_t *r_crosshairs[NUMCROSSHAIRS+1];
}
else
{
- data[i][0] = 255;
- data[i][1] = 255;
- data[i][2] = 255;
- data[i][3] = (unsigned char) ((int) (in[i] - '0') * 255 / 7);
+ data[i][0] = data[i][1] = data[i][2] = (unsigned char) ((int) (in[i] - '0') * 127 / 7 + 128);
+ data[i][3] = 255;
}
}
return R_LoadTexture2D(drawtexturepool, va("crosshair%i", num), 16, 16, &data[0][0], TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL);
{
int crc, hashkey;
cachepic_t *pic;
- qpic_t *p;
int flags;
+ fs_offset_t lmpsize;
+ unsigned char *lmpdata;
+ char lmpname[MAX_QPATH];
if (!strncmp(CLVIDEOPREFIX, path, sizeof(CLVIDEOPREFIX) - 1))
{
if (!strcmp(path, "gfx/colorcontrol/ditherpattern"))
flags |= TEXF_CLAMP;
- // load the pic from disk
+ // load a high quality image from disk if possible
pic->tex = loadtextureimage(drawtexturepool, path, 0, 0, false, flags);
if (pic->tex == NULL && !strncmp(path, "gfx/", 4))
{
- // compatibility with older versions
+ // compatibility with older versions which did not require gfx/ prefix
pic->tex = loadtextureimage(drawtexturepool, path + 4, 0, 0, false, flags);
- // failed to find gfx/whatever.tga or similar, try the wad
- if (pic->tex == NULL && (p = (qpic_t *)W_GetLumpName (path + 4)))
+ }
+ // 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
+ if (pic->tex)
+ {
+ pic->width = R_TextureWidth(pic->tex);
+ pic->height = R_TextureHeight(pic->tex);
+ }
+
+ // now read the low quality version (wad or lmp file), and take the pic
+ // size from that even if we don't upload the texture, this way the pics
+ // show up the right size in the menu even if they were replaced with
+ // higher or lower resolution versions
+ dpsnprintf(lmpname, sizeof(lmpname), "%s.lmp", path);
+ if (!strncmp(path, "gfx/", 4) && (lmpdata = FS_LoadFile(lmpname, tempmempool, false, &lmpsize)))
+ {
+ if (lmpsize >= 9)
{
- if (!strcmp(path, "gfx/conchars"))
- {
- // conchars is a raw image and with color 0 as transparent instead of 255
- pic->tex = R_LoadTexture2D(drawtexturepool, path, 128, 128, (unsigned char *)p, TEXTYPE_PALETTE, flags, palette_font);
- }
- else
- pic->tex = R_LoadTexture2D(drawtexturepool, path, p->width, p->height, p->data, TEXTYPE_PALETTE, flags, palette_transparent);
+ pic->width = lmpdata[0] + lmpdata[1] * 256 + lmpdata[2] * 65536 + lmpdata[3] * 16777216;
+ pic->height = lmpdata[4] + lmpdata[5] * 256 + lmpdata[6] * 65536 + lmpdata[7] * 16777216;
+ // if no high quality replacement image was found, upload the original low quality texture
+ if (!pic->tex)
+ pic->tex = R_LoadTexture2D(drawtexturepool, path, pic->width, pic->height, lmpdata + 8, TEXTYPE_PALETTE, flags, palette_transparent);
+ }
+ Mem_Free(lmpdata);
+ }
+ else if ((lmpdata = W_GetLumpName (path + 4)))
+ {
+ if (!strcmp(path, "gfx/conchars"))
+ {
+ // conchars is a raw image and with color 0 as transparent instead of 255
+ pic->width = 128;
+ pic->height = 128;
+ // if no high quality replacement image was found, upload the original low quality texture
+ if (!pic->tex)
+ pic->tex = R_LoadTexture2D(drawtexturepool, path, 128, 128, lmpdata, TEXTYPE_PALETTE, flags, palette_font);
+ }
+ else
+ {
+ pic->width = lmpdata[0] + lmpdata[1] * 256 + lmpdata[2] * 65536 + lmpdata[3] * 16777216;
+ pic->height = lmpdata[4] + lmpdata[5] * 256 + lmpdata[6] * 65536 + lmpdata[7] * 16777216;
+ // if no high quality replacement image was found, upload the original low quality texture
+ if (!pic->tex)
+ pic->tex = R_LoadTexture2D(drawtexturepool, path, pic->width, pic->height, lmpdata + 8, TEXTYPE_PALETTE, flags, palette_transparent);
}
}
- if (pic->tex == NULL && !strcmp(path, "gfx/conchars"))
- pic->tex = draw_generateconchars();
- if (pic->tex == NULL && !strcmp(path, "ui/mousepointer"))
- pic->tex = draw_generatemousepointer();
- if (pic->tex == NULL && !strcmp(path, "gfx/prydoncursor001"))
- pic->tex = draw_generatemousepointer();
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair1"))
- pic->tex = draw_generatecrosshair(0);
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair2"))
- pic->tex = draw_generatecrosshair(1);
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair3"))
- pic->tex = draw_generatecrosshair(2);
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair4"))
- pic->tex = draw_generatecrosshair(3);
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair5"))
- pic->tex = draw_generatecrosshair(4);
- if (pic->tex == NULL && !strcmp(path, "gfx/crosshair6"))
- pic->tex = draw_generatecrosshair(5);
- if (pic->tex == NULL && !strcmp(path, "gfx/colorcontrol/ditherpattern"))
- pic->tex = draw_generateditherpattern();
+ // if it's not found on disk, check if it's one of the builtin images
if (pic->tex == NULL)
{
- Con_Printf("Draw_CachePic: failed to load %s\n", path);
- pic->tex = r_texture_notexture;
+ if (pic->tex == NULL && !strcmp(path, "gfx/conchars"))
+ pic->tex = draw_generateconchars();
+ if (pic->tex == NULL && !strcmp(path, "ui/mousepointer"))
+ pic->tex = draw_generatemousepointer();
+ if (pic->tex == NULL && !strcmp(path, "gfx/prydoncursor001"))
+ pic->tex = draw_generatemousepointer();
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair1"))
+ pic->tex = draw_generatecrosshair(0);
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair2"))
+ pic->tex = draw_generatecrosshair(1);
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair3"))
+ pic->tex = draw_generatecrosshair(2);
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair4"))
+ pic->tex = draw_generatecrosshair(3);
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair5"))
+ pic->tex = draw_generatecrosshair(4);
+ if (pic->tex == NULL && !strcmp(path, "gfx/crosshair6"))
+ pic->tex = draw_generatecrosshair(5);
+ if (pic->tex == NULL && !strcmp(path, "gfx/colorcontrol/ditherpattern"))
+ pic->tex = draw_generateditherpattern();
+ if (pic->tex == NULL)
+ {
+ Con_Printf("Draw_CachePic: failed to load %s\n", path);
+ pic->tex = r_texture_notexture;
+ }
+ pic->width = R_TextureWidth(pic->tex);
+ pic->height = R_TextureHeight(pic->tex);
}
- pic->width = R_TextureWidth(pic->tex);
- pic->height = R_TextureHeight(pic->tex);
return pic;
}
return cachepics; // return the first one
}
pic = cachepics + (numcachepics++);
- strcpy (pic->name, picname);
+ strlcpy (pic->name, picname, sizeof(pic->name));
// link into list
pic->chain = cachepichash[hashkey];
cachepichash[hashkey] = pic;
void DrawQ_Begin(void)
{
- r_view_width = bound(0, r_refdef.width, vid.width);
- r_view_height = bound(0, r_refdef.height, vid.height);
- r_view_depth = 1;
- r_view_x = bound(0, r_refdef.x, vid.width - r_refdef.width);
- r_view_y = bound(0, r_refdef.y, vid.height - r_refdef.height);
- r_view_z = 0;
- r_view_matrix = r_refdef.viewentitymatrix;
- GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 1);
-
- qglViewport(r_view_x, vid.height - (r_view_y + r_view_height), r_view_width, r_view_height);
+ GL_ColorMask(r_view.colormask[0], r_view.colormask[1], r_view.colormask[2], 1);
+
+ CHECKGLERROR
+ qglViewport(r_view.x, vid.height - (r_view.y + r_view.height), r_view.width, r_view.height);CHECKGLERROR
GL_SetupView_Mode_Ortho(0, 0, vid_conwidth.integer, vid_conheight.integer, -10, 100);
- qglDepthFunc(GL_LEQUAL);
+ qglDepthFunc(GL_LEQUAL);CHECKGLERROR
R_Mesh_Matrix(&identitymatrix);
GL_DepthMask(true);
GL_DepthTest(false);
GL_Color(1,1,1,1);
+ GL_AlphaTest(false);
+ GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
r_refdef.draw2dstage = true;
}
+static void _DrawQ_ProcessDrawFlag(int flags)
+{
+ CHECKGLERROR
+ if(flags == DRAWFLAG_ADDITIVE)
+ GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
+ else if(flags == DRAWFLAG_MODULATE)
+ GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
+ else if(flags == DRAWFLAG_2XMODULATE)
+ GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
+ else
+ GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
void DrawQ_Pic(float x, float y, cachepic_t *pic, float width, float height, float red, float green, float blue, float alpha, int flags)
{
if (!r_refdef.draw2dstage)
return;
}
- if (!r_render.integer)
- return;
-
if (alpha < (1.0f / 255.0f))
return;
- if(flags == DRAWFLAG_ADDITIVE)
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- else if(flags == DRAWFLAG_MODULATE)
- GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
- else if(flags == DRAWFLAG_2XMODULATE)
- GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
- else
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ _DrawQ_ProcessDrawFlag(flags);
GL_Color(red, green, blue, alpha);
return;
}
- if (!r_render.integer)
- return;
-
- if(flags == DRAWFLAG_ADDITIVE)
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- else if(flags == DRAWFLAG_MODULATE)
- GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
- else if(flags == DRAWFLAG_2XMODULATE)
- GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
- else
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ _DrawQ_ProcessDrawFlag(flags);
R_Mesh_VertexPointer(floats);
R_Mesh_ColorPointer(floats + 20);
return;
}
- if (!r_render.integer)
- return;
-
- if(flags == DRAWFLAG_ADDITIVE)
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- else if(flags == DRAWFLAG_MODULATE)
- GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
- else if(flags == DRAWFLAG_2XMODULATE)
- GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
- else
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ _DrawQ_ProcessDrawFlag(flags);
R_Mesh_VertexPointer(mesh->data_vertex3f);
R_Mesh_ColorPointer(mesh->data_color4f);
return;
}
- if (!r_render.integer)
- return;
-
- if(flags == DRAWFLAG_ADDITIVE)
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- else if(flags == DRAWFLAG_MODULATE)
- GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
- else if(flags == DRAWFLAG_2XMODULATE)
- GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
- else
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ _DrawQ_ProcessDrawFlag(flags);
GL_Color(1,1,1,1);
+ CHECKGLERROR
qglBegin(GL_LINE_LOOP);
for (num = 0;num < mesh->num_vertices;num++)
{
qglVertex2f(mesh->data_vertex3f[num*3+0], mesh->data_vertex3f[num*3+1]);
}
qglEnd();
+ CHECKGLERROR
}
//LordHavoc: FIXME: this is nasty!
Con_Printf("DrawQ_LineWidth: not in 2d rendering stage!\n");
return;
}
- qglLineWidth(width);
+ CHECKGLERROR
+ qglLineWidth(width);CHECKGLERROR
}
//[515]: this is old, delete
return;
}
- if (!r_render.integer)
- return;
-
+ CHECKGLERROR
if(width > 0)
DrawQ_LineWidth(width);
- if(flags == DRAWFLAG_ADDITIVE)
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- else if(flags == DRAWFLAG_MODULATE)
- GL_BlendFunc(GL_DST_COLOR, GL_ZERO);
- else if(flags == DRAWFLAG_2XMODULATE)
- GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR);
- else
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ _DrawQ_ProcessDrawFlag(flags);
GL_Color(r,g,b,alpha);
+ CHECKGLERROR
qglBegin(GL_LINES);
qglVertex2f(x1, y1);
qglVertex2f(x2, y2);
qglEnd();
+ CHECKGLERROR
}
void DrawQ_SetClipArea(float x, float y, float width, float height)