From 7cf9ad2f2b7caac40f5907963c227f27a4217666 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Fri, 20 Mar 2020 11:19:30 +0100 Subject: [PATCH] Adapt setup of colormap linedefs --- src/p_setup.c | 88 +++++++++++++++++++++-- src/p_spec.c | 188 +++++++++++++++++++++++++++++--------------------- src/r_data.c | 7 +- src/r_data.h | 1 - 4 files changed, 197 insertions(+), 87 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index fc8b8c063..3a70b8af3 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1131,8 +1131,11 @@ static void P_LoadSidedefs(UINT8 *data) case 455: // Fade colormaps! mazmazz 9/12/2018 (:flag_us:) // SoM: R_CreateColormap will only create a colormap in software mode... // Perhaps we should just call it instead of doing the calculations here. - sd->colormap_data = R_CreateColormapFromLinedef(msd->toptexture, msd->midtexture, msd->bottomtexture); - sd->toptexture = sd->midtexture = sd->bottomtexture = 0; + if (!udmf) + { + sd->colormap_data = R_CreateColormapFromLinedef(msd->toptexture, msd->midtexture, msd->bottomtexture); + sd->toptexture = sd->midtexture = sd->bottomtexture = 0; + } break; case 413: // Change music @@ -1713,7 +1716,7 @@ static void P_LoadTextmap(void) { INT32 rgba = P_ColorToRGBA(textmap_colormap.lightcolor, textmap_colormap.lightalpha); INT32 fadergba = P_ColorToRGBA(textmap_colormap.fadecolor, textmap_colormap.fadealpha); - sc->extra_colormap = R_CreateColormap(rgba, fadergba, textmap_colormap.fadestart, textmap_colormap.fadeend, textmap_colormap.flags); + sc->extra_colormap = sc->spawn_extra_colormap = R_CreateColormap(rgba, fadergba, textmap_colormap.fadestart, textmap_colormap.fadeend, textmap_colormap.flags); } TextmapFixFlatOffsets(sc); } @@ -1787,9 +1790,9 @@ static void P_ProcessLinedefsAfterSidedefs(void) 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; - // Compile linedef 'text' from both sidedefs 'text' for appropriate specials. switch (ld->special) { + // Compile linedef 'text' from both sidedefs 'text' for appropriate specials. case 331: // Trigger linedef executor: Skin - Continuous case 332: // Trigger linedef executor: Skin - Each time case 333: // Trigger linedef executor: Skin - Once @@ -1805,6 +1808,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); } 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; } } } @@ -2768,6 +2806,48 @@ static void P_ConvertBinaryMap(void) 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)); 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 701: //Slope front sector ceiling case 702: //Slope front sector floor and ceiling diff --git a/src/p_spec.c b/src/p_spec.c index b04a8d66e..2cd76f129 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3496,46 +3496,50 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Except it is activated by linedef executor, not level load // This could even override existing colormaps I believe // -- 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;) { P_ResetColormapFader(§ors[secnum]); - if (line->flags & ML_EFFECT3) // relative calc + if (line->args[2] & 1) // relative calc { - extracolormap_t *exc = R_AddColormaps( - (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 - sides[line->sidenum[0]].colormap_data, - line->flags & ML_EFFECT1, // subtract R - line->flags & ML_NOCLIMB, // subtract G - line->flags & ML_EFFECT2, // subtract B - false, // subtract A (no flag for this, just pass negative alpha) - line->flags & ML_EFFECT1, // subtract FadeR - line->flags & ML_NOCLIMB, // subtract FadeG - line->flags & ML_EFFECT2, // subtract FadeB - false, // subtract FadeA (no flag for this, just pass negative alpha) - false, // subtract FadeStart (we ran out of flags) - false, // subtract FadeEnd (we ran out of 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); + 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 - if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc))) - { - exc->colormap = R_CreateLightTable(exc); - R_AddColormapToList(exc); - sectors[secnum].extra_colormap = exc; - } - else - 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)); + extracolormap_t *exc = R_AddColormaps( + target, + source, + line->args[2] & 2, // subtract R + line->args[2] & 4, // subtract G + line->args[2] & 8, // subtract B + line->args[2] & 16, // subtract A + line->args[2] & 32, // subtract FadeR + line->args[2] & 64, // subtract FadeG + line->args[2] & 128, // subtract FadeB + line->args[2] & 256, // subtract FadeA + line->args[2] & 512, // subtract FadeStart + line->args[2] & 1024, // subtract FadeEnd + line->args[2] & 2048, // ignore Flags + false); if (!(sectors[secnum].extra_colormap = R_GetColormapFromList(exc))) { @@ -3547,10 +3551,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) Z_Free(exc); } else - sectors[secnum].extra_colormap = sides[line->sidenum[0]].colormap_data; + sectors[secnum].extra_colormap = source; } break; - + } case 448: // Change skybox viewpoint/centerpoint if ((mo && mo->player && P_IsLocalPlayer(mo->player)) || (line->flags & ML_NOCLIMB)) { @@ -3824,15 +3828,32 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } 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; - 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 (!(line->flags & ML_EFFECT5) + // Don't interrupt ongoing fade + if (!(line->args[3] & 8192) && sectors[secnum].fadecolormapdata) //&& ((fadecolormap_t*)sectors[secnum].fadecolormapdata)->timer > (ticbased ? 2 : speed*2)) { @@ -3840,19 +3861,19 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) 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) ? - sides[line->sidenum[1]].colormap_data : NULL; + sides[line->sidenum[1]].colormap_data : NULL; exc = sectors[secnum].extra_colormap; - if (!(line->flags & ML_BOUNCY) // BOUNCY: Do not override fade from default rgba - && !R_CheckDefaultColormap(sides[line->sidenum[0]].colormap_data, true, false, false) + if (!(line->args[3] & 4096) // Override fade from default rgba + && !R_CheckDefaultColormap(dest, true, false, false) && R_CheckDefaultColormap(exc, true, false, false)) { exc = R_CopyColormap(exc, false); - exc->rgba = R_GetRgbaRGB(sides[line->sidenum[0]].colormap_data->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->rgba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->rgba)); + //exc->fadergba = R_GetRgbaRGB(dest->rgba) + R_PutRgbaA(R_GetRgbaA(exc->fadergba)); if (!(source_exc = R_GetColormapFromList(exc))) { @@ -3868,35 +3889,26 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) else source_exc = exc ? exc : R_GetDefaultColormap(); - if (line->flags & ML_EFFECT3) // relative calc + if (line->args[3] & 1) // relative calc { exc = R_AddColormaps( source_exc, - sides[line->sidenum[0]].colormap_data, - line->flags & ML_EFFECT1, // subtract R - line->flags & ML_NOCLIMB, // subtract G - line->flags & ML_EFFECT2, // subtract B - false, // subtract A (no flag for this, just pass negative alpha) - line->flags & ML_EFFECT1, // subtract FadeR - line->flags & ML_NOCLIMB, // subtract FadeG - line->flags & ML_EFFECT2, // subtract FadeB - false, // subtract FadeA (no flag for this, just pass negative alpha) - false, // subtract FadeStart (we ran out of flags) - false, // subtract FadeEnd (we ran out of 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, + dest, + line->args[3] & 2, // subtract R + line->args[3] & 4, // subtract G + line->args[3] & 8, // subtract B + line->args[3] & 16, // subtract A + line->args[3] & 32, // subtract FadeR + line->args[3] & 64, // subtract FadeG + line->args[3] & 128, // subtract FadeB + line->args[3] & 256, // subtract FadeA + line->args[3] & 512, // subtract FadeStart + line->args[3] & 1024, // subtract FadeEnd + line->args[3] & 2048, // ignore Flags 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 - exc = R_CopyColormap(sides[line->sidenum[0]].colormap_data, false); + exc = R_CopyColormap(dest, false); if (!(dest_exc = R_GetColormapFromList(exc))) { @@ -3907,13 +3919,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) else Z_Free(exc); - Add_ColormapFader(§ors[secnum], source_exc, dest_exc, (line->flags & ML_EFFECT4), // tic-based timing - speed); + Add_ColormapFader(§ors[secnum], source_exc, dest_exc, true, // tic-based timing + line->args[2]); } break; - + } 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]); break; @@ -7398,8 +7410,28 @@ void P_SpawnSpecials(boolean fromnetsave) break; case 606: // HACK! Copy colormaps. Just plain colormaps. - for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;) - sectors[s].extra_colormap = sectors[s].spawn_extra_colormap = sides[lines[i].sidenum[0]].colormap_data; + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0], s)) >= 0;) + { + extracolormap_t *exc; + 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; default: diff --git a/src/r_data.c b/src/r_data.c index 031731873..db6c13d0f 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -2373,7 +2373,6 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex boolean subR, boolean subG, boolean subB, boolean subA, boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA, boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags, - boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha, boolean lighttable) { INT16 red, green, blue, alpha; @@ -2409,7 +2408,7 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex * R_GetRgbaB(exc_addend->rgba) , 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); exc_augend->rgba = R_PutRgbaRGBA(red, green, blue, alpha); @@ -2436,8 +2435,8 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex * R_GetRgbaB(exc_addend->fadergba) , 255), 0); - alpha = useAltAlpha ? altFadeAlpha : R_GetRgbaA(exc_addend->fadergba); - if (alpha == 25 && !useAltAlpha && !R_GetRgbaRGB(exc_addend->fadergba)) + alpha = R_GetRgbaA(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 = max(min(R_GetRgbaA(exc_augend->fadergba) + (subFadeA ? -1 : 1) * alpha, 25), 0); diff --git a/src/r_data.h b/src/r_data.h index c2c38be05..87e2a05bc 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -153,7 +153,6 @@ extracolormap_t *R_AddColormaps(extracolormap_t *exc_augend, extracolormap_t *ex boolean subR, boolean subG, boolean subB, boolean subA, boolean subFadeR, boolean subFadeG, boolean subFadeB, boolean subFadeA, boolean subFadeStart, boolean subFadeEnd, boolean ignoreFlags, - boolean useAltAlpha, INT16 altAlpha, INT16 altFadeAlpha, boolean lighttable); #ifdef EXTRACOLORMAPLUMPS extracolormap_t *R_ColormapForName(char *name);