mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-17 02:01:35 +00:00
Merge branch 'udmf-next' into udmf-argenums
This commit is contained in:
commit
f0c63ce76a
5 changed files with 306 additions and 100 deletions
166
src/p_setup.c
166
src/p_setup.c
|
@ -940,6 +940,8 @@ static void P_LoadSectors(UINT8 *data)
|
||||||
|
|
||||||
ss->floorpic_angle = ss->ceilingpic_angle = 0;
|
ss->floorpic_angle = ss->ceilingpic_angle = 0;
|
||||||
|
|
||||||
|
ss->colormap_protected = false;
|
||||||
|
|
||||||
P_InitializeSector(ss);
|
P_InitializeSector(ss);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1124,9 +1126,11 @@ static void P_LoadSidedefs(UINT8 *data)
|
||||||
case 455: // Fade colormaps! mazmazz 9/12/2018 (:flag_us:)
|
case 455: // Fade colormaps! mazmazz 9/12/2018 (:flag_us:)
|
||||||
// SoM: R_CreateColormap will only create a colormap in software mode...
|
// SoM: R_CreateColormap will only create a colormap in software mode...
|
||||||
// Perhaps we should just call it instead of doing the calculations here.
|
// Perhaps we should just call it instead of doing the calculations here.
|
||||||
sd->colormap_data = R_CreateColormap(msd->toptexture, msd->midtexture,
|
if (!udmf)
|
||||||
msd->bottomtexture);
|
{
|
||||||
|
sd->colormap_data = R_CreateColormapFromLinedef(msd->toptexture, msd->midtexture, msd->bottomtexture);
|
||||||
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
sd->toptexture = sd->midtexture = sd->bottomtexture = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 413: // Change music
|
case 413: // Change music
|
||||||
|
@ -1382,6 +1386,19 @@ static void ParseTextmapVertexParameter(UINT32 i, char *param, char *val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct textmap_colormap_s {
|
||||||
|
boolean used;
|
||||||
|
INT32 lightcolor;
|
||||||
|
UINT8 lightalpha;
|
||||||
|
INT32 fadecolor;
|
||||||
|
UINT8 fadealpha;
|
||||||
|
UINT8 fadestart;
|
||||||
|
UINT8 fadeend;
|
||||||
|
UINT8 flags;
|
||||||
|
} textmap_colormap_t;
|
||||||
|
|
||||||
|
textmap_colormap_t textmap_colormap = { false, 0, 25, 0, 25, 0, 31, 0 };
|
||||||
|
|
||||||
static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
|
static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
|
||||||
{
|
{
|
||||||
if (fastcmp(param, "heightfloor"))
|
if (fastcmp(param, "heightfloor"))
|
||||||
|
@ -1410,6 +1427,48 @@ static void ParseTextmapSectorParameter(UINT32 i, char *param, char *val)
|
||||||
sectors[i].floorpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val)));
|
sectors[i].floorpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val)));
|
||||||
else if (fastcmp(param, "rotationceiling"))
|
else if (fastcmp(param, "rotationceiling"))
|
||||||
sectors[i].ceilingpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val)));
|
sectors[i].ceilingpic_angle = FixedAngle(FLOAT_TO_FIXED(atof(val)));
|
||||||
|
else if (fastcmp(param, "lightcolor"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.lightcolor = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "lightalpha"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.lightalpha = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "fadecolor"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.fadecolor = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "fadealpha"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.fadealpha = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "fadestart"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.fadestart = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "fadeend"))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.fadeend = atol(val);
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "colormapfog") && fastcmp("true", val))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.flags |= CMF_FOG;
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "colormapfadesprites") && fastcmp("true", val))
|
||||||
|
{
|
||||||
|
textmap_colormap.used = true;
|
||||||
|
textmap_colormap.flags |= CMF_FADEFULLBRIGHTSPRITES;
|
||||||
|
}
|
||||||
|
else if (fastcmp(param, "colormapprotected") && fastcmp("true", val))
|
||||||
|
sectors[i].colormap_protected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val)
|
static void ParseTextmapSidedefParameter(UINT32 i, char *param, char *val)
|
||||||
|
@ -1583,6 +1642,14 @@ static void TextmapFixFlatOffsets(sector_t *sec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT32 P_ColorToRGBA(INT32 color, UINT8 alpha)
|
||||||
|
{
|
||||||
|
UINT8 r = (color >> 16) & 0xFF;
|
||||||
|
UINT8 g = (color >> 8) & 0xFF;
|
||||||
|
UINT8 b = color & 0xFF;
|
||||||
|
return R_PutRgbaRGBA(r, g, b, alpha);
|
||||||
|
}
|
||||||
|
|
||||||
/** Loads the textmap data, after obtaining the elements count and allocating their respective space.
|
/** Loads the textmap data, after obtaining the elements count and allocating their respective space.
|
||||||
*/
|
*/
|
||||||
static void P_LoadTextmap(void)
|
static void P_LoadTextmap(void)
|
||||||
|
@ -1636,8 +1703,24 @@ static void P_LoadTextmap(void)
|
||||||
|
|
||||||
sc->floorpic_angle = sc->ceilingpic_angle = 0;
|
sc->floorpic_angle = sc->ceilingpic_angle = 0;
|
||||||
|
|
||||||
|
sc->colormap_protected = false;
|
||||||
|
|
||||||
|
textmap_colormap.used = false;
|
||||||
|
textmap_colormap.lightcolor = 0;
|
||||||
|
textmap_colormap.lightalpha = 25;
|
||||||
|
textmap_colormap.fadecolor = 0;
|
||||||
|
textmap_colormap.fadealpha = 25;
|
||||||
|
textmap_colormap.fadestart = 0;
|
||||||
|
textmap_colormap.fadeend = 31;
|
||||||
|
textmap_colormap.flags = 0;
|
||||||
TextmapParse(sectorsPos[i], i, ParseTextmapSectorParameter);
|
TextmapParse(sectorsPos[i], i, ParseTextmapSectorParameter);
|
||||||
P_InitializeSector(sc);
|
P_InitializeSector(sc);
|
||||||
|
if (textmap_colormap.used)
|
||||||
|
{
|
||||||
|
INT32 rgba = P_ColorToRGBA(textmap_colormap.lightcolor, textmap_colormap.lightalpha);
|
||||||
|
INT32 fadergba = P_ColorToRGBA(textmap_colormap.fadecolor, textmap_colormap.fadealpha);
|
||||||
|
sc->extra_colormap = sc->spawn_extra_colormap = R_CreateColormap(rgba, fadergba, textmap_colormap.fadestart, textmap_colormap.fadeend, textmap_colormap.flags);
|
||||||
|
}
|
||||||
TextmapFixFlatOffsets(sc);
|
TextmapFixFlatOffsets(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1710,9 +1793,9 @@ static void P_ProcessLinedefsAfterSidedefs(void)
|
||||||
ld->frontsector = sides[ld->sidenum[0]].sector; //e6y: Can't be -1 here
|
ld->frontsector = sides[ld->sidenum[0]].sector; //e6y: Can't be -1 here
|
||||||
ld->backsector = ld->sidenum[1] != 0xffff ? sides[ld->sidenum[1]].sector : 0;
|
ld->backsector = ld->sidenum[1] != 0xffff ? sides[ld->sidenum[1]].sector : 0;
|
||||||
|
|
||||||
// Compile linedef 'text' from both sidedefs 'text' for appropriate specials.
|
|
||||||
switch (ld->special)
|
switch (ld->special)
|
||||||
{
|
{
|
||||||
|
// Compile linedef 'text' from both sidedefs 'text' for appropriate specials.
|
||||||
case 331: // Trigger linedef executor: Skin - Continuous
|
case 331: // Trigger linedef executor: Skin - Continuous
|
||||||
case 332: // Trigger linedef executor: Skin - Each time
|
case 332: // Trigger linedef executor: Skin - Each time
|
||||||
case 333: // Trigger linedef executor: Skin - Once
|
case 333: // Trigger linedef executor: Skin - Once
|
||||||
|
@ -1728,6 +1811,41 @@ static void P_ProcessLinedefsAfterSidedefs(void)
|
||||||
M_Memcpy(ld->text + strlen(ld->text) + 1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text) + 1);
|
M_Memcpy(ld->text + strlen(ld->text) + 1, sides[ld->sidenum[1]].text, strlen(sides[ld->sidenum[1]].text) + 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 447: // Change colormap
|
||||||
|
case 455: // Fade colormap
|
||||||
|
if (udmf)
|
||||||
|
break;
|
||||||
|
if (ld->flags & ML_DONTPEGBOTTOM) // alternate alpha (by texture offsets)
|
||||||
|
{
|
||||||
|
extracolormap_t *exc = R_CopyColormap(sides[ld->sidenum[0]].colormap_data, false);
|
||||||
|
INT16 alpha = max(min(sides[ld->sidenum[0]].textureoffset >> FRACBITS, 25), -25);
|
||||||
|
INT16 fadealpha = max(min(sides[ld->sidenum[0]].rowoffset >> FRACBITS, 25), -25);
|
||||||
|
|
||||||
|
// If alpha is negative, set "subtract alpha" flag and store absolute value
|
||||||
|
if (alpha < 0)
|
||||||
|
{
|
||||||
|
alpha *= -1;
|
||||||
|
ld->args[2] |= 16;
|
||||||
|
}
|
||||||
|
if (fadealpha < 0)
|
||||||
|
{
|
||||||
|
fadealpha *= -1;
|
||||||
|
ld->args[2] |= 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
exc->rgba = R_GetRgbaRGB(exc->rgba) + R_PutRgbaA(alpha);
|
||||||
|
exc->fadergba = R_GetRgbaRGB(exc->fadergba) + R_PutRgbaA(fadealpha);
|
||||||
|
|
||||||
|
if (!(sides[ld->sidenum[0]].colormap_data = R_GetColormapFromList(exc)))
|
||||||
|
{
|
||||||
|
exc->colormap = R_CreateLightTable(exc);
|
||||||
|
R_AddColormapToList(exc);
|
||||||
|
sides[ld->sidenum[0]].colormap_data = exc;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Z_Free(exc);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2691,6 +2809,48 @@ static void P_ConvertBinaryMap(void)
|
||||||
else
|
else
|
||||||
CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in the front texture fields)\n", sizeu1(i));
|
CONS_Alert(CONS_WARNING, "Linedef %s is missing the hook name of the Lua function to call! (This should be given in the front texture fields)\n", sizeu1(i));
|
||||||
break;
|
break;
|
||||||
|
case 447: //Change colormap
|
||||||
|
lines[i].args[0] = lines[i].tag;
|
||||||
|
if (lines[i].flags & ML_EFFECT3)
|
||||||
|
lines[i].args[2] |= 1;
|
||||||
|
if (lines[i].flags & ML_EFFECT1)
|
||||||
|
lines[i].args[2] |= 34;
|
||||||
|
if (lines[i].flags & ML_NOCLIMB)
|
||||||
|
lines[i].args[2] |= 68;
|
||||||
|
if (lines[i].flags & ML_EFFECT2)
|
||||||
|
lines[i].args[2] |= 136;
|
||||||
|
break;
|
||||||
|
case 455: //Fade colormap
|
||||||
|
{
|
||||||
|
INT32 speed = (INT32)((((lines[i].flags & ML_DONTPEGBOTTOM) || !sides[lines[i].sidenum[0]].rowoffset) && lines[i].sidenum[1] != 0xFFFF) ?
|
||||||
|
abs(sides[lines[i].sidenum[1]].rowoffset >> FRACBITS)
|
||||||
|
: abs(sides[lines[i].sidenum[0]].rowoffset >> FRACBITS));
|
||||||
|
|
||||||
|
lines[i].args[0] = lines[i].tag;
|
||||||
|
if (lines[i].flags & ML_EFFECT4)
|
||||||
|
lines[i].args[2] = speed;
|
||||||
|
else
|
||||||
|
lines[i].args[2] = (256 + speed - 1)/speed;
|
||||||
|
if (lines[i].flags & ML_EFFECT3)
|
||||||
|
lines[i].args[3] |= 1;
|
||||||
|
if (lines[i].flags & ML_EFFECT1)
|
||||||
|
lines[i].args[3] |= 34;
|
||||||
|
if (lines[i].flags & ML_NOCLIMB)
|
||||||
|
lines[i].args[3] |= 68;
|
||||||
|
if (lines[i].flags & ML_EFFECT2)
|
||||||
|
lines[i].args[3] |= 136;
|
||||||
|
if (lines[i].flags & ML_BOUNCY)
|
||||||
|
lines[i].args[3] |= 4096;
|
||||||
|
if (lines[i].flags & ML_EFFECT5)
|
||||||
|
lines[i].args[3] |= 8192;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 456: //Stop fading colormap
|
||||||
|
lines[i].args[0] = lines[i].tag;
|
||||||
|
break;
|
||||||
|
case 606: //Colormap
|
||||||
|
lines[i].args[0] = lines[i].tag;
|
||||||
|
break;
|
||||||
case 700: //Slope front sector floor
|
case 700: //Slope front sector floor
|
||||||
case 701: //Slope front sector ceiling
|
case 701: //Slope front sector ceiling
|
||||||
case 702: //Slope front sector floor and ceiling
|
case 702: //Slope front sector floor and ceiling
|
||||||
|
|
196
src/p_spec.c
196
src/p_spec.c
|
@ -3505,30 +3505,52 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
// Except it is activated by linedef executor, not level load
|
// Except it is activated by linedef executor, not level load
|
||||||
// This could even override existing colormaps I believe
|
// This could even override existing colormaps I believe
|
||||||
// -- Monster Iestyn 14/06/18
|
// -- Monster Iestyn 14/06/18
|
||||||
for (secnum = -1; (secnum = P_FindSectorFromLineTag(line, secnum)) >= 0 ;)
|
|
||||||
{
|
{
|
||||||
|
extracolormap_t *source;
|
||||||
|
if (!udmf)
|
||||||
|
source = sides[line->sidenum[0]].colormap_data;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!line->args[1])
|
||||||
|
source = line->frontsector->extra_colormap;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT32 sourcesec = P_FindSectorFromTag(line->args[1], -1);
|
||||||
|
if (sourcesec == -1)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "Line type 447 Executor: Can't find sector with source colormap (tag %d)!\n", line->args[1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
source = sectors[sourcesec].extra_colormap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (secnum = -1; (secnum = P_FindSectorFromTag(line->args[0], secnum)) >= 0;)
|
||||||
|
{
|
||||||
|
if (sectors[secnum].colormap_protected)
|
||||||
|
continue;
|
||||||
|
|
||||||
P_ResetColormapFader(§ors[secnum]);
|
P_ResetColormapFader(§ors[secnum]);
|
||||||
|
|
||||||
if (line->flags & ML_EFFECT3) // relative calc
|
if (line->args[2] & 1) // relative calc
|
||||||
{
|
{
|
||||||
|
extracolormap_t *target = (!udmf && (line->flags & ML_TFERLINE) && line->sidenum[1] != 0xFFFF) ?
|
||||||
|
sides[line->sidenum[1]].colormap_data : sectors[secnum].extra_colormap; // use back colormap instead of target sector
|
||||||
|
|
||||||
extracolormap_t *exc = R_AddColormaps(
|
extracolormap_t *exc = R_AddColormaps(
|
||||||
(line->flags & ML_TFERLINE) && line->sidenum[1] != 0xFFFF ?
|
target,
|
||||||
sides[line->sidenum[1]].colormap_data : sectors[secnum].extra_colormap, // use back colormap instead of target sector
|
source,
|
||||||
sides[line->sidenum[0]].colormap_data,
|
line->args[2] & 2, // subtract R
|
||||||
line->flags & ML_EFFECT1, // subtract R
|
line->args[2] & 4, // subtract G
|
||||||
line->flags & ML_NOCLIMB, // subtract G
|
line->args[2] & 8, // subtract B
|
||||||
line->flags & ML_EFFECT2, // subtract B
|
line->args[2] & 16, // subtract A
|
||||||
false, // subtract A (no flag for this, just pass negative alpha)
|
line->args[2] & 32, // subtract FadeR
|
||||||
line->flags & ML_EFFECT1, // subtract FadeR
|
line->args[2] & 64, // subtract FadeG
|
||||||
line->flags & ML_NOCLIMB, // subtract FadeG
|
line->args[2] & 128, // subtract FadeB
|
||||||
line->flags & ML_EFFECT2, // subtract FadeB
|
line->args[2] & 256, // subtract FadeA
|
||||||
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
line->args[2] & 512, // subtract FadeStart
|
||||||
false, // subtract FadeStart (we ran out of flags)
|
line->args[2] & 1024, // subtract FadeEnd
|
||||||
false, // subtract FadeEnd (we ran out of flags)
|
line->args[2] & 2048, // ignore Flags
|
||||||
false, // ignore Flags (we ran out of flags)
|
|
||||||
line->flags & ML_DONTPEGBOTTOM,
|
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
|
||||||
false);
|
false);
|
||||||
|
|
||||||
if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc)))
|
if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc)))
|
||||||
|
@ -3540,26 +3562,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
else
|
else
|
||||||
Z_Free(exc);
|
Z_Free(exc);
|
||||||
}
|
}
|
||||||
else if (line->flags & ML_DONTPEGBOTTOM) // alternate alpha (by texture offsets)
|
|
||||||
{
|
|
||||||
extracolormap_t *exc = R_CopyColormap(sides[line->sidenum[0]].colormap_data, false);
|
|
||||||
exc->rgba = R_GetRgbaRGB(exc->rgba) + R_PutRgbaA(max(min(sides[line->sidenum[0]].textureoffset >> FRACBITS, 25), 0));
|
|
||||||
exc->fadergba = R_GetRgbaRGB(exc->fadergba) + R_PutRgbaA(max(min(sides[line->sidenum[0]].rowoffset >> FRACBITS, 25), 0));
|
|
||||||
|
|
||||||
if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc)))
|
|
||||||
{
|
|
||||||
exc->colormap = R_CreateLightTable(exc);
|
|
||||||
R_AddColormapToList(exc);
|
|
||||||
sectors[secnum].extra_colormap = exc;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
Z_Free(exc);
|
sectors[secnum].extra_colormap = source;
|
||||||
}
|
|
||||||
else
|
|
||||||
sectors[secnum].extra_colormap = sides[line->sidenum[0]].colormap_data;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 448: // Change skybox viewpoint/centerpoint
|
case 448: // Change skybox viewpoint/centerpoint
|
||||||
if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB))
|
if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB))
|
||||||
{
|
{
|
||||||
|
@ -3833,15 +3840,35 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 455: // Fade colormap
|
case 455: // Fade colormap
|
||||||
for (secnum = -1; (secnum = P_FindSectorFromLineTag(line, secnum)) >= 0 ;)
|
{
|
||||||
|
extracolormap_t *dest;
|
||||||
|
if (!udmf)
|
||||||
|
dest = sides[line->sidenum[0]].colormap_data;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!line->args[1])
|
||||||
|
dest = line->frontsector->extra_colormap;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT32 destsec = P_FindSectorFromTag(line->args[1], -1);
|
||||||
|
if (destsec == -1)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "Line type 455 Executor: Can't find sector with destination colormap (tag %d)!\n", line->args[1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dest = sectors[destsec].extra_colormap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (secnum = -1; (secnum = P_FindSectorFromTag(line->args[0], secnum)) >= 0;)
|
||||||
{
|
{
|
||||||
extracolormap_t *source_exc, *dest_exc, *exc;
|
extracolormap_t *source_exc, *dest_exc, *exc;
|
||||||
INT32 speed = (INT32)((line->flags & ML_DONTPEGBOTTOM) || !sides[line->sidenum[0]].rowoffset) && line->sidenum[1] != 0xFFFF ?
|
|
||||||
abs(sides[line->sidenum[1]].rowoffset >> FRACBITS)
|
|
||||||
: abs(sides[line->sidenum[0]].rowoffset >> FRACBITS);
|
|
||||||
|
|
||||||
// Prevent continuous execs from interfering on an existing fade
|
if (sectors[secnum].colormap_protected)
|
||||||
if (!(line->flags & ML_EFFECT5)
|
continue;
|
||||||
|
|
||||||
|
// Don't interrupt ongoing fade
|
||||||
|
if (!(line->args[3] & 8192)
|
||||||
&& sectors[secnum].fadecolormapdata)
|
&& sectors[secnum].fadecolormapdata)
|
||||||
//&& ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer > (ticbased ? 2 : speed*2))
|
//&& ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer > (ticbased ? 2 : speed*2))
|
||||||
{
|
{
|
||||||
|
@ -3849,19 +3876,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line->flags & ML_TFERLINE) // use back colormap instead of target sector
|
if (!udmf && (line->flags & ML_TFERLINE)) // use back colormap instead of target sector
|
||||||
sectors[secnum].extra_colormap = (line->sidenum[1] != 0xFFFF) ?
|
sectors[secnum].extra_colormap = (line->sidenum[1] != 0xFFFF) ?
|
||||||
sides[line->sidenum[1]].colormap_data : NULL;
|
sides[line->sidenum[1]].colormap_data : NULL;
|
||||||
|
|
||||||
exc = sectors[secnum].extra_colormap;
|
exc = sectors[secnum].extra_colormap;
|
||||||
|
|
||||||
if (!(line->flags & ML_BOUNCY) // BOUNCY: Do not override fade from default rgba
|
if (!(line->args[3] & 4096) // Override fade from default rgba
|
||||||
&& !R_CheckDefaultColormap(sides[line->sidenum[0]].colormap_data, true, false, false)
|
&& !R_CheckDefaultColormap(dest, true, false, false)
|
||||||
&& R_CheckDefaultColormap(exc, true, false, false))
|
&& R_CheckDefaultColormap(exc, true, false, false))
|
||||||
{
|
{
|
||||||
exc = R_CopyColormap(exc, false);
|
exc = R_CopyColormap(exc, false);
|
||||||
exc->rgba = R_GetRgbaRGB(sides[line->sidenum[0]].colormap_data->rgba) + R_PutRgbaA(R_GetRgbaA(exc->rgba));
|
exc->rgba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->rgba));
|
||||||
//exc->fadergba = R_GetRgbaRGB(sides[line->sidenum[0]].colormap_data->rgba) + R_PutRgbaA(R_GetRgbaA(exc->fadergba));
|
//exc->fadergba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->fadergba));
|
||||||
|
|
||||||
if (!(source_exc = R_GetColormapFromList(exc)))
|
if (!(source_exc = R_GetColormapFromList(exc)))
|
||||||
{
|
{
|
||||||
|
@ -3877,35 +3904,26 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
else
|
else
|
||||||
source_exc = exc ? exc : R_GetDefaultColormap();
|
source_exc = exc ? exc : R_GetDefaultColormap();
|
||||||
|
|
||||||
if (line->flags & ML_EFFECT3) // relative calc
|
if (line->args[3] & 1) // relative calc
|
||||||
{
|
{
|
||||||
exc = R_AddColormaps(
|
exc = R_AddColormaps(
|
||||||
source_exc,
|
source_exc,
|
||||||
sides[line->sidenum[0]].colormap_data,
|
dest,
|
||||||
line->flags & ML_EFFECT1, // subtract R
|
line->args[3] & 2, // subtract R
|
||||||
line->flags & ML_NOCLIMB, // subtract G
|
line->args[3] & 4, // subtract G
|
||||||
line->flags & ML_EFFECT2, // subtract B
|
line->args[3] & 8, // subtract B
|
||||||
false, // subtract A (no flag for this, just pass negative alpha)
|
line->args[3] & 16, // subtract A
|
||||||
line->flags & ML_EFFECT1, // subtract FadeR
|
line->args[3] & 32, // subtract FadeR
|
||||||
line->flags & ML_NOCLIMB, // subtract FadeG
|
line->args[3] & 64, // subtract FadeG
|
||||||
line->flags & ML_EFFECT2, // subtract FadeB
|
line->args[3] & 128, // subtract FadeB
|
||||||
false, // subtract FadeA (no flag for this, just pass negative alpha)
|
line->args[3] & 256, // subtract FadeA
|
||||||
false, // subtract FadeStart (we ran out of flags)
|
line->args[3] & 512, // subtract FadeStart
|
||||||
false, // subtract FadeEnd (we ran out of flags)
|
line->args[3] & 1024, // subtract FadeEnd
|
||||||
false, // ignore Flags (we ran out of flags)
|
line->args[3] & 2048, // ignore Flags
|
||||||
line->flags & ML_DONTPEGBOTTOM,
|
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].textureoffset >> FRACBITS) : 0,
|
|
||||||
(line->flags & ML_DONTPEGBOTTOM) ? (sides[line->sidenum[0]].rowoffset >> FRACBITS) : 0,
|
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
else if (line->flags & ML_DONTPEGBOTTOM) // alternate alpha (by texture offsets)
|
|
||||||
{
|
|
||||||
exc = R_CopyColormap(sides[line->sidenum[0]].colormap_data, false);
|
|
||||||
exc->rgba = R_GetRgbaRGB(exc->rgba) + R_PutRgbaA(max(min(sides[line->sidenum[0]].textureoffset >> FRACBITS, 25), 0));
|
|
||||||
exc->fadergba = R_GetRgbaRGB(exc->fadergba) + R_PutRgbaA(max(min(sides[line->sidenum[0]].rowoffset >> FRACBITS, 25), 0));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
exc = R_CopyColormap(sides[line->sidenum[0]].colormap_data, false);
|
exc = R_CopyColormap(dest, false);
|
||||||
|
|
||||||
if (!(dest_exc = R_GetColormapFromList(exc)))
|
if (!(dest_exc = R_GetColormapFromList(exc)))
|
||||||
{
|
{
|
||||||
|
@ -3916,13 +3934,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
else
|
else
|
||||||
Z_Free(exc);
|
Z_Free(exc);
|
||||||
|
|
||||||
Add_ColormapFader(§ors[secnum], source_exc, dest_exc, (line->flags & ML_EFFECT4), // tic-based timing
|
Add_ColormapFader(§ors[secnum], source_exc, dest_exc, true, // tic-based timing
|
||||||
speed);
|
line->args[2]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 456: // Stop fade colormap
|
case 456: // Stop fade colormap
|
||||||
for (secnum = -1; (secnum = P_FindSectorFromLineTag(line, secnum)) >= 0 ;)
|
for (secnum = -1; (secnum = P_FindSectorFromTag(line->args[0], secnum)) >= 0 ;)
|
||||||
P_ResetColormapFader(§ors[secnum]);
|
P_ResetColormapFader(§ors[secnum]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -7381,8 +7399,32 @@ void P_SpawnSpecials(boolean fromnetsave)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 606: // HACK! Copy colormaps. Just plain colormaps.
|
case 606: // HACK! Copy colormaps. Just plain colormaps.
|
||||||
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
|
for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0;)
|
||||||
sectors[s].extra_colormap = sectors[s].spawn_extra_colormap = sides[lines[i].sidenum[0]].colormap_data;
|
{
|
||||||
|
extracolormap_t *exc;
|
||||||
|
|
||||||
|
if (sectors[s].colormap_protected)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!udmf)
|
||||||
|
exc = sides[lines[i].sidenum[0]].colormap_data;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!lines[i].args[1])
|
||||||
|
exc = lines[i].frontsector->extra_colormap;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT32 sourcesec = P_FindSectorFromTag(lines[i].args[1], -1);
|
||||||
|
if (sourcesec == -1)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "Line type 606: Can't find sector with source colormap (tag %d)!\n", lines[i].args[1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
exc = sectors[sourcesec].extra_colormap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sectors[s].extra_colormap = sectors[s].spawn_extra_colormap = exc;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -8319,7 +8361,7 @@ static void P_AddFakeFloorFader(ffloor_t *rover, size_t sectornum, size_t ffloor
|
||||||
d->destlightlevel = -1;
|
d->destlightlevel = -1;
|
||||||
|
|
||||||
// Set a separate thinker for colormap fading
|
// Set a separate thinker for colormap fading
|
||||||
if (docolormap && !(rover->flags & FF_NOSHADE) && sectors[rover->secnum].spawn_extra_colormap)
|
if (docolormap && !(rover->flags & FF_NOSHADE) && sectors[rover->secnum].spawn_extra_colormap && !sectors[rover->secnum].colormap_protected)
|
||||||
{
|
{
|
||||||
extracolormap_t *dest_exc,
|
extracolormap_t *dest_exc,
|
||||||
*source_exc = sectors[rover->secnum].extra_colormap ? sectors[rover->secnum].extra_colormap : R_GetDefaultColormap();
|
*source_exc = sectors[rover->secnum].extra_colormap ? sectors[rover->secnum].extra_colormap : R_GetDefaultColormap();
|
||||||
|
|
33
src/r_data.c
33
src/r_data.c
|
@ -2043,7 +2043,7 @@ extracolormap_t *R_ColormapForName(char *name)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_CreateColormap
|
// R_CreateColormapFromLinedef
|
||||||
//
|
//
|
||||||
// This is a more GL friendly way of doing colormaps: Specify colormap
|
// This is a more GL friendly way of doing colormaps: Specify colormap
|
||||||
// data in a special linedef's texture areas and use that to generate
|
// data in a special linedef's texture areas and use that to generate
|
||||||
|
@ -2182,10 +2182,8 @@ lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap)
|
||||||
return lighttable;
|
return lighttable;
|
||||||
}
|
}
|
||||||
|
|
||||||
extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
extracolormap_t *R_CreateColormapFromLinedef(char *p1, char *p2, char *p3)
|
||||||
{
|
{
|
||||||
extracolormap_t *extra_colormap, *exc;
|
|
||||||
|
|
||||||
// default values
|
// default values
|
||||||
UINT8 cr = 0, cg = 0, cb = 0, ca = 0, cfr = 0, cfg = 0, cfb = 0, cfa = 25;
|
UINT8 cr = 0, cg = 0, cb = 0, ca = 0, cfr = 0, cfg = 0, cfb = 0, cfa = 25;
|
||||||
UINT32 fadestart = 0, fadeend = 31;
|
UINT32 fadestart = 0, fadeend = 31;
|
||||||
|
@ -2308,6 +2306,13 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
rgba = R_PutRgbaRGBA(cr, cg, cb, ca);
|
rgba = R_PutRgbaRGBA(cr, cg, cb, ca);
|
||||||
fadergba = R_PutRgbaRGBA(cfr, cfg, cfb, cfa);
|
fadergba = R_PutRgbaRGBA(cfr, cfg, cfb, cfa);
|
||||||
|
|
||||||
|
return R_CreateColormap(rgba, fadergba, fadestart, fadeend, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
extracolormap_t *R_CreateColormap(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags)
|
||||||
|
{
|
||||||
|
extracolormap_t *extra_colormap;
|
||||||
|
|
||||||
// Did we just make a default colormap?
|
// Did we just make a default colormap?
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, flags, LUMPERROR))
|
if (R_CheckDefaultColormapByValues(true, true, true, rgba, fadergba, fadestart, fadeend, flags, LUMPERROR))
|
||||||
|
@ -2319,17 +2324,16 @@ extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3)
|
||||||
|
|
||||||
// Look for existing colormaps
|
// Look for existing colormaps
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags, LUMPERROR);
|
extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags, LUMPERROR);
|
||||||
#else
|
#else
|
||||||
exc = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags);
|
extra_colormap = R_GetColormapFromListByValues(rgba, fadergba, fadestart, fadeend, flags);
|
||||||
#endif
|
#endif
|
||||||
if (exc)
|
if (extra_colormap)
|
||||||
return exc;
|
return extra_colormap;
|
||||||
|
|
||||||
CONS_Debug(DBG_RENDER, "Creating Colormap: rgba(%d,%d,%d,%d) fadergba(%d,%d,%d,%d)\n",
|
CONS_Debug(DBG_RENDER, "Creating Colormap: rgba(%x) fadergba(%x)\n", rgba, fadergba);
|
||||||
cr, cg, cb, ca, cfr, cfg, cfb, cfa);
|
|
||||||
|
|
||||||
extra_colormap = Z_Calloc(sizeof (*extra_colormap), PU_LEVEL, NULL);
|
extra_colormap = Z_Calloc(sizeof(*extra_colormap), PU_LEVEL, NULL);
|
||||||
|
|
||||||
extra_colormap->fadestart = (UINT16)fadestart;
|
extra_colormap->fadestart = (UINT16)fadestart;
|
||||||
extra_colormap->fadeend = (UINT16)fadeend;
|
extra_colormap->fadeend = (UINT16)fadeend;
|
||||||
|
@ -2361,7 +2365,6 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex
|
||||||
boolean subR, boolean subG, boolean subB, boolean subA,
|
boolean subR, boolean subG, boolean subB, boolean subA,
|
||||||
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
||||||
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
||||||
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
|
||||||
boolean lighttable)
|
boolean lighttable)
|
||||||
{
|
{
|
||||||
INT16 red, green, blue, alpha;
|
INT16 red, green, blue, alpha;
|
||||||
|
@ -2397,7 +2400,7 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex
|
||||||
* R_GetRgbaB(exc_addend->rgba)
|
* R_GetRgbaB(exc_addend->rgba)
|
||||||
, 255), 0);
|
, 255), 0);
|
||||||
|
|
||||||
alpha = useAltAlpha ? altAlpha : R_GetRgbaA(exc_addend->rgba);
|
alpha = R_GetRgbaA(exc_addend->rgba);
|
||||||
alpha = max(min(R_GetRgbaA(exc_augend->rgba) + (subA ? -1 : 1) * alpha, 25), 0);
|
alpha = max(min(R_GetRgbaA(exc_augend->rgba) + (subA ? -1 : 1) * alpha, 25), 0);
|
||||||
|
|
||||||
exc_augend->rgba = R_PutRgbaRGBA(red, green, blue, alpha);
|
exc_augend->rgba = R_PutRgbaRGBA(red, green, blue, alpha);
|
||||||
|
@ -2424,8 +2427,8 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex
|
||||||
* R_GetRgbaB(exc_addend->fadergba)
|
* R_GetRgbaB(exc_addend->fadergba)
|
||||||
, 255), 0);
|
, 255), 0);
|
||||||
|
|
||||||
alpha = useAltAlpha ? altFadeAlpha : R_GetRgbaA(exc_addend->fadergba);
|
alpha = R_GetRgbaA(exc_addend->fadergba);
|
||||||
if (alpha == 25 && !useAltAlpha && !R_GetRgbaRGB(exc_addend->fadergba))
|
if (alpha == 25 && !R_GetRgbaRGB(exc_addend->fadergba))
|
||||||
alpha = 0; // HACK: fadergba A defaults at 25, so don't add anything in this case
|
alpha = 0; // HACK: fadergba A defaults at 25, so don't add anything in this case
|
||||||
alpha = max(min(R_GetRgbaA(exc_augend->fadergba) + (subFadeA ? -1 : 1) * alpha, 25), 0);
|
alpha = max(min(R_GetRgbaA(exc_augend->fadergba) + (subFadeA ? -1 : 1) * alpha, 25), 0);
|
||||||
|
|
||||||
|
|
|
@ -147,12 +147,12 @@ boolean R_CheckEqualColormaps(extracolormap_t *exc_a, extracolormap_t *exc_b, bo
|
||||||
extracolormap_t *R_GetColormapFromList(extracolormap_t *extra_colormap);
|
extracolormap_t *R_GetColormapFromList(extracolormap_t *extra_colormap);
|
||||||
|
|
||||||
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap);
|
lighttable_t *R_CreateLightTable(extracolormap_t *extra_colormap);
|
||||||
extracolormap_t *R_CreateColormap(char *p1, char *p2, char *p3);
|
extracolormap_t * R_CreateColormapFromLinedef(char *p1, char *p2, char *p3);
|
||||||
|
extracolormap_t* R_CreateColormap(INT32 rgba, INT32 fadergba, UINT8 fadestart, UINT8 fadeend, UINT8 flags);
|
||||||
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *exc_addend,
|
||||||
boolean subR, boolean subG, boolean subB, boolean subA,
|
boolean subR, boolean subG, boolean subB, boolean subA,
|
||||||
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA,
|
||||||
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags,
|
||||||
boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha,
|
|
||||||
boolean lighttable);
|
boolean lighttable);
|
||||||
#ifdef EXTRACOLORMAPLUMPS
|
#ifdef EXTRACOLORMAPLUMPS
|
||||||
extracolormap_t *R_ColormapForName(char *name);
|
extracolormap_t *R_ColormapForName(char *name);
|
||||||
|
|
|
@ -341,6 +341,7 @@ typedef struct sector_s
|
||||||
|
|
||||||
// per-sector colormaps!
|
// per-sector colormaps!
|
||||||
extracolormap_t *extra_colormap;
|
extracolormap_t *extra_colormap;
|
||||||
|
boolean colormap_protected;
|
||||||
|
|
||||||
#ifdef HWRENDER // ----- for special tricks with HW renderer -----
|
#ifdef HWRENDER // ----- for special tricks with HW renderer -----
|
||||||
boolean pseudoSector;
|
boolean pseudoSector;
|
||||||
|
|
Loading…
Reference in a new issue