From 8f550d6d1fda01191271a9698e3da0cccd747052 Mon Sep 17 00:00:00 2001 From: TimeServ Date: Sat, 21 Jan 2006 03:10:16 +0000 Subject: [PATCH] half-alpha character rendering for software changed background to not blink added BX_COLOREDTEXT extension (although the FTE extension conflicts) fix to console clearing which should hopefully speed things up a little bit git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1886 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/console.c | 40 ++--- engine/common/console.h | 3 +- engine/gl/gl_draw.c | 14 +- engine/server/pr_cmds.c | 1 + engine/sw/d_trans.c | 7 +- engine/sw/sw_draw.c | 324 +++++++++++++++++++++------------------- engine/sw/sw_draw.h | 1 + 7 files changed, 206 insertions(+), 184 deletions(-) diff --git a/engine/client/console.c b/engine/client/console.c index d092e7439..0d2bb4fdf 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -23,22 +23,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // This is the standard RGBI palette used in CGA text mode consolecolours_t consolecolours[MAXCONCOLOURS] = { - { 0, 0, 0, 0, 0, 0 }, // black - { 0, 0, 170, 0, 0, 0.67}, // blue - { 0, 170, 0, 0, 0.67, 0 }, // green - { 0, 170, 170, 0, 0.67, 0.67}, // cyan - {170, 0, 0, 0.67, 0, 0 }, // red - {170, 0, 170, 0.67, 0, 0.67}, // magenta - {170, 85, 0, 0.67, 0.33, 0 }, // brown - {170, 170, 170, 0.67, 0.67, 0.67}, // light gray - { 85, 85, 85, 0.33, 0.33, 0.33}, // dark gray - { 85, 85, 255, 0.33, 0.33, 1 }, // light blue - { 85, 255, 85, 0.33, 1, 0.33}, // light green - { 85, 255, 255, 0.33, 1, 1 }, // light cyan - {255, 85, 85, 1, 0.33, 0.33}, // light red - {255, 85, 255, 1, 0.33, 1 }, // light magenta - {255, 255, 85, 1, 1, 0.33}, // yellow - {255, 255, 255, 1, 1, 1 } // white + {0, 0, 0 }, // black + {0, 0, 0.67}, // blue + {0, 0.67, 0 }, // green + {0, 0.67, 0.67}, // cyan + {0.67, 0, 0 }, // red + {0.67, 0, 0.67}, // magenta + {0.67, 0.33, 0 }, // brown + {0.67, 0.67, 0.67}, // light gray + {0.33, 0.33, 0.33}, // dark gray + {0.33, 0.33, 1 }, // light blue + {0.33, 1, 0.33}, // light green + {0.33, 1, 1 }, // light cyan + {1, 0.33, 0.33}, // light red + {1, 0.33, 1 }, // light magenta + {1, 1, 0.33}, // yellow + {1, 1, 1 } // white }; // This is for remapping the Q3 color codes to character masks, including ^9 @@ -405,7 +405,7 @@ void Con_Clear_f (void) //wide chars, not standard ascii for (i = 0; i < sizeof(con_main.text)/sizeof(conchar_t); i++) { - con_main.text[i] = ' '; + con_main.text[i] = CON_DEFAULTCHAR; // Q_memset (con_main.text, ' ', sizeof(con_main.text)); } } @@ -472,7 +472,7 @@ void Con_ResizeCon (console_t *con) con->linewidth = width; con->totallines = CON_TEXTSIZE / con->linewidth; for (i = 0; i < CON_TEXTSIZE; i++) - con->text[i] = ' '; + con->text[i] = CON_DEFAULTCHAR; // Q_memset (con->text, ' ', sizeof(con->text)); } else @@ -493,7 +493,7 @@ void Con_ResizeCon (console_t *con) Q_memcpy (tbuf, con->text, sizeof(con->text)); for (i = 0; i < sizeof(con->text)/sizeof(conchar_t); i++) - con->text[i] = ' '; + con->text[i] = CON_DEFAULTCHAR; // Q_memset (con->text, ' ', sizeof(con->text)); for (i=0 ; icurrent%con->totallines)*con->linewidth; max = min + con->linewidth; for (i = min; i < max; i++) - con->text[i] = ' '; + con->text[i] = CON_DEFAULTCHAR; // Q_memset (&con->text[(con->current%con_totallines)*con_linewidth] // , ' ', con_linewidth*sizeof(unsigned short)); diff --git a/engine/common/console.h b/engine/common/console.h index a162bece7..8a1a5198c 100644 --- a/engine/common/console.h +++ b/engine/common/console.h @@ -25,7 +25,6 @@ typedef unsigned int conchar_t; #define MAXCONCOLOURS 16 typedef struct { - int ir, ig, ib; float fr, fg, fb; } consolecolours_t; @@ -51,6 +50,8 @@ extern conchar_t q3codemasks[MAXQ3COLOURS]; #define CON_Q3MASK 0x0F100000 #define CON_WHITEMASK 0x0F000000 // must be constant. things assume this +#define CON_DEFAULTCHAR (CON_WHITEMASK | 32) + // RGBI standard colors #define COLOR_BLACK 0 #define COLOR_DARKBLUE 1 diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index cc9f80cde..c7a4d36e4 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -1288,13 +1288,6 @@ void GLDraw_ColouredCharacter (int x, int y, unsigned int num) { unsigned int col; - if (num & CON_BLINKTEXT) - { - if (!cl_noblink.value) - if ((int)(realtime*3) & 1) - return; - } - // draw background if (num & CON_NONCLEARBG) { @@ -1302,6 +1295,13 @@ void GLDraw_ColouredCharacter (int x, int y, unsigned int num) GLDraw_FillRGB(x, y, 8, 8, consolecolours[col].fr, consolecolours[col].fg, consolecolours[col].fb); } + if (num & CON_BLINKTEXT) + { + if (!cl_noblink.value) + if ((int)(realtime*3) & 1) + return; + } + // render character with foreground color col = (num & CON_FGMASK) >> CON_FGSHIFT; qglColor4f(consolecolours[col].fr, consolecolours[col].fg, consolecolours[col].fb, (num & CON_HALFALPHA)?0.5:1); diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 84d5b24b9..5a1f6a404 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -6244,6 +6244,7 @@ typedef struct lh_extension_s { lh_extension_t QSG_Extensions[] = { + {"BX_COLOREDTEXT"}, {"DP_CON_SET"}, #ifndef SERVERONLY {"DP_CON_SETA"}, //because the server doesn't write configs. diff --git a/engine/sw/d_trans.c b/engine/sw/d_trans.c index 5193e2dc1..8d31deece 100644 --- a/engine/sw/d_trans.c +++ b/engine/sw/d_trans.c @@ -19,6 +19,9 @@ int swzpal[TRANS_LEVELS][256]; palremap_t *RebuildMenuTint(void); palremap_t *mtpalremap; +// IB remap +palremap_t *ib_remap; + extern cvar_t r_menutint; int mtmodified; @@ -42,6 +45,7 @@ void D_ShutdownTrans(void) mtpalremap = NULL; mtmodified = 0; + ib_remap = NULL; } void D_InitTrans(void) @@ -54,6 +58,7 @@ void D_InitTrans(void) srctable = swzpal[0]; dsttable = swzpal[TRANS_MAX]; mtpalremap = RebuildMenuTint(); + ib_remap = D_IdentityRemap(); } // TODO: INLINE THESE FUNCTIONS @@ -86,7 +91,7 @@ void Set_TransLevelI(int level) } */ -void D_SetTransLevel(float level, blendmode_t blend) //MUST be between 0 and 1 +void D_SetTransLevel(float level, blendmode_t blend) { int ilvl; diff --git a/engine/sw/sw_draw.c b/engine/sw/sw_draw.c index a81b2ee1f..8c1e2a060 100644 --- a/engine/sw/sw_draw.c +++ b/engine/sw/sw_draw.c @@ -64,6 +64,12 @@ int swmenu_numcachepics; qbyte sw_crosshaircolor; +// current rendering blend for sw +extern palremap_t *ib_remap; +int ib_index; +int ib_ri, ib_gi, ib_bi, ib_ai; +qboolean ib_colorblend, ib_alphablend; + /* ================ Draw_CachePic @@ -670,15 +676,16 @@ void SWDraw_Character (int x, int y, unsigned int num) #define draw(p) drawpal(host_basepal[p*3]>>3,host_basepal[p*3+1]>>3,host_basepal[p*3+2]>>3) */ -#define draw(x) pr->pal[x] +#define draw(x) ib_remap->pal[x] +#define tdraw(x, y) Trans(x, ib_remap->pal[y]) void SWDraw_ColouredCharacter (int x, int y, unsigned int num) { qbyte *source; int drawline; int row, col; extern cvar_t cl_noblink; - unsigned int colour, bgcolour; - qboolean drawbg = false; + unsigned int colour; + qboolean alpha; if (y <= -8) return; // totally off screen @@ -687,10 +694,18 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) return; colour = (num & CON_FGMASK) >> CON_FGSHIFT; - bgcolour = (num & CON_BGMASK) >> CON_BGSHIFT; + alpha = !!(num & CON_HALFALPHA); if (num & CON_NONCLEARBG) - drawbg = true; + { + unsigned int bgcolour; + + bgcolour = (num & CON_BGMASK) >> CON_BGSHIFT; + SWDraw_FillRGB(x, (y < 0) ? 0 : y, 8, (y < 0) ? 8 + y : 8, + consolecolours[bgcolour].fr, + consolecolours[bgcolour].fg, + consolecolours[bgcolour].fb); + } if (num & CON_BLINKTEXT) { @@ -699,12 +714,17 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) return; } - if (colour == COLOR_WHITE && !drawbg) + if (colour == COLOR_WHITE && !alpha) { Draw_Character(x, y, num); return; } + SWDraw_ImageColours(consolecolours[colour].fr, + consolecolours[colour].fg, + consolecolours[colour].fb, + alpha ? 0.5 : 1); + num &= 255; row = num>>4; col = num&15; @@ -721,31 +741,29 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) if (r_pixbytes == 1) { - palremap_t *pr; qbyte *dest; dest = vid.conbuffer + y*vid.conrowbytes + x; - pr = D_GetPaletteRemap(consolecolours[colour].ir, - consolecolours[colour].ig, - consolecolours[colour].ib, - false, true, TOP_DEFAULT, BOTTOM_DEFAULT); - - if (drawbg) + if (alpha) { - int bgidx = GetPalette(consolecolours[bgcolour].ir, - consolecolours[bgcolour].ig, - consolecolours[bgcolour].ib); - while (drawline--) { - dest[0] = source[0] ? draw(source[0]) : bgidx; - dest[1] = source[1] ? draw(source[1]) : bgidx; - dest[2] = source[2] ? draw(source[2]) : bgidx; - dest[3] = source[3] ? draw(source[3]) : bgidx; - dest[4] = source[4] ? draw(source[4]) : bgidx; - dest[5] = source[5] ? draw(source[5]) : bgidx; - dest[6] = source[6] ? draw(source[6]) : bgidx; - dest[7] = source[7] ? draw(source[7]) : bgidx; + if (source[0]) + dest[0] = tdraw(dest[0], source[0]); + if (source[1]) + dest[1] = tdraw(dest[1], source[1]); + if (source[2]) + dest[2] = tdraw(dest[2], source[2]); + if (source[3]) + dest[3] = tdraw(dest[3], source[3]); + if (source[4]) + dest[4] = tdraw(dest[4], source[4]); + if (source[5]) + dest[5] = tdraw(dest[5], source[5]); + if (source[6]) + dest[6] = tdraw(dest[6], source[6]); + if (source[7]) + dest[7] = tdraw(dest[7], source[7]); source += 128; dest += vid.conrowbytes; } @@ -774,38 +792,27 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) dest += vid.conrowbytes; } } - - D_DereferenceRemap(pr); } else if (r_pixbytes == 2) { unsigned short *dest16; unsigned char *pal = (unsigned char *)d_8to32table; int i; - int rm, gm, bm; dest16 = (unsigned short *)vid.conbuffer + y*vid.conrowbytes + x; - rm = consolecolours[colour].ir>>3; - gm = consolecolours[colour].ig>>3; - bm = consolecolours[colour].ib>>3; - - if (drawbg) + if (alpha) { - int bgidx16 = (consolecolours[bgcolour].ir>>3) | - (consolecolours[bgcolour].ig>>3)<<5 | - (consolecolours[bgcolour].ib>>3)<<10; - while (drawline--) { for (i = 0; i < 8; i++) { if (source[i]) - dest16[i] = (((16+pal[source[i]*4+0]*bm)>>8)<<10)+ - (((16+pal[source[i]*4+1]*gm)>>8)<<5)+ - ((16+pal[source[i]*4+2]*rm)>>8); - else - dest16[i] = bgidx16; + { + dest16[i] = ((((128+pal[source[i]*4+0]*ib_ri)>>12)<<10) + ((dest16[i]&0x7B00)>>1)) | + ((((128+pal[source[i]*4+1]*ib_gi)>>12)<<5) + ((dest16[i]&0x03D0)>>1)) | + ((128+pal[source[i]*4+2]*ib_bi)>>12) + ((dest16[i]&0x001E)>>1); + } } source += 128; dest16 += vid.conrowbytes; @@ -818,9 +825,9 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) for (i = 0; i < 8; i++) { if (source[i]) - dest16[i] = (((16+pal[source[i]*4+0]*bm)>>8)<<10)+ - (((16+pal[source[i]*4+1]*gm)>>8)<<5)+ - ((16+pal[source[i]*4+2]*rm)>>8); + dest16[i] = (((128+pal[source[i]*4+0]*ib_ri)>>11)<<10)| + (((128+pal[source[i]*4+1]*ib_gi)>>11)<<5)| + ((128+pal[source[i]*4+2]*ib_bi)>>11); } source += 128; dest16 += vid.conrowbytes; @@ -833,8 +840,8 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) int i; unsigned char *pal = (unsigned char *)d_8to32table; dest = vid.conbuffer + (y*vid.conrowbytes + x)*r_pixbytes; - - if (drawbg) + + if (alpha) { while (drawline--) { @@ -842,16 +849,10 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) { if (source[i]) { - dest[0+i*4] = (128+pal[source[i]*4+0]*consolecolours[colour].ib)>>8; - dest[1+i*4] = (128+pal[source[i]*4+1]*consolecolours[colour].ig)>>8; - dest[2+i*4] = (128+pal[source[i]*4+2]*consolecolours[colour].ir)>>8; + dest[0+i*4] = ((128+pal[source[i]*4+0]*ib_bi)>>9) + (dest[0+i*4]>>1); + dest[1+i*4] = ((128+pal[source[i]*4+1]*ib_gi)>>9) + (dest[1+i*4]>>1); + dest[2+i*4] = ((128+pal[source[i]*4+2]*ib_ri)>>9) + (dest[2+i*4]>>1); } - else - { - dest[0+i*4] = consolecolours[bgcolour].ib; - dest[1+i*4] = consolecolours[bgcolour].ig; - dest[2+i*4] = consolecolours[bgcolour].ir; - } } source += 128; dest += vid.conrowbytes*r_pixbytes; @@ -865,9 +866,9 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) { if (source[i]) { - dest[0+i*4] = (128+pal[source[i]*4+0]*consolecolours[colour].ib)>>8; - dest[1+i*4] = (128+pal[source[i]*4+1]*consolecolours[colour].ig)>>8; - dest[2+i*4] = (128+pal[source[i]*4+2]*consolecolours[colour].ir)>>8; + dest[0+i*4] = (128+pal[source[i]*4+0]*ib_bi)>>8; + dest[1+i*4] = (128+pal[source[i]*4+1]*ib_gi)>>8; + dest[2+i*4] = (128+pal[source[i]*4+2]*ib_ri)>>8; } } source += 128; @@ -877,6 +878,7 @@ void SWDraw_ColouredCharacter (int x, int y, unsigned int num) } } #undef draw +#undef tdraw /* ================ @@ -1822,16 +1824,46 @@ void SWDraw_SubImage8( } } -static qboolean SWDraw_Image_Blend; -static int SWDraw_Image_Red=1, SWDraw_Image_Green=1, SWDraw_Image_Blue=1, SWDraw_Image_Alpha=1; void SWDraw_ImageColours (float r, float g, float b, float a) //like glcolour4f { - SWDraw_Image_Red=r*255; - SWDraw_Image_Green=g*255; - SWDraw_Image_Blue=b*255; - SWDraw_Image_Alpha=a*255; + int ri, gi, bi, ai; - SWDraw_Image_Blend = r<1 || b<1 || g<1 || a<1; + if (r_pixbytes == 1) + D_SetTransLevel(a, BM_BLEND); // 8bpp doesn't maintain blending correctly + + ri = 255*r; + gi = 255*g; + bi = 255*b; + ai = 255*a; + + if (ri == ib_ri && gi == ib_gi && bi == ib_bi && ai == ib_ai) + { + // nothing changed + return; + } + + ib_colorblend = (ri == 255 && gi == 255 && bi == 255) ? false : true; + ib_alphablend = (ai == 255) ? false : true; + + ib_ri = ri; + ib_gi = gi; + ib_bi = bi; + ib_ai = ai; + + switch (r_pixbytes) + { + case 1: + D_DereferenceRemap(ib_remap); + ib_remap = D_GetPaletteRemap(ri, gi, bi, false, true, TOP_DEFAULT, BOTTOM_DEFAULT); + ib_index = GetPalette(ri, gi, bi); + return; + case 2: + ib_index = ((ri << 3) >> 10) | ((gi << 3) >> 5) | (bi << 3); + return; + case 4: + ib_index = (ri << 16) | (gi << 8) | bi; + return; + } } void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, float s2, float t2, mpic_t *pic) @@ -1920,11 +1952,11 @@ void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, f } else { - if (SWDraw_Image_Blend) //blend it on + if (ib_colorblend || ib_alphablend) //blend it on { SWDraw_SubImageBlend32(xp, yp, wp, hp, s1, t1, s2, t2, pic->width, pic->height, pic->data, - SWDraw_Image_Red, SWDraw_Image_Green, SWDraw_Image_Blue, SWDraw_Image_Alpha); + ib_ri, ib_gi, ib_bi, ib_ai); } else //block colour (fast) @@ -2397,10 +2429,41 @@ Draw_Fill Fills a box of pixels with a single color ============= */ +void SWDraw_Fill32 (int x, int y, int w, int h, unsigned int c) +{ + int u, v; + unsigned int *p32dest; + + p32dest = (unsigned int*)vid.buffer + y*vid.rowbytes + x; + for (v=0 ; v vid.width || y < 0 || y + h > vid.height) { Con_Printf("Bad Draw_Fill(%d, %d, %d, %d, %c)\n", @@ -2408,31 +2471,47 @@ void SWDraw_Fill (int x, int y, int w, int h, int c) return; } - if (r_pixbytes == 1) + switch (r_pixbytes) { - qbyte *dest; - dest = vid.buffer + y*vid.rowbytes + x; - for (v=0 ; v vid.width || + y < 0 || y + h > vid.height) { + Con_Printf("Bad Draw_FillRGB(%d, %d, %d, %d)\n", + x, y, w, h); + return; } - else if (r_pixbytes == 2) - { - unsigned short *p16dest; - p16dest = (unsigned short*)vid.buffer + y*vid.rowbytes + x; - for (v=0 ; v vid.width || - y < 0 || y + h > vid.height) { - Con_Printf("Bad SWDraw_Box(%d, %d, %d, %d, %i)\n", - x, y, w, h, paletteindex); - return; - } - - if (r_pixbytes == 1) - { - dest = vid.buffer + y*vid.rowbytes + x; - for (v=0 ; v