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
This commit is contained in:
TimeServ 2005-12-02 02:38:10 +00:00
parent 87bf121760
commit 283c7f8454
7 changed files with 64 additions and 15 deletions

View file

@ -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 //used to live in glquake.h
qbyte GetPalette(int red, int green, int blue); 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_norefresh;
extern cvar_t r_drawentities; extern cvar_t r_drawentities;
extern cvar_t r_drawworld; extern cvar_t r_drawworld;

View file

@ -220,6 +220,7 @@ qbyte *Skin_Cache8 (skin_t *skin)
if (out) if (out)
return out; return out;
// TODO: we build a fullbright remap.. can we get rid of this?
#ifdef SWQUAKE #ifdef SWQUAKE
if (qrenderer == QR_SOFTWARE && r_pixbytes == 1 && cls.allow_fbskins<0.2) //only time FB has to exist... (gl can be disabled) if (qrenderer == QR_SOFTWARE && r_pixbytes == 1 && cls.allow_fbskins<0.2) //only time FB has to exist... (gl can be disabled)
{ {

View file

@ -450,6 +450,12 @@ qbyte *W_GetTexture(char *name, int *width, int *height, qboolean *usesalpha)//r
tex->height = LittleLong(tex->height); tex->height = LittleLong(tex->height);
for (j = 0;j < MIPLEVELS;j++) for (j = 0;j < MIPLEVELS;j++)
tex->offsets[j] = LittleLong(tex->offsets[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 data = W_ConvertWAD3Texture(tex, width, height, usesalpha); //this will add to the temp
BZ_Free(tex); BZ_Free(tex);
return data; return data;

View file

@ -1063,7 +1063,7 @@ void *Mod_LoadWall(char *name)
{ {
for (i=0; i < tex->width*tex->height; i++) //downgrade colour 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; in+=4;
} }
@ -1151,7 +1151,7 @@ void *Mod_LoadWall(char *name)
{ {
for (i=0; i < tex->width*tex->height; i++) //downgrade colour 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++;
} }
in = (qbyte *)tex+tex->offsets[0]; //shrink mips. in = (qbyte *)tex+tex->offsets[0]; //shrink mips.

View file

@ -7,12 +7,14 @@
void MakeVideoPalette(void); void MakeVideoPalette(void);
void MakeSwizzledPalette(void); void MakeSwizzledPalette(void);
void MakeFullbrightRemap(void);
int *srctable; int *srctable;
int *dsttable; int *dsttable;
qbyte *pal555to8; qbyte *pal555to8;
int swzpal[TRANS_LEVELS][256]; int swzpal[TRANS_LEVELS][256];
qbyte nofbremap[256];
#define palette host_basepal #define palette host_basepal
#define _abs(x) ((x)*(x)) #define _abs(x) ((x)*(x))
@ -22,6 +24,7 @@ void D_InitTrans(void)
// create pal555to8 and swizzled palette // create pal555to8 and swizzled palette
MakeVideoPalette(); MakeVideoPalette();
MakeSwizzledPalette(); MakeSwizzledPalette();
MakeFullbrightRemap();
srctable = swzpal[0]; srctable = swzpal[0];
dsttable = swzpal[TRANS_MAX]; dsttable = swzpal[TRANS_MAX];
@ -105,6 +108,28 @@ qbyte FindIndexFromRGB(int red, int green, int blue)
return best; 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)] #define FindPalette(r,g,b) pal555to8[((r&0xF8)>>3)|((g&0xF8)<<2)|((b&0xF8)<<7)]
qbyte GetPalette(int red, int green, int blue) 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); 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) void MakeVideoPalette(void)
{ {
FILE *f; 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) void MediaSW_ShowFrame8bit(qbyte *framedata, int inwidth, int inheight, qbyte *palette)
{ {
int y, x; int y, x;

View file

@ -125,7 +125,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath)
dat->data[i] = 255; dat->data[i] = 255;
} }
else 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); BZ_Free(image);
@ -160,7 +160,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath)
dat->data[i] = 255; dat->data[i] = 255;
} }
else 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); BZ_Free(image);
@ -195,7 +195,7 @@ mpic_t *SWDraw_SafeCachePic (char *extpath)
dat->data[i] = 255; dat->data[i] = 255;
} }
else 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); BZ_Free(image);
@ -325,7 +325,7 @@ mpic_t *SWDraw_MallocPic (char *path)
((mpic_t*)dat)->height = height; ((mpic_t*)dat)->height = height;
((mpic_t*)dat)->flags = 0; ((mpic_t*)dat)->flags = 0;
for (i = 0; i < width*height; i++) 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); BZ_Free(image);

View file

@ -549,7 +549,7 @@ void SWMod_LoadTextures (lump_t *l)
if (in[3] == 0) if (in[3] == 0)
*out++ = 255; *out++ = 255;
else 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. in = out-mt->width*mt->height; //shrink mips.
@ -705,15 +705,13 @@ void SWMod_NowLoadExternal(void)
qbyte *out; qbyte *out;
qboolean alphaed; qboolean alphaed;
unsigned int *out32; unsigned int *out32;
int width;
int height;
int t; int t;
for (t=0 ; t<loadmodel->numtextures ; t++) for (t=0 ; t<loadmodel->numtextures ; t++)
{ {
tx = loadmodel->textures[t]; tx = loadmodel->textures[t];
if (tx && !tx->offsets[0]) 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; i=0;
tx->offsets[0] = sizeof(texture_t); tx->offsets[0] = sizeof(texture_t);
tx->offsets[1] = tx->offsets[0] + tx->width*tx->pixbytes*tx->height; tx->offsets[1] = tx->offsets[0] + tx->width*tx->pixbytes*tx->height;
@ -774,7 +772,7 @@ void SWMod_NowLoadExternal(void)
if (in[3] == 0) if (in[3] == 0)
*out++ = 255; *out++ = 255;
else else
*out++ = GetPalette(in[0], in[1], in[2]); *out++ = GetPaletteNoFB(in[0], in[1], in[2]);
in += 4; in += 4;
} }
in = (qbyte *)tx+tx->offsets[0]; //shrink mips. 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. 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. 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) if (ppixin[i*4+3] < 128)
ppixout[i] = 255; //transparent. ppixout[i] = 255; //transparent.
else 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 else
@ -3593,7 +3591,7 @@ void SWMod_LoadSprite2Model (model_t *mod, void *buffer)
if (!framedata[j*4+3]) //make sure if (!framedata[j*4+3]) //make sure
frame->pixels[j] = 255; frame->pixels[j] = 255;
else 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); BZ_Free(framedata);