Add relative color change to 447
This commit is contained in:
parent
b9e4cd40ca
commit
a1a05c9972
85
src/p_spec.c
85
src/p_spec.c
|
@ -3257,41 +3257,78 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
// -- Monster Iestyn 14/06/18
|
// -- Monster Iestyn 14/06/18
|
||||||
for (secnum = -1; (secnum = P_FindSectorFromLineTag(line, secnum)) >= 0 ;)
|
for (secnum = -1; (secnum = P_FindSectorFromLineTag(line, secnum)) >= 0 ;)
|
||||||
{
|
{
|
||||||
if (line->flags & ML_NOCLIMB) // set alpha only
|
if (line->flags & ML_EFFECT3) // relative calc
|
||||||
{
|
{
|
||||||
if (sectors[secnum].extra_colormap) // does nothing without an existing colormap
|
if (sectors[secnum].extra_colormap) // does nothing without an existing colormap
|
||||||
{
|
{
|
||||||
extracolormap_t *dest_colormap = R_CopyColormap(sectors[secnum].extra_colormap, false);
|
extracolormap_t *target_colormap = R_CopyColormap(sectors[secnum].extra_colormap, false);
|
||||||
INT16 alpha;
|
extracolormap_t *source_colormap = line->frontsector->extra_colormap ? line->frontsector->extra_colormap
|
||||||
|
: R_GetDefaultColormap();
|
||||||
|
|
||||||
|
INT16 red, green, blue, alpha;
|
||||||
|
|
||||||
// base rgba
|
// base rgba
|
||||||
alpha = (line->flags & ML_DONTPEGBOTTOM && line->sidenum[1] != 0xFFFF) ?
|
red = max(min(
|
||||||
(sides[line->sidenum[1]].textureoffset >> FRACBITS)
|
R_GetRgbaR(target_colormap->rgba)
|
||||||
: line->frontsector->extra_colormap ?
|
+ ((line->flags & ML_EFFECT1) ? -1 : 1) // subtract R
|
||||||
R_GetRgbaA(line->frontsector->extra_colormap->rgba)
|
* R_GetRgbaR(source_colormap->rgba)
|
||||||
: 0;
|
, 255), 0);
|
||||||
if (line->flags & ML_EFFECT3) // relative calc
|
|
||||||
alpha = max(min(R_GetRgbaA(sectors[secnum].extra_colormap->rgba) + alpha, 25), 0);
|
green = max(min(
|
||||||
dest_colormap->rgba = R_GetRgbaRGB(dest_colormap->rgba) + R_PutRgbaA(alpha);
|
R_GetRgbaG(target_colormap->rgba)
|
||||||
|
+ ((line->flags & ML_NOCLIMB) ? -1 : 1) // subtract G
|
||||||
|
* R_GetRgbaG(source_colormap->rgba)
|
||||||
|
, 255), 0);
|
||||||
|
|
||||||
|
blue = max(min(
|
||||||
|
R_GetRgbaB(target_colormap->rgba)
|
||||||
|
+ ((line->flags & ML_EFFECT2) ? -1 : 1) // subtract B
|
||||||
|
* R_GetRgbaB(source_colormap->rgba)
|
||||||
|
, 255), 0);
|
||||||
|
|
||||||
|
alpha = (line->flags & ML_DONTPEGBOTTOM) ? // front (or back!) X offset; needed to subtract A
|
||||||
|
(sides[line->sidenum[line->sidenum[1] != 0xFFFF ? 1 : 0]].textureoffset >> FRACBITS)
|
||||||
|
: R_GetRgbaA(source_colormap->rgba);
|
||||||
|
alpha = max(min(R_GetRgbaA(target_colormap->rgba) + alpha, 25), 0);
|
||||||
|
|
||||||
|
target_colormap->rgba = R_PutRgbaRGBA(red, green, blue, alpha);
|
||||||
|
|
||||||
// fade rgba
|
// fade rgba
|
||||||
alpha = (line->flags & ML_DONTPEGBOTTOM && line->sidenum[1] != 0xFFFF) ?
|
red = max(min(
|
||||||
(sides[line->sidenum[1]].rowoffset >> FRACBITS)
|
R_GetRgbaR(target_colormap->fadergba)
|
||||||
: line->frontsector->extra_colormap ?
|
+ ((line->flags & ML_EFFECT1) ? -1 : 1) // subtract R
|
||||||
R_GetRgbaA(line->frontsector->extra_colormap->fadergba)
|
* R_GetRgbaR(source_colormap->fadergba)
|
||||||
: 0;
|
, 255), 0);
|
||||||
if (line->flags & ML_EFFECT3) // relative calc
|
|
||||||
alpha = max(min(R_GetRgbaA(sectors[secnum].extra_colormap->fadergba) + alpha, 25), 0);
|
|
||||||
dest_colormap->fadergba = R_GetRgbaRGB(dest_colormap->fadergba) + R_PutRgbaA(alpha);
|
|
||||||
|
|
||||||
if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(dest_colormap)))
|
green = max(min(
|
||||||
|
R_GetRgbaG(target_colormap->fadergba)
|
||||||
|
+ ((line->flags & ML_NOCLIMB) ? -1 : 1) // subtract G
|
||||||
|
* R_GetRgbaG(source_colormap->fadergba)
|
||||||
|
, 255), 0);
|
||||||
|
|
||||||
|
blue = max(min(
|
||||||
|
R_GetRgbaB(target_colormap->fadergba)
|
||||||
|
+ ((line->flags & ML_EFFECT2) ? -1 : 1) // subtract B
|
||||||
|
* R_GetRgbaB(source_colormap->fadergba)
|
||||||
|
, 255), 0);
|
||||||
|
|
||||||
|
alpha = (line->flags & ML_DONTPEGBOTTOM) ? // front (or back!) Y offset; needed to subtract A
|
||||||
|
(sides[line->sidenum[line->sidenum[1] != 0xFFFF ? 1 : 0]].rowoffset >> FRACBITS)
|
||||||
|
: R_GetRgbaA(source_colormap->fadergba);
|
||||||
|
if (alpha == 25)
|
||||||
|
alpha = 0; // HACK: fadergba A defaults at 25, so don't add anything in this case
|
||||||
|
alpha = max(min(R_GetRgbaA(target_colormap->fadergba) + alpha, 25), 0);
|
||||||
|
|
||||||
|
target_colormap->fadergba = R_PutRgbaRGBA(red, green, blue, alpha);
|
||||||
|
|
||||||
|
if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(target_colormap)))
|
||||||
{
|
{
|
||||||
dest_colormap->colormap = R_CreateLightTable(dest_colormap);
|
target_colormap->colormap = R_CreateLightTable(target_colormap);
|
||||||
R_AddColormapToList(dest_colormap);
|
R_AddColormapToList(target_colormap);
|
||||||
sectors[secnum].extra_colormap = dest_colormap;
|
sectors[secnum].extra_colormap = target_colormap;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
memset(dest_colormap, 0, sizeof(*dest_colormap));
|
memset(target_colormap, 0, sizeof(*target_colormap));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue