X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=gl_draw.c;h=d9eebeb44ca70bc0f7bed524152ff8be6eb0380c;hp=bad2c8c711cfe2db24a1a25a11e985f59a88b4c3;hb=d7df76f224c0d0ebb8a3c7bc0c3125ba638206e6;hpb=d79f2246d951ca61d035fc1089e1de5d33f18b70 diff --git a/gl_draw.c b/gl_draw.c index bad2c8c7..d9eebeb4 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,105 +18,20 @@ 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 - -cvar_t qsg_version = {"qsg_version", "1"}; -cvar_t scr_conalpha = {"scr_conalpha", "1"}; +//#define GL_COLOR_INDEX8_EXT 0x80E5 -byte *draw_chars; // 8*8 graphic characters -qpic_t *draw_disc; +cvar_t scr_conalpha = {CVAR_SAVE, "scr_conalpha", "1"}; -int char_texture; +rtexture_t *char_texture; typedef struct { - int texnum; - float sl, tl, sh, th; + rtexture_t *tex; } glpic_t; -int conbacktexnum; - -/* -============================================================================= - - scrap allocation - - Allocate all the little status bar obejcts into a single texture - to crutch up stupid hardware / drivers - -============================================================================= -*/ - -/* -#define MAX_SCRAPS 2 -#define BLOCK_WIDTH 256 -#define BLOCK_HEIGHT 256 - -int scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH]; -byte scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT*4]; -qboolean scrap_dirty; - -// returns a texture number and the position inside it -int Scrap_AllocBlock (int w, int h, int *x, int *y) -{ - 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; - } - } - - 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 - { - */ - gl->texnum = GL_LoadPicTexture (p); - gl->sl = 0; - gl->sh = 1; - gl->tl = 0; - gl->th = 1; - //} - return p; -} +int pic_texels; +int pic_count; +rtexturepool_t *drawtexturepool; /* ================ Draw_CachePic ================ */ +// FIXME: qpic is evil qpic_t *Draw_CachePic (char *path) { cachepic_t *pic; int i; qpic_t *dat; glpic_t *gl; + rtexture_t *tex; - for (pic=menu_cachepics, i=0 ; iname)) return &pic->pic; @@ -206,99 +79,103 @@ qpic_t *Draw_CachePic (char *path) menu_numcachepics++; strcpy (pic->name, path); -// -// load the pic from disk -// - dat = (qpic_t *)COM_LoadTempFile (path, false); - if (!dat) - Sys_Error ("Draw_CachePic: failed to load %s", path); - SwapPic (dat); - + // FIXME: move this to menu code // 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; + { + dat = (qpic_t *)COM_LoadFile (path, false); + if (!dat) + Sys_Error("unable to load gfx/menuplyr.lmp"); + SwapPic (dat); - gl = (glpic_t *)pic->pic.data; - gl->texnum = loadtextureimage(path, 0, 0, false, false); - if (!gl->texnum) - gl->texnum = GL_LoadPicTexture (dat); - gl->sl = 0; - gl->sh = 1; - gl->tl = 0; - gl->th = 1; + memcpy (menuplyr_pixels, dat->data, dat->width*dat->height); + } - return &pic->pic; + // load the pic from disk + if ((tex = loadtextureimage(drawtexturepool, path, 0, 0, false, false, true))) + { + // load the pic from an image file + pic->pic.width = image_width; + pic->pic.height = image_height; + gl = (glpic_t *)pic->pic.data; + gl->tex = tex; + return &pic->pic; + } + else + { + qpic_t *p; + // load the pic from gfx.wad + p = W_GetLumpName (path); + if (!p) + Sys_Error ("Draw_CachePic: failed to load %s", path); + pic->pic.width = p->width; + pic->pic.height = p->height; + gl = (glpic_t *)pic->pic.data; + gl->tex = R_LoadTexture (drawtexturepool, path, p->width, p->height, p->data, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE); + return &pic->pic; + } } -extern void LoadSky_f(void); - /* =============== Draw_Init =============== */ -void rmain_registercvars(); -extern int buildnumber; - -void gl_draw_start() +static void gl_draw_start(void) { - int i; + int i; + byte *draw_chars; + + menu_numcachepics = 0; - char_texture = loadtextureimage ("conchars", 0, 0, false, false); + drawtexturepool = R_AllocTexturePool(); + char_texture = loadtextureimage (drawtexturepool, "conchars", 0, 0, false, false, true); if (!char_texture) { draw_chars = W_GetLumpName ("conchars"); - for (i=0 ; i<128*128 ; i++) + // convert font to proper transparent color + for (i = 0;i < 128 * 128;i++) if (draw_chars[i] == 0) - draw_chars[i] = 255; // proper transparent color + draw_chars[i] = 255; - // now turn them into textures - char_texture = GL_LoadTexture ("charset", 128, 128, draw_chars, false, true, 1); + // now turn into texture + char_texture = R_LoadTexture (drawtexturepool, "charset", 128, 128, draw_chars, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE); } - conbacktexnum = loadtextureimage("gfx/conback", 0, 0, false, false); + conbacktex = loadtextureimage(drawtexturepool, "gfx/conback", 0, 0, false, false, true); +} -// 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"); + menu_numcachepics = 0; } -void gl_draw_shutdown() +void SHOWLMP_clear(void); +static void gl_draw_newmap(void) { + SHOWLMP_clear(); } -char engineversion[40]; +extern 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); - -#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 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; + engineversion[i] |= 0x80; // shift to orange + engineversionx = vid.conwidth - strlen(engineversion) * 8 - 8; + engineversiony = vid.conheight - 8; + + menu_numcachepics = 0; - GL_Textures_Init(); - R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown); + R_RegisterModule("GL_Draw", gl_draw_start, gl_draw_shutdown, gl_draw_newmap); } /* @@ -330,17 +207,31 @@ void Draw_Character (int x, int y, int num) fcol = col*0.0625; size = 0.0625; - if (!r_render.value) + if (!r_render.integer) return; - glBindTexture(GL_TEXTURE_2D, char_texture); + glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture)); + CHECKGLERROR // LordHavoc: NEAREST mode on text if not scaling up - if (glwidth < (int) vid.width) + 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 + } + else + { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + CHECKGLERROR + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + CHECKGLERROR } - glColor3f(1,1,1); + if (lighthalf) + glColor3f(0.5f,0.5f,0.5f); + else + glColor3f(1.0f,1.0f,1.0f); + CHECKGLERROR glBegin (GL_QUADS); glTexCoord2f (fcol, frow); glVertex2f (x, y); @@ -351,10 +242,14 @@ void Draw_Character (int x, int y, int num) glTexCoord2f (fcol, frow + size); glVertex2f (x, y+8); glEnd (); + CHECKGLERROR // 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); +// if (vid.realwidth <= (int) vid.conwidth) +// { +// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +// } } /* @@ -367,26 +262,39 @@ void Draw_String (int x, int y, char *str, int maxlen) { int num; float frow, fcol; - if (!r_render.value) + if (!r_render.integer) return; - if (y <= -8 || y >= (int) vid.height || x >= (int) vid.width || *str == 0) // completely offscreen or no text to print + if (y <= -8 || y >= (int) vid.conheight || x >= (int) vid.conwidth || *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); + glBindTexture(GL_TEXTURE_2D, R_GetTexture(char_texture)); // LordHavoc: NEAREST mode on text if not scaling up - if (glwidth < (int) vid.width) + 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 + } + else + { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + CHECKGLERROR + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + CHECKGLERROR } - glColor3f(1,1,1); + if (lighthalf) + glColor3f(0.5f,0.5f,0.5f); + else + glColor3f(1.0f,1.0f,1.0f); + CHECKGLERROR glBegin (GL_QUADS); - while (maxlen-- && x < (int) vid.width) // stop rendering when out of characters or room + while (maxlen-- && x < (int) vid.conwidth) // stop rendering when out of characters or room { if ((num = *str++) != 32) // skip spaces { @@ -400,24 +308,45 @@ void Draw_String (int x, int y, char *str, int maxlen) x += 8; } glEnd (); + CHECKGLERROR // 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); +// if (vid.realwidth < (int) vid.conwidth) +// { +// 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) +void Draw_AdditiveString (int x, int y, char *str, int maxlen) { - if (!r_render.value) + if (!r_render.integer) return; - glColor4f(red,green,blue,alpha); - glBindTexture(GL_TEXTURE_2D, texnum); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + CHECKGLERROR + Draw_String(x, y, str, maxlen); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + CHECKGLERROR +} + +void Draw_GenericPic (rtexture_t *tex, float red, float green, float blue, float alpha, int x, int y, int width, int height) +{ + if (!r_render.integer) + return; + if (lighthalf) + glColor4f(red * 0.5f, green * 0.5f, blue * 0.5f, alpha); + else + glColor4f(red, green, blue, alpha); + CHECKGLERROR + glBindTexture(GL_TEXTURE_2D, R_GetTexture(tex)); + CHECKGLERROR 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 (); + CHECKGLERROR } /* @@ -427,21 +356,8 @@ 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 (); + if (pic) + Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,alpha, x,y,pic->width, pic->height); } @@ -452,21 +368,21 @@ Draw_Pic */ void Draw_Pic (int x, int y, qpic_t *pic) { - glpic_t *gl; + if (pic) + Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,1, x,y,pic->width, pic->height); +} -// 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 (); + +void Draw_AdditivePic (int x, int y, qpic_t *pic) +{ + if (pic) + { + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + CHECKGLERROR + Draw_GenericPic(((glpic_t *)pic->data)->tex, 1,1,1,1, x,y,pic->width, pic->height); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + CHECKGLERROR + } } @@ -481,29 +397,23 @@ void Draw_PicTranslate (int x, int y, qpic_t *pic, byte *translation) { int i, c; byte *trans, *src, *dest; + rtexture_t *rt; + + if (pic == NULL) + return; c = pic->width * pic->height; src = menuplyr_pixels; - dest = trans = malloc(c); + dest = trans = Mem_Alloc(tempmempool, c); for (i = 0;i < c;i++) *dest++ = translation[*src++]; - c = GL_LoadTexture ("translatedplayerpic", pic->width, pic->height, trans, false, true, 1); - free(trans); + rt = R_LoadTexture (drawtexturepool, "translatedplayerpic", pic->width, pic->height, trans, TEXTYPE_QPALETTE, TEXF_ALPHA | TEXF_PRECACHE); + Mem_Free(trans); - if (!r_render.value) + if (!r_render.integer) 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_GenericPic (rt, 1,1,1,1, x, y, pic->width, pic->height); } @@ -515,9 +425,9 @@ 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); + Draw_GenericPic (conbacktex, 1,1,1,scr_conalpha.value * lines / vid.conheight, 0, lines - vid.conheight, vid.conwidth, vid.conheight); // LordHavoc: draw version - Draw_String(engineversionx, lines - vid.height + engineversiony, engineversion, 9999); + Draw_String(engineversionx, lines - vid.conheight + engineversiony, engineversion, 9999); } /* @@ -529,10 +439,18 @@ 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) + if (!r_render.integer) 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); + CHECKGLERROR + if (lighthalf) + { + byte *tempcolor = (byte *)&d_8to24table[c]; + glColor4ub ((byte) (tempcolor[0] >> 1), (byte) (tempcolor[1] >> 1), (byte) (tempcolor[2] >> 1), tempcolor[3]); + } + else + glColor4ubv ((byte *)&d_8to24table[c]); + CHECKGLERROR glBegin (GL_QUADS); @@ -542,8 +460,11 @@ void Draw_Fill (int x, int y, int w, int h, int c) glVertex2f (x, y+h); glEnd (); + CHECKGLERROR glColor3f(1,1,1); + CHECKGLERROR glEnable (GL_TEXTURE_2D); + CHECKGLERROR } //============================================================================= @@ -558,28 +479,40 @@ Setup as if the screen was 320*200 */ void GL_Set2D (void) { - if (!r_render.value) + if (!r_render.integer) return; - glViewport (glx, gly, glwidth, glheight); + glViewport (vid.realx, vid.realy, vid.realwidth, vid.realheight); + CHECKGLERROR glMatrixMode(GL_PROJECTION); + CHECKGLERROR glLoadIdentity (); - glOrtho (0, vid.width, vid.height, 0, -99999, 99999); + CHECKGLERROR + glOrtho (0, vid.conwidth, vid.conheight, 0, -99999, 99999); + CHECKGLERROR glMatrixMode(GL_MODELVIEW); + CHECKGLERROR glLoadIdentity (); + CHECKGLERROR glDisable (GL_DEPTH_TEST); + CHECKGLERROR glDisable (GL_CULL_FACE); + CHECKGLERROR glEnable (GL_BLEND); - glDisable (GL_ALPHA_TEST); + CHECKGLERROR glEnable(GL_TEXTURE_2D); + CHECKGLERROR // LordHavoc: added this glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + CHECKGLERROR glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + CHECKGLERROR glColor3f(1,1,1); + CHECKGLERROR } // LordHavoc: SHOWLMP stuff @@ -595,7 +528,7 @@ typedef struct showlmp_s showlmp_t showlmp[SHOWLMP_MAXLABELS]; -void SHOWLMP_decodehide() +void SHOWLMP_decodehide(void) { int i; byte *lmplabel; @@ -608,15 +541,23 @@ void SHOWLMP_decodehide() } } -void SHOWLMP_decodeshow() +void SHOWLMP_decodeshow(void) { 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(); + if (gamemode == GAME_NEHAHRA) // LordHavoc: nasty old legacy junk + { + x = MSG_ReadByte(); + y = MSG_ReadByte(); + } + else + { + x = MSG_ReadShort(); + y = MSG_ReadShort(); + } k = -1; for (i = 0;i < SHOWLMP_MAXLABELS;i++) if (showlmp[i].isactive) @@ -639,7 +580,7 @@ void SHOWLMP_decodeshow() showlmp[k].y = y; } -void SHOWLMP_drawall() +void SHOWLMP_drawall(void) { int i; for (i = 0;i < SHOWLMP_MAXLABELS;i++) @@ -647,7 +588,7 @@ void SHOWLMP_drawall() Draw_Pic(showlmp[i].x, showlmp[i].y, Draw_CachePic(showlmp[i].pic)); } -void SHOWLMP_clear() +void SHOWLMP_clear(void) { int i; for (i = 0;i < SHOWLMP_MAXLABELS;i++)