Replace various GL rendering related literal flags with enum labels.

- pthtyp pth->flags bits
- Flags of the <dameth> argument of various functions
- hictinting[].f / gloadtile_hi() and daskinloader() <effect> arg bits
- hicreplctyp hicr->flags bits
- texcacheheader cachead.flags bits

git-svn-id: https://svn.eduke32.com/eduke32@4486 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2014-05-28 22:40:16 +00:00
parent 2c84d175ed
commit 69c867b8e3
8 changed files with 126 additions and 60 deletions

View file

@ -35,6 +35,32 @@ typedef struct texcachepic_t
} texcachepicture;
hicreplctyp * hicfindsubst(int picnum, int palnum, int skybox);
#define HICEFFECTMASK (1|2|4|8)
// texcacheheader cachead.flags bits
enum
{
CACHEAD_NONPOW2 = 1,
CACHEAD_HASALPHA = 2,
CACHEAD_COMPRESSED = 4,
};
// hicreplctyp hicr->flags bits
enum
{
HICR_NOSAVE = 1,
HICR_NOCOMPRESS = 16,
};
// hictinting[].f / gloadtile_hi() and daskinloader() <effect> arg bits
enum
{
HICTINT_GRAYSCALE = 1,
HICTINT_INVERT = 2,
HICTINT_COLORIZE = 4,
HICTINT_USEONART = 8,
HICEFFECTMASK = (1|2|4|8),
};
#endif

View file

@ -94,6 +94,28 @@ static inline int32_t fogpal_shade(const sectortype *sec, int32_t shade)
return sec->fogpal ? 0 : shade;
}
// Flags of the <dameth> argument of various functions
enum {
DAMETH_CLAMPED = 4,
DAMETH_NOCOMPRESS = 4096,
DAMETH_HI = 8192,
};
// DAMETH_CLAMPED -> PTH_CLAMPED conversion
#define TO_PTH_CLAMPED(dameth) ((((dameth)&4))>>2)
// pthtyp pth->flags bits
enum {
PTH_CLAMPED = 1,
PTH_HIGHTILE = 2,
PTH_SKYBOX = 4,
PTH_HASALPHA = 8,
PTH_HASFULLBRIGHT = 16,
PTH_INVALIDATED = 128,
};
typedef struct pthtyp_t
{
struct pthtyp_t *next;

View file

@ -624,20 +624,20 @@ static int32_t daskinloader(int32_t filh, intptr_t *fptr, int32_t *bpl, int32_t
tcol.g = cptr[rpptr[x].g];
tcol.r = cptr[rpptr[x].r];
if (effect & 1)
if (effect & HICTINT_GRAYSCALE)
{
// greyscale
tcol.b = max(tcol.b, max(tcol.g, tcol.r));
tcol.g = tcol.r = tcol.b;
}
if (effect & 2)
if (effect & HICTINT_INVERT)
{
// invert
tcol.b = 255-tcol.b;
tcol.g = 255-tcol.g;
tcol.r = 255-tcol.r;
}
if (effect & 4)
if (effect & HICTINT_COLORIZE)
{
// colorize
tcol.b = min((int32_t)(tcol.b)*b/64,255);
@ -782,7 +782,7 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
{
osizx = cachead.xdim;
osizy = cachead.ydim;
hasalpha = (cachead.flags & 2) ? 1 : 0;
hasalpha = (cachead.flags & CACHEAD_HASALPHA) ? 1 : 0;
if (pal < (MAXPALOOKUPS - RESERVEDPALS))
m->usesalpha = hasalpha;
//kclose(filh); // FIXME: uncomment when cache1d.c is fixed
@ -890,7 +890,8 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
if (xsiz == pow2long[j]) { i |= 1; }
if (ysiz == pow2long[j]) { i |= 2; }
}
cachead.flags = (i!=3) | (hasalpha ? 2 : 0);
cachead.flags = (i!=3)*CACHEAD_NONPOW2 | (hasalpha ? CACHEAD_HASALPHA : 0);
/// OSD_Printf("Caching \"%s\"\n",fn);
texcache_writetex(fn, picfillen, pal<<8, hicfxmask(pal), &cachead);
@ -2167,7 +2168,7 @@ static int32_t md3draw(md3model_t *m, const spritetype *tspr)
bglEnable(GL_TEXTURE_2D);
pc[0] = pc[1] = pc[2] = ((float)(numshades-min(max((globalshade * shadescale)+m->shadeoff,0),numshades)))/((float)numshades);
if (!(hictinting[globalpal].f&4))
if (!(hictinting[globalpal].f & HICTINT_COLORIZE))
{
if (!(m->flags&1) || (((unsigned)owner < MAXSPRITES) && sector[sprite[owner].sectnum].floorpal!=0))
{

View file

@ -1034,7 +1034,7 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
// if it's not a skybox, make the sky parallax
// DEFAULT_ARTSKY_ANGDIV is computed from eyeballed values
// need to recompute it if we ever change the max horiz amplitude
if (!pth || !(pth->flags & 4))
if (!pth || !(pth->flags & PTH_SKYBOX))
skyhoriz *= curskyangmul;
bglMatrixMode(GL_MODELVIEW);
@ -3874,7 +3874,7 @@ static void polymer_drawsky(int16_t tilenum, char palnum, int8_t shade)
pth = texcache_fetch(tilenum,0,0,0);
drawingskybox = 0;
if (pth && (pth->flags & 4))
if (pth && (pth->flags & PTH_SKYBOX))
polymer_drawskybox(tilenum, palnum, shade);
else
polymer_drawartsky(tilenum, palnum, shade);
@ -3924,7 +3924,7 @@ static void polymer_drawartsky(int16_t tilenum, char palnum, int8_t shad
glcolors[i][0] = glcolors[i][1] = glcolors[i][2] = getshadefactor(shade);
if (pth && (pth->flags & 2))
if (pth && (pth->flags & PTH_HIGHTILE))
{
if (pth->palnum != palnum)
{
@ -4015,7 +4015,7 @@ static void polymer_drawskybox(int16_t tilenum, char palnum, int8_t shad
color[0] = color[1] = color[2] = getshadefactor(shade);
if (pth && (pth->flags & 2))
if (pth && (pth->flags & PTH_HIGHTILE))
{
if (pth->palnum != palnum)
{
@ -4247,7 +4247,7 @@ static void polymer_drawmdsprite(spritetype *tspr)
// If that palette has a highpalookup, we'll never use tinting. We might use
// alternate skins if they exist later, though.
if (!usinghighpal && !(hictinting[tspr->pal].f&4))
if (!usinghighpal && !(hictinting[tspr->pal].f & HICTINT_COLORIZE))
{
if (!(m->flags&1) || (!(tspr->owner >= MAXSPRITES) && sector[sprite[tspr->owner].sectnum].floorpal!=0))
{
@ -4739,7 +4739,7 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile
material->diffusemodulation[2] =
(GLubyte)(getshadefactor(shade) * 0xFF);
if (pth->flags & 2)
if (pth->flags & PTH_HIGHTILE)
{
if (pth->palnum != pal)
{
@ -4769,7 +4769,7 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile
}
// PR_BIT_GLOW_MAP
if (r_fullbrights && pth->flags & 16)
if (r_fullbrights && pth->flags & PTH_HASFULLBRIGHT)
material->glowmap = pth->ofb->glpic;
}

View file

@ -253,7 +253,7 @@ static inline int32_t gltexmayhavealpha(int32_t dapicnum, int32_t dapalnum)
for (pth=texcache.list[j]; pth; pth=pth->next)
if (pth->picnum == dapicnum && pth->palnum == dapalnum)
return ((pth->flags&8) != 0);
return ((pth->flags&PTH_HASALPHA) != 0);
return 1;
}
@ -264,11 +264,12 @@ void gltexinvalidate(int32_t dapicnum, int32_t dapalnum, int32_t dameth)
pthtyp *pth;
for (pth=texcache.list[j]; pth; pth=pth->next)
if (pth->picnum == dapicnum && pth->palnum == dapalnum && (pth->flags & 1) == ((dameth&4)>>2))
if (pth->picnum == dapicnum && pth->palnum == dapalnum &&
(pth->flags & PTH_CLAMPED) == TO_PTH_CLAMPED(dameth))
{
pth->flags |= 128;
if (pth->flags & 16)
pth->ofb->flags |= 128;
pth->flags |= PTH_INVALIDATED;
if (pth->flags & PTH_HASFULLBRIGHT)
pth->ofb->flags |= PTH_INVALIDATED;
}
}
@ -286,9 +287,9 @@ void gltexinvalidatetype(int32_t type)
{
if (type == INVALIDATE_ALL || (type == INVALIDATE_ART && pth->hicr == NULL))
{
pth->flags |= 128;
if (pth->flags & 16)
pth->ofb->flags |= 128;
pth->flags |= PTH_INVALIDATED;
if (pth->flags & PTH_HASFULLBRIGHT)
pth->ofb->flags |= PTH_INVALIDATED;
}
}
}
@ -331,7 +332,7 @@ void gltexapplyprops(void)
{
bind_2d_texture(pth->glpic);
if (r_fullbrights && pth->flags & 16)
if (r_fullbrights && pth->flags & PTH_HASFULLBRIGHT)
bind_2d_texture(pth->ofb->glpic);
}
}
@ -398,7 +399,7 @@ void polymost_glreset()
for (pth=texcache.list[i]; pth;)
{
next = pth->next;
if (pth->flags & 16) // fullbright textures
if (pth->flags & PTH_HASFULLBRIGHT)
{
bglDeleteTextures(1,&pth->ofb->glpic);
Bfree(pth->ofb);
@ -756,10 +757,10 @@ static void fixtransparency(int32_t dapicnum, coltype *dapic, int32_t daxsiz, in
void uploadtexture(int32_t doalloc, int32_t xsiz, int32_t ysiz, int32_t intexfmt, int32_t texfmt, coltype *pic, int32_t tsizx, int32_t tsizy, int32_t dameth)
{
int32_t x2, y2, j, js=0;
const int32_t hi = (dameth&8192)?1:0;
const int32_t nocompress = (dameth&4096)?1:0;
const int32_t hi = (dameth & DAMETH_HI) ? 1 : 0;
const int32_t nocompress = (dameth & DAMETH_NOCOMPRESS) ? 1 : 0;
dameth &= ~(8192|4096);
dameth &= ~(DAMETH_HI|DAMETH_NOCOMPRESS);
if (gltexmaxsize <= 0)
{
@ -879,7 +880,7 @@ static void texture_setup(int32_t dameth)
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glanisotropy);
}
if (!(dameth&4))
if (!(dameth & DAMETH_CLAMPED))
{
bglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, !tile_is_sky(dapic) ? GL_REPEAT:
(glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP));
@ -949,7 +950,7 @@ int32_t gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dam
int32_t dacol;
int32_t x2 = (x < tsizx) ? x : x-tsizx;
if ((dameth&4) && (x >= tsizx || y >= tsizy)) //Clamp texture
if ((dameth & DAMETH_CLAMPED) && (x >= tsizx || y >= tsizy)) //Clamp texture
{
wpptr->r = wpptr->g = wpptr->b = wpptr->a = 0;
continue;
@ -1009,7 +1010,7 @@ int32_t gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dam
pth->palnum = dapal;
pth->shade = dashade;
pth->effects = 0;
pth->flags = ((dameth&4)>>2) | (hasalpha<<3);
pth->flags = TO_PTH_CLAMPED(dameth) | (hasalpha*PTH_HASALPHA);
pth->hicr = NULL;
if (hasfullbright && !fullbrightloadingpass)
@ -1022,7 +1023,7 @@ int32_t gloadtile_art(int32_t dapic, int32_t dapal, int32_t dashade, int32_t dam
if (!pth->ofb)
return 1;
pth->flags |= (1<<4);
pth->flags |= PTH_HASFULLBRIGHT;
if (gloadtile_art(dapic, dapal, 0, dameth, pth->ofb, 1))
return 1;
@ -1087,7 +1088,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
{
tsizx = cachead.xdim;
tsizy = cachead.ydim;
hasalpha = (cachead.flags & 2) ? 0 : 255;
hasalpha = (cachead.flags & CACHEAD_HASALPHA) ? 0 : 255;
}
else
{
@ -1181,20 +1182,22 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
tcol.r = cptr[rpptr[x].r];
tcol.a = rpptr[x].a; hasalpha &= rpptr[x].a;
if (effect & 1)
if (effect & HICTINT_GRAYSCALE)
{
// greyscale
tcol.b = max(tcol.b, max(tcol.g, tcol.r));
tcol.g = tcol.r = tcol.b;
}
if (effect & 2)
if (effect & HICTINT_INVERT)
{
// invert
tcol.b = 255-tcol.b;
tcol.g = 255-tcol.g;
tcol.r = 255-tcol.r;
}
if (effect & 4)
if (effect & HICTINT_COLORIZE)
{
// colorize
tcol.b = min((int32_t)((tcol.b)*r)/64,255);
@ -1209,7 +1212,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
}
}
if ((!(dameth&4)) || (facen)) //Duplicate texture pixels (wrapping tricks for non power of 2 texture sizes)
if ((!(dameth & DAMETH_CLAMPED)) || facen) //Duplicate texture pixels (wrapping tricks for non power of 2 texture sizes)
{
if (xsiz > tsizx) //Copy left to right
{
@ -1233,9 +1236,9 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
Bfree(picfil); picfil = 0;
if (tsizx>>r_downsize <= tilesizx[dapic] || tsizy>>r_downsize <= tilesizy[dapic])
hicr->flags |= 17;
hicr->flags |= (HICR_NOCOMPRESS + HICR_NOSAVE);
if (glinfo.texcompr && glusetexcompr && !(hicr->flags & 1))
if (glinfo.texcompr && glusetexcompr && !(hicr->flags & HICR_NOSAVE))
intexfmt = (hasalpha == 255) ? GL_COMPRESSED_RGB_ARB : GL_COMPRESSED_RGBA_ARB;
else if (hasalpha == 255) intexfmt = GL_RGB;
@ -1244,7 +1247,8 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
bglBindTexture(GL_TEXTURE_2D,pth->glpic);
fixtransparency(-1, pic,tsizx,tsizy,xsiz,ysiz,dameth);
uploadtexture(doalloc,xsiz,ysiz,intexfmt,texfmt,pic,-1,tsizy,dameth|8192|(hicr->flags & 16?4096:0));
uploadtexture(doalloc,xsiz,ysiz,intexfmt,texfmt,pic,-1,tsizy,
dameth | DAMETH_HI | (hicr->flags & HICR_NOCOMPRESS ? DAMETH_NOCOMPRESS : 0));
}
// precalculate scaling parameters for replacement
@ -1264,21 +1268,23 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
Bfree(pic); pic=NULL;
if (tsizx>>r_downsize <= tilesizx[dapic] || tsizy>>r_downsize <= tilesizy[dapic])
hicr->flags |= (16+1);
hicr->flags |= (HICR_NOCOMPRESS + HICR_NOSAVE);
pth->picnum = dapic;
pth->effects = effect;
pth->flags = ((dameth&4)>>2) + 2 + ((facen>0)<<2); if (hasalpha != 255) pth->flags |= 8;
pth->flags = TO_PTH_CLAMPED(dameth) + PTH_HIGHTILE + (facen>0)*PTH_SKYBOX;
if (hasalpha != 255)
pth->flags |= PTH_HASALPHA;
pth->skyface = facen;
pth->hicr = hicr;
if (glinfo.texcompr && glusetexcompr && glusetexcache && !(hicr->flags & 1))
if (glinfo.texcompr && glusetexcompr && glusetexcache && !(hicr->flags & HICR_NOSAVE))
if (!gotcache)
{
int32_t j, x;
// save off the compressed version
if (hicr->flags & 16) cachead.quality = 0;
if (hicr->flags & HICR_NOCOMPRESS) cachead.quality = 0;
else cachead.quality = r_downsize;
cachead.xdim = tsizx>>cachead.quality;
cachead.ydim = tsizy>>cachead.quality;
@ -1289,7 +1295,12 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
if (xsiz == pow2long[j]) { x |= 1; }
if (ysiz == pow2long[j]) { x |= 2; }
}
cachead.flags = (x!=3) | (hasalpha != 255 ? 2 : 0) | (hicr->flags&16 ? 8 : 0); // handle nocompress
// handle nocompress:
cachead.flags = (x!=3)*CACHEAD_NONPOW2 |
(hasalpha != 255 ? CACHEAD_HASALPHA : 0) |
(hicr->flags & HICR_NOCOMPRESS ? 8 : 0);
/// OSD_Printf("Caching \"%s\"\n", fn);
texcache_writetex(fn, picfillen+(dapalnum<<8), dameth, effect, &cachead);
@ -1441,7 +1452,7 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
return;
}
if (r_fullbrights && pth->flags & 16)
if (r_fullbrights && pth->flags & PTH_HASFULLBRIGHT)
if (indrawroomsandmasks)
{
if (!fullbrightdrawingpass)
@ -1505,7 +1516,7 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
if (glowpth && glowpth->hicr && (glowpth->hicr->palnum == GLOWPAL))
polymost_setupglowtexture(&texunits, glowpth ? glowpth->glpic : 0);
if (pth && (pth->flags & 2))
if (pth && (pth->flags & PTH_HIGHTILE))
{
hackscx = pth->scalex;
hackscy = pth->scaley;
@ -1589,9 +1600,9 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
// tinting happens only to hightile textures, and only if the texture we're
// rendering isn't for the same palette as what we asked for
if (!(hictinting[globalpal].f&4))
if (!(hictinting[globalpal].f & HICTINT_COLORIZE))
{
if (pth && (pth->flags & 2))
if (pth && (pth->flags & PTH_HIGHTILE))
{
if (pth->palnum != globalpal)
{
@ -1608,7 +1619,7 @@ void drawpoly(double *dpx, double *dpy, int32_t n, int32_t method)
}
}
// hack: this is for drawing the 8-bit crosshair recolored in polymost
else if (hictinting[globalpal].f & 8)
else if (hictinting[globalpal].f & HICTINT_USEONART)
{
pc[0] *= (float)hictinting[globalpal].r / 255.0;
pc[1] *= (float)hictinting[globalpal].g / 255.0;
@ -4866,7 +4877,7 @@ int32_t polymost_drawtilescreen(int32_t tilex, int32_t tiley, int32_t wallnum, i
else ratio = dimen/scy;
}
if (!pth || (pth->flags & 8))
if (!pth || (pth->flags & PTH_HASALPHA))
{
bglDisable(GL_TEXTURE_2D);
bglBegin(GL_TRIANGLE_FAN);

View file

@ -58,13 +58,15 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
{
if (pth->picnum == dapicnum && pth->palnum == si->palnum &&
(si->palnum>0 ? 1 : (pth->effects == hictinting[dapalnum].f)) &&
(pth->flags & (1+2+4)) == (((dameth&4)>>2)+2+((drawingskybox>0)<<2)) &&
(pth->flags & (PTH_CLAMPED + PTH_HIGHTILE + PTH_SKYBOX))
== (TO_PTH_CLAMPED(dameth) + PTH_HIGHTILE + (drawingskybox>0)*PTH_SKYBOX) &&
(drawingskybox>0 ? (pth->skyface == drawingskybox) : 1)
)
{
if (pth->flags & 128)
if (pth->flags & PTH_INVALIDATED)
{
pth->flags &= ~128;
pth->flags &= ~PTH_INVALIDATED;
if (gloadtile_hi(dapicnum,dapalnum,drawingskybox,si,dameth,pth,0,
(si->palnum>0) ? 0 : hictinting[dapalnum].f)) // reload tile
{
@ -86,12 +88,13 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
for (i = (GLTEXCACHEADSIZ - 1); i >= 0; i--)
for (pth2=texcache.list[i]; pth2; pth2=pth2->next)
{
if ((pth2->hicr) && (pth2->hicr->filename) && (Bstrcasecmp(pth2->hicr->filename, si->filename) == 0))
if (pth2->hicr && pth2->hicr->filename && Bstrcasecmp(pth2->hicr->filename, si->filename) == 0)
{
Bmemcpy(pth, pth2, sizeof(pthtyp));
pth->picnum = dapicnum;
pth->flags = ((dameth&4)>>2) + 2 + ((drawingskybox>0)<<2);
if (pth2->flags & 8) pth->flags |= 8; //hasalpha
pth->flags = TO_PTH_CLAMPED(dameth) + PTH_HIGHTILE + (drawingskybox>0)*PTH_SKYBOX;
if (pth2->flags & PTH_HASALPHA)
pth->flags |= PTH_HASALPHA;
pth->hicr = si;
pth->next = texcache.list[j];
@ -119,12 +122,13 @@ tryart:
// load from art
for (pth=texcache.list[j]; pth; pth=pth->next)
if (pth->picnum == dapicnum && pth->palnum == dapalnum && pth->shade == dashade &&
(pth->flags & (1+2)) == ((dameth&4)>>2)
(pth->flags & (PTH_CLAMPED+PTH_HIGHTILE)) == TO_PTH_CLAMPED(dameth)
)
{
if (pth->flags & 128)
if (pth->flags & PTH_INVALIDATED)
{
pth->flags &= ~128;
pth->flags &= ~PTH_INVALIDATED;
if (gloadtile_art(dapicnum,dapalnum,dashade,dameth,pth,0))
return NULL; //reload tile (for animations)
}

View file

@ -1,3 +1,5 @@
// XXX: This program is not in sync with EDuke32 (e.g. texcacheheader type).
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

View file

@ -3358,7 +3358,7 @@ void G_SetCrosshairColor(int32_t r, int32_t g, int32_t b)
#ifdef USE_OPENGL
// XXX: this makes us also load all hightile textures tinted with the crosshair color!
Bmemcpy(&hictinting[CROSSHAIR_PAL], &CrosshairColors, sizeof(palette_t));
hictinting[CROSSHAIR_PAL].f = 9;
hictinting[CROSSHAIR_PAL].f = HICTINT_USEONART | HICTINT_GRAYSCALE;
#endif
invalidatetile(CROSSHAIR, -1, -1);
}