X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_draw.c;h=e104cef9099485e0942e7d52ae21f768d8172d80;hb=174f32e18b0494f08f66c16ee8153dfe63553870;hp=fc666f6f478c18da5bd3195b25d9644dda26e89d;hpb=2a4f374589ee5bb712a5c6b7efbe323813ea9baf;p=xonotic%2Fdarkplaces.git diff --git a/gl_draw.c b/gl_draw.c index fc666f6f..e104cef9 100644 --- a/gl_draw.c +++ b/gl_draw.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -18,646 +18,542 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -// draw.c -- this is the only file outside the refresh that touches the -// vid buffer - #include "quakedef.h" -#define GL_COLOR_INDEX8_EXT 0x80E5 - -extern unsigned char d_15to8table[65536]; - -cvar_t qsg_version = {"qsg_version", "1"}; -cvar_t scr_conalpha = {"scr_conalpha", "1"}; - -byte *draw_chars; // 8*8 graphic characters -qpic_t *draw_disc; - -int char_texture; - -typedef struct -{ - int texnum; - float sl, tl, sh, th; -} glpic_t; - -int conbacktexnum; - -/* -============================================================================= +//#define GL_COLOR_INDEX8_EXT 0x80E5 - scrap allocation +cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"}; - Allocate all the little status bar obejcts into a single texture - to crutch up stupid hardware / drivers +static rtexture_t *char_texture; -============================================================================= -*/ +//============================================================================= +/* Support Routines */ -#define MAX_SCRAPS 2 -#define BLOCK_WIDTH 256 -#define BLOCK_HEIGHT 256 +#define MAX_CACHED_PICS 256 +#define CACHEPICHASHSIZE 256 +static cachepic_t *cachepichash[CACHEPICHASHSIZE]; +static cachepic_t cachepics[MAX_CACHED_PICS]; +static int numcachepics; -int scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH]; -byte scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT*4]; -qboolean scrap_dirty; +static rtexturepool_t *drawtexturepool; -// returns a texture number and the position inside it -int Scrap_AllocBlock (int w, int h, int *x, int *y) +static byte pointerimage[256] = { - int i, j; - int best, best2; - int texnum; - - for (texnum=0 ; texnum= best) - break; - if (scrap_allocated[texnum][i+j] > best2) - best2 = scrap_allocated[texnum][i+j]; - } - if (j == w) - { // this is a valid spot - *x = i; - *y = best = best2; - } + buffer[i][0] = 0; + buffer[i][1] = 0; + buffer[i][2] = 0; + buffer[i][3] = 0; + } + else + { + buffer[i][0] = (pointerimage[i] - '0') * 16; + buffer[i][1] = (pointerimage[i] - '0') * 16; + buffer[i][2] = (pointerimage[i] - '0') * 16; + buffer[i][3] = 255; } - - if (best + h > BLOCK_HEIGHT) - continue; - - for (i=0 ; idata; - - // load little ones into the scrap - if (p->width < 64 && p->height < 64) - { - int x, y; - int i, j, k; - int texnum; - - texnum = Scrap_AllocBlock (p->width, p->height, &x, &y); - scrap_dirty = true; - k = 0; - for (i=0 ; iheight ; i++) - for (j=0 ; jwidth ; j++, k++) - scrap_texels[texnum][(y+i)*BLOCK_WIDTH + x + j] = p->data[k]; - if (!scraptexnum[texnum]) - scraptexnum[texnum] = GL_LoadTexture (va("scrapslot%d", texnum), BLOCK_WIDTH, BLOCK_HEIGHT, scrap_texels[texnum], false, true, 1); - gl->texnum = scraptexnum[texnum]; - gl->sl = (x+0.01)/(float)BLOCK_WIDTH; - gl->sh = (x+p->width-0.01)/(float)BLOCK_WIDTH; - gl->tl = (y+0.01)/(float)BLOCK_WIDTH; - gl->th = (y+p->height-0.01)/(float)BLOCK_WIDTH; - - pic_count++; - pic_texels += p->width*p->height; - } - else + int i; + char *in; + byte data[16*16][4]; + in = crosshairtexdata[num]; + for (i = 0;i < 16*16;i++) { - gl->texnum = GL_LoadPicTexture (p); - gl->sl = 0; - gl->sh = 1; - gl->tl = 0; - gl->th = 1; + if (in[i] == '.') + { + data[i][0] = 255; + data[i][1] = 255; + data[i][2] = 255; + data[i][3] = 0; + } + else + { + data[i][0] = 255; + data[i][1] = 255; + data[i][2] = 255; + data[i][3] = (byte) ((int) (in[i] - '0') * 255 / 7); + } } - return p; + return R_LoadTexture(drawtexturepool, va("crosshair%i", num), 16, 16, &data[0][0], TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE); } - /* ================ Draw_CachePic ================ */ -qpic_t *Draw_CachePic (char *path) +// FIXME: move this to client somehow +cachepic_t *Draw_CachePic (char *path) { - cachepic_t *pic; - int i; - qpic_t *dat; - glpic_t *gl; + int i, crc, hashkey; + cachepic_t *pic; + qpic_t *p; - for (pic=menu_cachepics, i=0 ; i> 8) ^ crc) % CACHEPICHASHSIZE; + for (pic = cachepichash[hashkey];pic;pic = pic->chain) if (!strcmp (path, pic->name)) - return &pic->pic; - - if (menu_numcachepics == MAX_CACHED_PICS) - Sys_Error ("menu_numcachepics == MAX_CACHED_PICS"); - menu_numcachepics++; + return pic; + //for (pic = cachepics, i = 0;i < numcachepics;pic++, i++) + // if (!strcmp (path, pic->name)) + // return pic; + + if (numcachepics == MAX_CACHED_PICS) + Sys_Error ("numcachepics == MAX_CACHED_PICS"); + pic = cachepics + (numcachepics++); strcpy (pic->name, path); + // link into list + pic->chain = cachepichash[hashkey]; + cachepichash[hashkey] = pic; -// -// load the pic from disk -// - dat = (qpic_t *)COM_LoadTempFile (path, false); - if (!dat) + // load the pic from disk + pic->tex = loadtextureimage(drawtexturepool, path, 0, 0, false, false, true); + if (pic->tex == NULL && (p = W_GetLumpName (path))) + { + if (!strcmp(path, "conchars")) + { + byte *pix; + // conchars is a raw image and with the wrong transparent color + pix = (byte *)p; + for (i = 0;i < 128 * 128;i++) + if (pix[i] == 0) + pix[i] = 255; + pic->tex = R_LoadTexture (drawtexturepool, path, 128, 128, pix, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE); + } + else + pic->tex = R_LoadTexture (drawtexturepool, path, p->width, p->height, p->data, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE); + } + if (pic->tex == NULL && !strcmp(path, "ui/mousepointer.tga")) + pic->tex = draw_generatemousepointer(); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair1.tga")) + pic->tex = draw_generatecrosshair(0); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair2.tga")) + pic->tex = draw_generatecrosshair(1); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair3.tga")) + pic->tex = draw_generatecrosshair(2); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair4.tga")) + pic->tex = draw_generatecrosshair(3); + if (pic->tex == NULL && !strcmp(path, "gfx/crosshair5.tga")) + pic->tex = draw_generatecrosshair(4); + if (pic->tex == NULL) Sys_Error ("Draw_CachePic: failed to load %s", path); - SwapPic (dat); - // HACK HACK HACK --- we need to keep the bytes for - // the translatable player picture just for the menu - // configuration dialog - if (!strcmp (path, "gfx/menuplyr.lmp")) - memcpy (menuplyr_pixels, dat->data, dat->width*dat->height); - - pic->pic.width = dat->width; - pic->pic.height = dat->height; - - gl = (glpic_t *)pic->pic.data; - gl->texnum = GL_LoadPicTexture (dat); - gl->sl = 0; - gl->sh = 1; - gl->tl = 0; - gl->th = 1; - - return &pic->pic; + pic->width = R_TextureWidth(pic->tex); + pic->height = R_TextureHeight(pic->tex); + return pic; } -extern void LoadSky_f(void); - -extern char *QSG_EXTENSIONS; - /* =============== Draw_Init =============== */ -void rmain_registercvars(); -extern int buildnumber; - -void gl_draw_start() +static void gl_draw_start(void) { - int i; - - char_texture = loadtextureimage ("conchars", 0, 0, false, false); - if (!char_texture) - { - draw_chars = W_GetLumpName ("conchars"); - for (i=0 ; i<128*128 ; i++) - if (draw_chars[i] == 0) - draw_chars[i] = 255; // proper transparent color + drawtexturepool = R_AllocTexturePool(); - // now turn them into textures - char_texture = GL_LoadTexture ("charset", 128, 128, draw_chars, false, true, 1); - } + numcachepics = 0; + memset(cachepichash, 0, sizeof(cachepichash)); - conbacktexnum = loadtextureimage("gfx/conback", 0, 0, false, false); + char_texture = Draw_CachePic("conchars")->tex; +} - memset(scraptexnum, 0, sizeof(scraptexnum)); +static void gl_draw_shutdown(void) +{ + R_FreeTexturePool(&drawtexturepool); - // get the other pics we need - draw_disc = Draw_PicFromWad ("disc"); + numcachepics = 0; + memset(cachepichash, 0, sizeof(cachepichash)); } -void gl_draw_shutdown() +static void gl_draw_newmap(void) { } -char engineversion[40]; -int engineversionx, engineversiony; - -extern void GL_Textures_Init(); void GL_Draw_Init (void) { - int i; - Cvar_RegisterVariable (&qsg_version); Cvar_RegisterVariable (&scr_conalpha); - Cmd_AddCommand ("loadsky", &LoadSky_f); - -#ifdef NEHAHRA -#if defined(__linux__) - sprintf (engineversion, "DPNehahra Linux GL %.2f build %3i", (float) VERSION, buildnumber); -#elif defined(WIN32) - sprintf (engineversion, "DPNehahra Windows GL %.2f build %3i", (float) VERSION, buildnumber); -#else - sprintf (engineversion, "DPNehahra Unknown GL %.2f build %3i", (float) VERSION, buildnumber); -#endif -#else -#if defined(__linux__) - sprintf (engineversion, "DarkPlaces Linux GL %.2f build %3i", (float) VERSION, buildnumber); -#elif defined(WIN32) - sprintf (engineversion, "DarkPlaces Windows GL %.2f build %3i", (float) VERSION, buildnumber); -#else - sprintf (engineversion, "DarkPlaces Unknown GL %.2f build %3i", (float) VERSION, buildnumber); -#endif -#endif - for (i = 0;i < 40 && engineversion[i];i++) - engineversion[i] += 0x80; // shift to orange - engineversionx = vid.width - strlen(engineversion) * 8 - 8; - engineversiony = vid.height - 8; - - GL_Textures_Init(); - R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown); -} + numcachepics = 0; + memset(cachepichash, 0, sizeof(cachepichash)); -/* -================ -Draw_Character + R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap); +} -Draws one 8*8 graphics character with 0 being transparent. -It can be clipped to the top of the screen to allow the console to be -smoothly scrolled off. -================ -*/ -void Draw_Character (int x, int y, int num) +void R_DrawQueue(void) { - int row, col; - float frow, fcol, size; - - if (num == 32) - return; // space + int pos, num, chartexnum, overbright; + float x, y, w, h, s, t, u, v; + cachepic_t *pic; + drawqueue_t *dq; + char *str, *currentpic; + int batch, additive; + unsigned int color; + + if (!r_render.integer) + return; - num &= 255; - - if (y <= -8) - return; // totally off screen + glViewport(vid.realx, vid.realy, vid.realwidth, vid.realheight); - row = num>>4; - col = num&15; + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, vid.conwidth, vid.conheight, 0, -99999, 99999); - frow = row*0.0625; - fcol = col*0.0625; - size = 0.0625; + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); - if (!r_render.value) - return; - glBindTexture(GL_TEXTURE_2D, char_texture); - // LordHavoc: NEAREST mode on text if not scaling up - if ((int) vid.width < glwidth) - { - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - glColor3f(1,1,1); - glBegin (GL_QUADS); - glTexCoord2f (fcol, frow); - glVertex2f (x, y); - glTexCoord2f (fcol + size, frow); - glVertex2f (x+8, y); - glTexCoord2f (fcol + size, frow + size); - glVertex2f (x+8, y+8); - glTexCoord2f (fcol, frow + size); - glVertex2f (x, y+8); - glEnd (); - - // LordHavoc: revert to LINEAR mode - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -} + chartexnum = R_GetTexture(char_texture); -/* -================ -Draw_String -================ -*/ -// LordHavoc: sped this up a lot, and added maxlen -void Draw_String (int x, int y, char *str, int maxlen) -{ - int num; - float frow, fcol; - if (!r_render.value) - return; - if (y <= -8 || y >= (int) vid.height || x >= (int) vid.width || *str == 0) // completely offscreen or no text to print - return; - if (maxlen < 1) - maxlen = strlen(str); - else if (maxlen > (int) strlen(str)) - maxlen = strlen(str); - glBindTexture(GL_TEXTURE_2D, char_texture); + additive = false; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + currentpic = ""; + pic = NULL; + glBindTexture(GL_TEXTURE_2D, 0); + color = 0; + glColor4ub(0,0,0,0); // LordHavoc: NEAREST mode on text if not scaling up - if ((int) vid.width < glwidth) + /* + if (vid.realwidth <= (int) vid.conwidth) { glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECKGLERROR glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + CHECKGLERROR } - - glColor3f(1,1,1); - glBegin (GL_QUADS); - while (maxlen-- && x < (int) vid.width) // stop rendering when out of characters or room + else { - if ((num = *str++) != 32) // skip spaces - { - frow = (float) ((int) num >> 4)*0.0625; - fcol = (float) ((int) num & 15)*0.0625; - glTexCoord2f (fcol , frow );glVertex2f (x, y); - glTexCoord2f (fcol + 0.0625, frow );glVertex2f (x+8, y); - glTexCoord2f (fcol + 0.0625, frow + 0.0625);glVertex2f (x+8, y+8); - glTexCoord2f (fcol , frow + 0.0625);glVertex2f (x, y+8); - } - x += 8; + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + CHECKGLERROR + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + CHECKGLERROR } - glEnd (); - - // LordHavoc: revert to LINEAR mode - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -} - -void Draw_GenericPic (int texnum, float red, float green, float blue, float alpha, int x, int y, int width, int height) -{ - if (!r_render.value) - return; - glColor4f(red,green,blue,alpha); - glBindTexture(GL_TEXTURE_2D, texnum); - glBegin (GL_QUADS); - glTexCoord2f (0, 0);glVertex2f (x, y); - glTexCoord2f (1, 0);glVertex2f (x+width, y); - glTexCoord2f (1, 1);glVertex2f (x+width, y+height); - glTexCoord2f (0, 1);glVertex2f (x, y+height); - glEnd (); -} - -/* -============= -Draw_AlphaPic -============= -*/ -void Draw_AlphaPic (int x, int y, qpic_t *pic, float alpha) -{ - glpic_t *gl; - - if (scrap_dirty) - Scrap_Upload (); - gl = (glpic_t *)pic->data; - if (!r_render.value) - return; - glColor4f(1,1,1,alpha); - glBindTexture(GL_TEXTURE_2D, gl->texnum); - glBegin (GL_QUADS); - glTexCoord2f (gl->sl, gl->tl);glVertex2f (x, y); - glTexCoord2f (gl->sh, gl->tl);glVertex2f (x+pic->width, y); - glTexCoord2f (gl->sh, gl->th);glVertex2f (x+pic->width, y+pic->height); - glTexCoord2f (gl->sl, gl->th);glVertex2f (x, y+pic->height); - glEnd (); -} - - -/* -============= -Draw_Pic -============= -*/ -void Draw_Pic (int x, int y, qpic_t *pic) -{ - glpic_t *gl; - - if (scrap_dirty) - Scrap_Upload (); - gl = (glpic_t *)pic->data; - if (!r_render.value) - return; - glColor3f(1,1,1); - glBindTexture(GL_TEXTURE_2D, gl->texnum); - glBegin (GL_QUADS); - glTexCoord2f (gl->sl, gl->tl);glVertex2f (x, y); - glTexCoord2f (gl->sh, gl->tl);glVertex2f (x+pic->width, y); - glTexCoord2f (gl->sh, gl->th);glVertex2f (x+pic->width, y+pic->height); - glTexCoord2f (gl->sl, gl->th);glVertex2f (x, y+pic->height); - glEnd (); -} - - -/* -============= -Draw_PicTranslate - -Only used for the player color selection menu -============= -*/ -void Draw_PicTranslate (int x, int y, qpic_t *pic, byte *translation) -{ - int i, c; - byte *trans, *src, *dest; - - c = pic->width * pic->height; - src = menuplyr_pixels; - dest = trans = malloc(c); - for (i = 0;i < c;i++) - *dest++ = translation[*src++]; - - c = GL_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, false, true, 1); - free(trans); - - if (!r_render.value) - return; - Draw_GenericPic (c, 1,1,1,1, x, y, pic->width, pic->height); - /* - glBindTexture(GL_TEXTURE_2D, c); - glColor3f(1,1,1); - glBegin (GL_QUADS); - glTexCoord2f (0, 0);glVertex2f (x, y); - glTexCoord2f (1, 0);glVertex2f (x+pic->width, y); - glTexCoord2f (1, 1);glVertex2f (x+pic->width, y+pic->height); - glTexCoord2f (0, 1);glVertex2f (x, y+pic->height); - glEnd (); */ -} - - -/* -================ -Draw_ConsoleBackground - -================ -*/ -void Draw_ConsoleBackground (int lines) -{ - Draw_GenericPic (conbacktexnum, 1,1,1,scr_conalpha.value*lines/vid.height, 0, lines - vid.height, vid.width, vid.height); - // LordHavoc: draw version - Draw_String(engineversionx, lines - vid.height + engineversiony, engineversion, 9999); -} - -/* -============= -Draw_Fill - -Fills a box of pixels with a single color -============= -*/ -void Draw_Fill (int x, int y, int w, int h, int c) -{ - if (!r_render.value) - return; - glDisable (GL_TEXTURE_2D); - glColor3f (host_basepal[c*3]/255.0, host_basepal[c*3+1]/255.0, host_basepal[c*3+2]/255.0); - - glBegin (GL_QUADS); - - glVertex2f (x,y); - glVertex2f (x+w, y); - glVertex2f (x+w, y+h); - glVertex2f (x, y+h); - - glEnd (); - glColor3f(1,1,1); - glEnable (GL_TEXTURE_2D); -} -//============================================================================= - -//============================================================================= - -/* -================ -GL_Set2D - -Setup as if the screen was 320*200 -================ -*/ -void GL_Set2D (void) -{ - if (!r_render.value) - return; - glViewport (glx, gly, glwidth, glheight); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity (); - glOrtho (0, vid.width, vid.height, 0, -99999, 99999); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity (); - - glDisable (GL_DEPTH_TEST); - glDisable (GL_CULL_FACE); - glEnable (GL_BLEND); - glDisable (GL_ALPHA_TEST); - glEnable(GL_TEXTURE_2D); - - // LordHavoc: added this - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - glColor3f(1,1,1); -} - -// LordHavoc: SHOWLMP stuff -#define SHOWLMP_MAXLABELS 256 -typedef struct showlmp_s -{ - qboolean isactive; - float x; - float y; - char label[32]; - char pic[128]; -} showlmp_t; - -showlmp_t showlmp[SHOWLMP_MAXLABELS]; -void SHOWLMP_decodehide() -{ - int i; - byte *lmplabel; - lmplabel = MSG_ReadString(); - for (i = 0;i < SHOWLMP_MAXLABELS;i++) - if (showlmp[i].isactive && strcmp(showlmp[i].label, lmplabel) == 0) + overbright = v_overbrightbits.integer; + batch = false; + for (pos = 0;pos < r_refdef.drawqueuesize;pos += ((drawqueue_t *)(r_refdef.drawqueue + pos))->size) + { + dq = (drawqueue_t *)(r_refdef.drawqueue + pos); + if (dq->flags & DRAWFLAG_ADDITIVE) { - showlmp[i].isactive = false; - return; + if (!additive) + { + if (batch) + { + batch = false; + glEnd(); + } + additive = true; + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + } } -} - -void SHOWLMP_decodeshow() -{ - int i, k; - byte lmplabel[256], picname[256]; - float x, y; - strcpy(lmplabel,MSG_ReadString()); - strcpy(picname, MSG_ReadString()); - x = MSG_ReadByte(); - y = MSG_ReadByte(); - k = -1; - for (i = 0;i < SHOWLMP_MAXLABELS;i++) - if (showlmp[i].isactive) + else { - if (strcmp(showlmp[i].label, lmplabel) == 0) + if (additive) { - k = i; - break; // drop out to replace it + if (batch) + { + batch = false; + glEnd(); + } + additive = false; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } } - else if (k < 0) // find first empty one to replace - k = i; - if (k < 0) - return; // none found to replace - // change existing one - showlmp[k].isactive = true; - strcpy(showlmp[k].label, lmplabel); - strcpy(showlmp[k].pic, picname); - showlmp[k].x = x; - showlmp[k].y = y; -} + if (color != dq->color) + { + color = dq->color; + glColor4ub((byte)(((color >> 24) & 0xFF) >> overbright), (byte)(((color >> 16) & 0xFF) >> overbright), (byte)(((color >> 8) & 0xFF) >> overbright), (byte)(color & 0xFF)); + } + x = dq->x; + y = dq->y; + w = dq->scalex; + h = dq->scaley; + switch(dq->command) + { + case DRAWQUEUE_PIC: + str = (char *)(dq + 1); + if (*str) + { + if (strcmp(str, currentpic)) + { + if (batch) + { + batch = false; + glEnd(); + } + currentpic = str; + pic = Draw_CachePic(str); + glBindTexture(GL_TEXTURE_2D, R_GetTexture(pic->tex)); + } + if (w == 0) + w = pic->width; + if (h == 0) + h = pic->height; + if (!batch) + { + batch = true; + glBegin(GL_QUADS); + } + //DrawQuad(dq->x, dq->y, w, h, 0, 0, 1, 1); + glTexCoord2f (0, 0);glVertex2f (x , y ); + glTexCoord2f (1, 0);glVertex2f (x+w, y ); + glTexCoord2f (1, 1);glVertex2f (x+w, y+h); + glTexCoord2f (0, 1);glVertex2f (x , y+h); + } + else + { + if (currentpic[0]) + { + if (batch) + { + batch = false; + glEnd(); + } + currentpic = ""; + glBindTexture(GL_TEXTURE_2D, 0); + } + if (!batch) + { + batch = true; + glBegin(GL_QUADS); + } + //DrawQuad(dq->x, dq->y, dq->scalex, dq->scaley, 0, 0, 1, 1); + glTexCoord2f (0, 0);glVertex2f (x , y ); + glTexCoord2f (1, 0);glVertex2f (x+w, y ); + glTexCoord2f (1, 1);glVertex2f (x+w, y+h); + glTexCoord2f (0, 1);glVertex2f (x , y+h); + } + break; + case DRAWQUEUE_STRING: + str = (char *)(dq + 1); + if (strcmp("conchars", currentpic)) + { + if (batch) + { + batch = false; + glEnd(); + } + currentpic = "conchars"; + glBindTexture(GL_TEXTURE_2D, chartexnum); + } + if (!batch) + { + batch = true; + glBegin(GL_QUADS); + } + while ((num = *str++) && x < vid.conwidth) + { + if (num != ' ') + { + 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); + v = 0.0625f - (1.0f / 256.0f); + //DrawQuad(x, y, w, h, (num & 15)*0.0625f + (0.5f / 256.0f), (num >> 4)*0.0625f + (0.5f / 256.0f), 0.0625f - (1.0f / 256.0f), 0.0625f - (1.0f / 256.0f)); + glTexCoord2f (s , t );glVertex2f (x , y ); + glTexCoord2f (s+u, t );glVertex2f (x+w, y ); + glTexCoord2f (s+u, t+v);glVertex2f (x+w, y+h); + glTexCoord2f (s , t+v);glVertex2f (x , y+h); + } + x += w; + } + break; + } + } + if (batch) + glEnd(); + CHECKGLERROR -void SHOWLMP_drawall() -{ - int i; - for (i = 0;i < SHOWLMP_MAXLABELS;i++) - if (showlmp[i].isactive) - Draw_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic)); -} + if (!v_hwgamma.integer) + { + glDisable(GL_TEXTURE_2D); + CHECKGLERROR + t = v_contrast.value * (float) (1 << v_overbrightbits.integer); + if (t >= 1.01f) + { + glBlendFunc (GL_DST_COLOR, GL_ONE); + CHECKGLERROR + glBegin (GL_TRIANGLES); + while (t >= 1.01f) + { + if (t >= 2) + glColor3f (1, 1, 1); + else + glColor3f (t-1, t-1, t-1); + glVertex2f (-5000, -5000); + glVertex2f (10000, -5000); + glVertex2f (-5000, 10000); + t *= 0.5; + } + glEnd (); + CHECKGLERROR + } + else if (t <= 0.99f) + { + glBlendFunc(GL_ZERO, GL_SRC_COLOR); + CHECKGLERROR + glBegin(GL_TRIANGLES); + glColor3f(t, t, t); + glVertex2f(-5000, -5000); + glVertex2f(10000, -5000); + glVertex2f(-5000, 10000); + glEnd(); + CHECKGLERROR + } + if (v_brightness.value >= 0.01f) + { + glBlendFunc (GL_ONE, GL_ONE); + CHECKGLERROR + glColor3f (v_brightness.value, v_brightness.value, v_brightness.value); + CHECKGLERROR + glBegin (GL_TRIANGLES); + glVertex2f (-5000, -5000); + glVertex2f (10000, -5000); + glVertex2f (-5000, 10000); + glEnd (); + CHECKGLERROR + } + glEnable(GL_TEXTURE_2D); + CHECKGLERROR + } -void SHOWLMP_clear() -{ - int i; - for (i = 0;i < SHOWLMP_MAXLABELS;i++) - showlmp[i].isactive = false; + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + CHECKGLERROR + glEnable (GL_CULL_FACE); + CHECKGLERROR + glEnable (GL_DEPTH_TEST); + CHECKGLERROR + glDisable(GL_BLEND); + CHECKGLERROR + glColor3f(1,1,1); + CHECKGLERROR }