extracolormap_t refinement and netsyncing

* Store raw values per rgba in extracolormap_t (no maskcolor or fadecolor)
* Crunched some UINT16/32 into UINT8
* Calculate mask values in R_CreateLightTable
* ifdef out EXTRACOLORMAPLUMPS
This commit is contained in:
mazmazz 2018-09-10 20:36:34 -04:00
parent c92226890e
commit 8d78c22194
4 changed files with 228 additions and 75 deletions

View file

@ -21,6 +21,7 @@
#include "p_local.h"
#include "p_setup.h"
#include "p_saveg.h"
#include "r_data.h"
#include "r_things.h"
#include "r_state.h"
#include "w_wad.h"
@ -494,7 +495,7 @@ static void P_NetUnArchivePlayers(void)
// diff3 flags
#define SD_TAGLIST 0x01
#define SD_MIDMAP 0x02
#define SD_COLORMAP 0x02
#define LD_FLAG 0x01
#define LD_SPECIAL 0x02
@ -589,8 +590,8 @@ static void P_NetArchiveWorld(void)
diff2 |= SD_TAG;
if (ss->nexttag != ss->spawn_nexttag || ss->firsttag != ss->spawn_firsttag)
diff3 |= SD_TAGLIST;
if (ss->midmap != ss->spawn_midmap)
diff3 |= SD_MIDMAP;
if (ss->extra_colormap != ss->spawn_extra_colormap)
diff3 |= SD_COLORMAP;
// Check if any of the sector's FOFs differ from how they spawned
if (ss->ffloors)
@ -654,8 +655,30 @@ static void P_NetArchiveWorld(void)
WRITEINT32(put, ss->firsttag);
WRITEINT32(put, ss->nexttag);
}
if (diff3 & SD_MIDMAP)
WRITEINT32(put, ss->midmap);
if (diff3 & SD_COLORMAP)
{
WRITEUINT8(put, ss->extra_colormap->fadestart);
WRITEUINT8(put, ss->extra_colormap->fadeend);
WRITEUINT8(put, ss->extra_colormap->fadedist);
WRITEUINT8(put, (UINT8)ss->extra_colormap->fog);
WRITEUINT8(put, ss->extra_colormap->cr);
WRITEUINT8(put, ss->extra_colormap->cg);
WRITEUINT8(put, ss->extra_colormap->cb);
WRITEUINT8(put, ss->extra_colormap->ca);
WRITEUINT8(put, ss->extra_colormap->cfr);
WRITEUINT8(put, ss->extra_colormap->cfg);
WRITEUINT8(put, ss->extra_colormap->cfb);
WRITEUINT8(put, ss->extra_colormap->cfa);
WRITEINT32(put, ss->extra_colormap->rgba);
WRITEINT32(put, ss->extra_colormap->fadergba);
#ifdef EXTRACOLORMAPLUMPS
WRITESTRINGN(put, ss->extra_colormap->lumpname, 9);
#endif
}
// Special case: save the stats of all modified ffloors along with their ffloor "number"s
// we don't bother with ffloors that haven't changed, that would just add to savegame even more than is really needed
@ -850,8 +873,87 @@ static void P_NetUnArchiveWorld(void)
sectors[i].firsttag = READINT32(get);
sectors[i].nexttag = READINT32(get);
}
if (diff3 & SD_MIDMAP)
sectors[i].midmap = READINT32(get);
if (diff3 & SD_COLORMAP)
{
extracolormap_t *exc;
UINT8 fadestart = READUINT8(get),
fadeend = READUINT8(get),
fadedist = READUINT8(get);
boolean fog = (boolean)READUINT8(get);
UINT8 cr = READUINT8(get),
cg = READUINT8(get),
cb = READUINT8(get),
ca = READUINT8(get),
cfr = READUINT8(get),
cfg = READUINT8(get),
cfb = READUINT8(get),
cfa = READUINT8(get);
INT32 rgba = READINT32(get),
fadergba = READINT32(get);
#ifdef EXTRACOLORMAPLUMPS
char lumpname[9];
READSTRINGN(get, lumpname, 9);
if (lumpname[0])
sectors[i].extra_colormap = R_ColormapForName(lumpname);
else
{
#endif
for (exc = extra_colormaps; exc; exc = exc->next)
{
#ifdef EXTRACOLORMAPLUMPS
if (exc->lump != LUMPERROR)
continue;
#endif
if (cr == exc->cr && cg == exc->cg && cb == exc->cb && ca == exc->ca
&& cfr == exc->cfr && cfg == exc->cfg && cfb == exc->cfb && cfa == exc->cfa
&& fadestart == exc->fadestart
&& fadeend == exc->fadeend
&& fog == exc->fog)
break;
}
if (!exc)
{
exc = Z_Calloc(sizeof (*exc), PU_LEVEL, NULL);
exc->fadestart = fadestart;
exc->fadeend = fadeend;
exc->fadedist = fadedist;
exc->fog = fog;
exc->cr = cr;
exc->cg = cg;
exc->cb = cb;
exc->ca = ca;
exc->cfr = cfr;
exc->cfg = cfg;
exc->cfb = cfb;
exc->cfa = cfa;
exc->rgba = rgba;
exc->fadergba = fadergba;
exc->colormap = R_CreateLightTable(exc);
R_AddColormapToList(exc);
sectors[i].extra_colormap = exc;
#ifdef EXTRACOLORMAPLUMPS
exc->lump = LUMPERROR;
exc->lumpname[0] = 0;
} // if (!exc) // if (!lumpname[0] || !R_ColormapForName(lumpname))
#endif
}
}
if (diff & SD_FFLOORS)
{

View file

@ -1160,6 +1160,7 @@ static inline lumpnum_t R_CheckNumForNameList(const char *name, lumplist_t *list
return LUMPERROR;
}
#ifdef EXTRACOLORMAPLUMPS
static lumplist_t *colormaplumps = NULL; ///\todo free leak
static size_t numcolormaplumps = 0;
@ -1195,6 +1196,7 @@ static void R_InitExtraColormaps(void)
}
CONS_Printf(M_GetText("Number of Extra Colormaps: %s\n"), sizeu1(numcolormaplumps));
}
#endif
// Search for flat name through all
lumpnum_t R_GetFlatNumForName(const char *name)
@ -1291,7 +1293,9 @@ static void R_InitColormaps(void)
// Init Boom colormaps.
R_ClearColormaps();
#ifdef EXTRACOLORMAPLUMPS
R_InitExtraColormaps();
#endif
}
void R_ReInitColormaps(UINT16 num)
@ -1354,6 +1358,7 @@ void R_AddColormapToList(extracolormap_t *extra_colormap)
extra_colormap->next = 0;
}
#ifdef EXTRACOLORMAPLUMPS
extracolormap_t *R_ColormapForName(char *name)
{
lumpnum_t lump;
@ -1370,6 +1375,8 @@ extracolormap_t *R_ColormapForName(char *name)
exc = Z_Calloc(sizeof (*exc), PU_LEVEL, NULL);
exc->lump = lump;
strncpy(exc->lumpname, name, 9);
exc->lumpname[8] = 0;
// aligned on 8 bit for asm code
exc->colormap = Z_MallocAlign(W_LumpLength(lump), PU_LEVEL, NULL, 16);
@ -1377,15 +1384,21 @@ extracolormap_t *R_ColormapForName(char *name)
// We set all params of the colormap to normal because there
// is no real way to tell how GL should handle a colormap lump anyway..
exc->maskcolor = 0xffff;
exc->fadecolor = 0x0;
exc->maskamt = 0x0;
exc->cr = exc->cg = exc->cb = 0xff;
exc->ca = 0;
exc->cfr = exc->cfg = exc->cfb = 0;
exc->cfa = 18;
exc->fadestart = 0;
exc->fadeend = 31;
exc->fog = 0;
exc->rgba = 0;
exc->fadergba = 0x19000000;
R_AddColormapToList(exc);
return exc;
}
#endif
//
// R_CreateColormap
@ -1402,21 +1415,58 @@ static int RoundUp(double number);
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
{
double cmaskr, cmaskg, cmaskb, cdestr, cdestg, cdestb;
double maskamt = 0, othermask = 0;
UINT8 cr = extra_colormap->cr,
cg = extra_colormap->cg,
cb = extra_colormap->cb,
ca = extra_colormap->ca,
cfr = extra_colormap->cfr,
cfg = extra_colormap->cfg,
cfb = extra_colormap->cfb;
// cfa = extra_colormap->cfa; // unused in software
UINT32 fadestart = (UINT16)extra_colormap->fadestart,
fadedist = extra_colormap->fadedist;
double othermask = extra_colormap->othermask,
cmaskr = extra_colormap->cmaskr,
cmaskg = extra_colormap->cmaskg,
cmaskb = extra_colormap->cmaskb,
cdestr = extra_colormap->cdestr,
cdestg = extra_colormap->cdestg,
cdestb = extra_colormap->cdestb;
lighttable_t *lighttable = NULL;
size_t i;
/////////////////////
// Calc the RGBA mask
/////////////////////
cmaskr = cr;
cmaskg = cg;
cmaskb = cb;
maskamt = (double)(ca/24.0l);
othermask = 1 - maskamt;
maskamt /= 0xff;
cmaskr *= maskamt;
cmaskg *= maskamt;
cmaskb *= maskamt;
/////////////////////
// Calc the RGBA fade mask
/////////////////////
cdestr = cfr;
cdestg = cfg;
cdestb = cfb;
// fade alpha unused in software
// maskamt = (double)(cfa/24.0l);
// othermask = 1 - maskamt;
// maskamt /= 0xff;
// cdestr *= maskamt;
// cdestg *= maskamt;
// cdestb *= maskamt;
/////////////////////
// This code creates the colormap array used by software renderer
/////////////////////
if (rendermode == render_soft)
{
double r, g, b, cbrightness;
@ -1494,12 +1544,10 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
{
double cmaskr, cmaskg, cmaskb, cdestr, cdestg, cdestb;
double maskamt = 0, othermask = 0;
int mask, fog = 0;
boolean fog = false;
extracolormap_t *extra_colormap, *exc;
UINT32 cr, cg, cb, maskcolor, fadecolor;
UINT8 cr, cg, cb, ca, cfr, cfg, cfb, cfa;
UINT32 fadestart = 0, fadeend = 31, fadedist = 31;
INT32 rgba, fadergba;
@ -1509,27 +1557,15 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
if (p1[0] == '#')
{
cr = ((HEX2INT(p1[1]) * 16) + HEX2INT(p1[2]));
cmaskr = cr;
cg = ((HEX2INT(p1[3]) * 16) + HEX2INT(p1[4]));
cmaskg = cg;
cb = ((HEX2INT(p1[5]) * 16) + HEX2INT(p1[6]));
cmaskb = cb;
// Create a rough approximation of the color (a 16 bit color)
maskcolor = ((cb) >> 3) + (((cg) >> 2) << 5) + (((cr) >> 3) << 11);
if (p1[7] >= 'a' && p1[7] <= 'z')
mask = (p1[7] - 'a');
ca = (p1[7] - 'a');
else if (p1[7] >= 'A' && p1[7] <= 'Z')
mask = (p1[7] - 'A');
ca = (p1[7] - 'A');
else
mask = 24;
maskamt = (double)(mask/24.0l);
othermask = 1 - maskamt;
maskamt /= 0xff;
cmaskr *= maskamt;
cmaskg *= maskamt;
cmaskb *= maskamt;
ca = 24;
// for opengl; generate on software too for netsync
rgba = (HEX2INT(p1[1]) << 4) + (HEX2INT(p1[2]) << 0) +
@ -1543,9 +1579,8 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
}
else
{
cmaskr = cmaskg = cmaskb = 0xff;
maskamt = 0;
maskcolor = ((0xff) >> 3) + (((0xff) >> 2) << 5) + (((0xff) >> 3) << 11);
cr = cg = cb = 0xff;
ca = 0;
rgba = 0;
}
@ -1560,16 +1595,22 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
if (fadeend > 31 || fadeend < 1)
fadeend = 31;
fadedist = fadeend - fadestart;
fog = NUMFROMCHAR(p2[1]);
fog = (boolean)NUMFROMCHAR(p2[1]);
}
#undef NUMFROMCHAR
if (p3[0] == '#')
{
cdestr = cr = ((HEX2INT(p3[1]) * 16) + HEX2INT(p3[2]));
cdestg = cg = ((HEX2INT(p3[3]) * 16) + HEX2INT(p3[4]));
cdestb = cb = ((HEX2INT(p3[5]) * 16) + HEX2INT(p3[6]));
fadecolor = (((cb) >> 3) + (((cg) >> 2) << 5) + (((cr) >> 3) << 11));
cfr = ((HEX2INT(p3[1]) * 16) + HEX2INT(p3[2]));
cfg = ((HEX2INT(p3[3]) * 16) + HEX2INT(p3[4]));
cfb = ((HEX2INT(p3[5]) * 16) + HEX2INT(p3[6]));
if (p1[7] >= 'a' && p1[7] <= 'z')
cfa = (p1[7] - 'a');
else if (p1[7] >= 'A' && p1[7] <= 'Z')
cfa = (p1[7] - 'A');
else
cfa = 18;
// for opengl; generate on software too for netsync
fadergba = (HEX2INT(p3[1]) << 4) + (HEX2INT(p3[2]) << 0) +
@ -1583,7 +1624,8 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
}
else
{
cdestr = cdestg = cdestb = fadecolor = 0;
cfr = cfg = cfb = 0;
cfa = 18;
fadergba = 0x19000000; // default alpha for fade, (25 << 24)
}
#undef ALPHA2INT
@ -1591,40 +1633,41 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
for (exc = extra_colormaps; exc; exc = exc->next)
{
#ifdef EXTRACOLORMAPLUMPS
if (exc->lump != LUMPERROR)
continue;
if (maskcolor == exc->maskcolor
&& fadecolor == exc->fadecolor
&& (float)maskamt == (float)exc->maskamt
#endif
if (cr == exc->cr && cg == exc->cg && cb == exc->cb && ca == exc->ca
&& cfr == exc->cfr && cfg == exc->cfg && cfb == exc->cfb && cfa == exc->cfa
&& fadestart == exc->fadestart
&& fadeend == exc->fadeend
&& fog == exc->fog)
return exc;
break;
}
extra_colormap = Z_Calloc(sizeof (*extra_colormap), PU_LEVEL, NULL);
extra_colormap->maskcolor = (UINT16)maskcolor;
extra_colormap->fadecolor = (UINT16)fadecolor;
extra_colormap->maskamt = maskamt;
extra_colormap->othermask = othermask;
extra_colormap->fadestart = (UINT16)fadestart;
extra_colormap->fadeend = (UINT16)fadeend;
extra_colormap->fadedist = fadedist;
extra_colormap->fog = fog;
extra_colormap->cmaskr = cmaskr;
extra_colormap->cmaskg = cmaskg;
extra_colormap->cmaskb = cmaskb;
extra_colormap->cdestr = cdestr;
extra_colormap->cdestg = cdestg;
extra_colormap->cdestb = cdestb;
extra_colormap->cr = cr;
extra_colormap->cg = cg;
extra_colormap->cb = cb;
extra_colormap->ca = ca;
extra_colormap->cfr = cfr;
extra_colormap->cfg = cfg;
extra_colormap->cfb = cfb;
extra_colormap->cfa = cfa;
extra_colormap->rgba = rgba;
extra_colormap->fadergba = fadergba;
#ifdef EXTRACOLORMAPLUMPS
extra_colormap->lump = LUMPERROR;
extra_colormap->next = extra_colormap->prev = NULL;
extra_colormap->lumpname[0] = 0;
#endif
extra_colormap->colormap = R_CreateLightTable(extra_colormap);
@ -1673,7 +1716,8 @@ static int RoundUp(double number)
return (int)number;
}
const char *R_ColormapNameForColormap(extracolormap_t *extra_colormap)
#ifdef EXTRACOLORMAPLUMPS
const char *R_NameForColormap(extracolormap_t *extra_colormap)
{
if (!extra_colormap)
return "NONE";
@ -1681,9 +1725,9 @@ const char *R_ColormapNameForColormap(extracolormap_t *extra_colormap)
if (extra_colormap->lump == LUMPERROR)
return "INLEVEL";
return W_CheckNameForNum(extra_colormap->lump);
return extra_colormap->lumpname;
}
#endif
//
// build a table for quick conversion from 8bpp to 15bpp

View file

@ -96,12 +96,19 @@ void R_ClearTextureNumCache(boolean btell);
INT32 R_TextureNumForName(const char *name);
INT32 R_CheckTextureNumForName(const char *name);
// Extra Colormap lumps (C_START/C_END) are not used anywhere
// Uncomment to enable
//#define EXTRACOLORMAPLUMPS
void R_ReInitColormaps(UINT16 num);
void R_ClearColormaps(void);
extracolormap_t *R_ColormapForName(char *name);
void R_AddColormapToList(extracolormap_t *extra_colormap);
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap);
extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3);
const char *R_ColormapNameForNum(INT32 num);
#ifdef EXTRACOLORMAPLUMPS
extracolormap_t *R_ColormapForName(char *name);
const char *R_NameForColormap(extracolormap_t *extra_colormap);
#endif
extern INT32 numtextures;

View file

@ -52,15 +52,12 @@ typedef UINT8 lighttable_t;
// ExtraColormap type. Use for extra_colormaps from now on.
typedef struct extracolormap_s
{
UINT16 maskcolor, fadecolor;
double maskamt, othermask;
UINT16 fadestart, fadeend;
UINT32 fadedist;
INT32 fog;
UINT8 fadestart, fadeend;
UINT8 fadedist;
boolean fog;
// mask rgb for colormap table generation
double cmaskr, cmaskg, cmaskb;
double cdestr, cdestg, cdestb;
// rgba for colormap table generation
UINT8 cr, cg, cb, ca, cfr, cfg, cfb, cfa;
// rgba is used in hw mode for colored sector lighting
INT32 rgba; // similar to maskcolor in sw mode
@ -68,7 +65,10 @@ typedef struct extracolormap_s
lighttable_t *colormap;
#ifdef EXTRACOLORMAPLUMPS
lumpnum_t lump; // for colormap lump matching, init to LUMPERROR
char lumpname[9]; // for netsyncing
#endif
struct extracolormap_s *next;
struct extracolormap_s *prev;