From 283c7f84543eefc34abee2a400c22effef64de80 Mon Sep 17 00:00:00 2001 From: TimeServ Date: Fri, 2 Dec 2005 02:38:10 +0000 Subject: [PATCH] fix to loading maps/models with fullbrights (sw) fix a rare crash with HLBSP textures git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1660 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/render.h | 1 + engine/client/skin.c | 1 + engine/client/wad.c | 6 ++++++ engine/common/gl_q2bsp.c | 4 ++-- engine/sw/d_trans.c | 43 ++++++++++++++++++++++++++++++++++++++++ engine/sw/sw_draw.c | 8 ++++---- engine/sw/sw_model.c | 16 +++++++-------- 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/engine/client/render.h b/engine/client/render.h index 741a86e81..f382bbb72 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -344,6 +344,7 @@ void R_RestartRenderer_f (void);//this goes here so we can save some stack when //used to live in glquake.h qbyte GetPalette(int red, int green, int blue); +qbyte GetPaletteNoFB(int red, int green, int blue); extern cvar_t r_norefresh; extern cvar_t r_drawentities; extern cvar_t r_drawworld; diff --git a/engine/client/skin.c b/engine/client/skin.c index 4fec52fe7..0526e9339 100644 --- a/engine/client/skin.c +++ b/engine/client/skin.c @@ -220,6 +220,7 @@ qbyte *Skin_Cache8 (skin_t *skin) if (out) return out; + // TODO: we build a fullbright remap.. can we get rid of this? #ifdef SWQUAKE if (qrenderer == QR_SOFTWARE && r_pixbytes == 1 && cls.allow_fbskins<0.2) //only time FB has to exist... (gl can be disabled) { diff --git a/engine/client/wad.c b/engine/client/wad.c index fdf275446..87e265fb6 100644 --- a/engine/client/wad.c +++ b/engine/client/wad.c @@ -450,6 +450,12 @@ qbyte *W_GetTexture(char *name, int *width, int *height, qboolean *usesalpha)//r tex->height = LittleLong(tex->height); for (j = 0;j < MIPLEVELS;j++) tex->offsets[j] = LittleLong(tex->offsets[j]); + + if (!strcmp(texname, "bn_painting3")) + { + int k = 0; + } + data = W_ConvertWAD3Texture(tex, width, height, usesalpha); //this will add to the temp BZ_Free(tex); return data; diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 9bc72c4de..6099bf7e7 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -1063,7 +1063,7 @@ void *Mod_LoadWall(char *name) { for (i=0; i < tex->width*tex->height; i++) //downgrade colour { - *out++ = GetPalette(in[0], in[1], in[2]); + *out++ = GetPaletteNoFB(in[0], in[1], in[2]); in+=4; } @@ -1151,7 +1151,7 @@ void *Mod_LoadWall(char *name) { for (i=0; i < tex->width*tex->height; i++) //downgrade colour { - *out++ = GetPalette(d_q28to24table[*in*3+0], d_q28to24table[*in*3+1], d_q28to24table[*in*3+2]); + *out++ = GetPaletteNoFB(d_q28to24table[*in*3+0], d_q28to24table[*in*3+1], d_q28to24table[*in*3+2]); in++; } in = (qbyte *)tex+tex->offsets[0]; //shrink mips. diff --git a/engine/sw/d_trans.c b/engine/sw/d_trans.c index eea4f4758..d5969158b 100644 --- a/engine/sw/d_trans.c +++ b/engine/sw/d_trans.c @@ -7,12 +7,14 @@ void MakeVideoPalette(void); void MakeSwizzledPalette(void); +void MakeFullbrightRemap(void); int *srctable; int *dsttable; qbyte *pal555to8; int swzpal[TRANS_LEVELS][256]; +qbyte nofbremap[256]; #define palette host_basepal #define _abs(x) ((x)*(x)) @@ -22,6 +24,7 @@ void D_InitTrans(void) // create pal555to8 and swizzled palette MakeVideoPalette(); MakeSwizzledPalette(); + MakeFullbrightRemap(); srctable = swzpal[0]; dsttable = swzpal[TRANS_MAX]; @@ -105,6 +108,28 @@ qbyte FindIndexFromRGB(int red, int green, int blue) return best; } +qbyte FindIndexFromRGBNoFB(int red, int green, int blue) +{ + int i, best=15; + int bestdif=256*256*256, curdif; + extern qbyte *host_basepal; + qbyte *pa; + + pa = host_basepal; + for (i = 0; i < 256 - vid.fullbright; i++, pa+=3) + { + curdif = _abs(red - pa[0]) + _abs(green - pa[1]) + _abs(blue - pa[2]); + if (curdif < bestdif) + { + if (curdif<1) + return i; + bestdif = curdif; + best = i; + } + } + return best; +} + #define FindPalette(r,g,b) pal555to8[((r&0xF8)>>3)|((g&0xF8)<<2)|((b&0xF8)<<7)] qbyte GetPalette(int red, int green, int blue) { @@ -114,6 +139,14 @@ qbyte GetPalette(int red, int green, int blue) return FindIndexFromRGB(red, green, blue); } +qbyte GetPaletteNoFB(int red, int green, int blue) +{ + if (pal555to8) //fast precalculated (but ugly) method + return nofbremap[FindPalette(red,green,blue)]; + else //slow, horrible (but accurate) method. + return FindIndexFromRGBNoFB(red, green, blue); +} + void MakeVideoPalette(void) { FILE *f; @@ -168,6 +201,16 @@ void MakeSwizzledPalette(void) } } +void MakeFullbrightRemap(void) +{ + int i; + + for (i = 0; i < 256 - vid.fullbright; i++) + nofbremap[i] = i; + for (i = 256 - vid.fullbright; i < 256; i++) + nofbremap[i] = FindIndexFromRGBNoFB(host_basepal[i*3], host_basepal[i*3+1], host_basepal[i*3+2]); +} + void MediaSW_ShowFrame8bit(qbyte *framedata, int inwidth, int inheight, qbyte *palette) { int y, x; diff --git a/engine/sw/sw_draw.c b/engine/sw/sw_draw.c index 0c881e23c..6a9bf0743 100644 --- a/engine/sw/sw_draw.c +++ b/engine/sw/sw_draw.c @@ -125,7 +125,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath) dat->data[i] = 255; } else - dat->data[i] = GetPalette(image[i*4], image[i*4+1], image[i*4+2]); + dat->data[i] = GetPaletteNoFB(image[i*4], image[i*4+1], image[i*4+2]); } BZ_Free(image); @@ -160,7 +160,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath) dat->data[i] = 255; } else - dat->data[i] = GetPalette(image[i*4], image[i*4+1], image[i*4+2]); + dat->data[i] = GetPaletteNoFB(image[i*4], image[i*4+1], image[i*4+2]); } BZ_Free(image); @@ -195,7 +195,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath) dat->data[i] = 255; } else - dat->data[i] = GetPalette(image[i*4], image[i*4+1], image[i*4+2]); + dat->data[i] = GetPaletteNoFB(image[i*4], image[i*4+1], image[i*4+2]); } BZ_Free(image); @@ -325,7 +325,7 @@ mpic_t *SWDraw_MallocPic (char *path) ((mpic_t*)dat)->height = height; ((mpic_t*)dat)->flags = 0; for (i = 0; i < width*height; i++) - dat->data[i] = GetPalette(image[i*4], image[i*4+1], image[i*4+2]); + dat->data[i] = GetPaletteNoFB(image[i*4], image[i*4+1], image[i*4+2]); BZ_Free(image); diff --git a/engine/sw/sw_model.c b/engine/sw/sw_model.c index a93e7b6be..6f4f9ea69 100644 --- a/engine/sw/sw_model.c +++ b/engine/sw/sw_model.c @@ -549,7 +549,7 @@ void SWMod_LoadTextures (lump_t *l) if (in[3] == 0) *out++ = 255; else - *out++ = GetPalette(in[0], in[1], in[2]); + *out++ = GetPaletteNoFB(in[0], in[1], in[2]); } in = out-mt->width*mt->height; //shrink mips. @@ -705,15 +705,13 @@ void SWMod_NowLoadExternal(void) qbyte *out; qboolean alphaed; unsigned int *out32; - int width; - int height; int t; for (t=0 ; tnumtextures ; t++) { tx = loadmodel->textures[t]; if (tx && !tx->offsets[0]) { - in = W_GetTexture(tx->name, &width, &height, &alphaed); + in = W_GetTexture(tx->name, &(tx->width), &(tx->height), &alphaed); i=0; tx->offsets[0] = sizeof(texture_t); tx->offsets[1] = tx->offsets[0] + tx->width*tx->pixbytes*tx->height; @@ -774,7 +772,7 @@ void SWMod_NowLoadExternal(void) if (in[3] == 0) *out++ = 255; else - *out++ = GetPalette(in[0], in[1], in[2]); + *out++ = GetPaletteNoFB(in[0], in[1], in[2]); in += 4; } in = (qbyte *)tx+tx->offsets[0]; //shrink mips. @@ -2781,7 +2779,7 @@ void SWMod_LoadAlias2Model (model_t *mod, void *buffer) { for (j = 0; j < skinsize; j++) //you know when you've been palettized. { - skin[j+0] = GetPalette(texture[j*4+0], texture[j*4+1], texture[j*4+2]); + skin[j+0] = GetPaletteNoFB(texture[j*4+0], texture[j*4+1], texture[j*4+2]); } } @@ -3106,7 +3104,7 @@ void SWMod_LoadAlias3Model (model_t *mod, void *buffer) { for (j = 0; j < skinsize; j++) //you know when you've been palettized. { - skin[j+0] = GetPalette(texture[j*4+0], texture[j*4+1], texture[j*4+2]); + skin[j+0] = GetPaletteNoFB(texture[j*4+0], texture[j*4+1], texture[j*4+2]); } } @@ -3293,7 +3291,7 @@ void * SWMod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int version) if (ppixin[i*4+3] < 128) ppixout[i] = 255; //transparent. else - ppixout[i] = GetPalette(ppixin[i*4], ppixin[i*4+1], ppixin[i*4+2]); + ppixout[i] = GetPaletteNoFB(ppixin[i*4], ppixin[i*4+1], ppixin[i*4+2]); } } else @@ -3593,7 +3591,7 @@ void SWMod_LoadSprite2Model (model_t *mod, void *buffer) if (!framedata[j*4+3]) //make sure frame->pixels[j] = 255; else - frame->pixels[j] = GetPalette(framedata[j*4+0], framedata[j*4+1], framedata[j*4+2]); + frame->pixels[j] = GetPaletteNoFB(framedata[j*4+0], framedata[j*4+1], framedata[j*4+2]); } } BZ_Free(framedata);