From 5558fb073ac92ebd1e3c3dc2a632a20542d6f580 Mon Sep 17 00:00:00 2001 From: Sryder Date: Sun, 18 Oct 2020 19:10:19 +0100 Subject: [PATCH 01/11] Basic additive transmap/blend support Can currently be used on sprites only added to flames by default because it makes sense --- src/dehacked.c | 4 ++++ src/hardware/hw_main.c | 1 + src/info.c | 14 +++++++------- src/p_mobj.h | 1 + src/p_pspr.h | 2 ++ src/r_draw.c | 3 ++- 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2d7b58ac9..b57d52c7f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11123,6 +11123,7 @@ struct { {"FF_TRANS70",FF_TRANS70}, {"FF_TRANS80",FF_TRANS80}, {"FF_TRANS90",FF_TRANS90}, + {"FF_TRANSADD",FF_TRANSADD}, // compatibility // Transparency for SOCs is pre-shifted {"TR_TRANS10",tr_trans10<PolyColor.s.alpha = 0x4c;return PF_Translucent; case tr_trans80 : pSurf->PolyColor.s.alpha = 0x33;return PF_Translucent; case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent; + case tr_transadd : pSurf->PolyColor.s.alpha = 0xFF;return PF_Additive; } return PF_Translucent; } diff --git a/src/info.c b/src/info.c index 6d5bac1ea..cfa51f9cd 100644 --- a/src/info.c +++ b/src/info.c @@ -2231,9 +2231,9 @@ state_t states[NUMSTATES] = {SPR_CHAN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_CEZCHAIN // Flame - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE - {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, 3*8, {A_FlameParticle}, 7, 3, S_FLAME}, // S_FLAME + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD|8, TICRATE, {NULL}, 3, 3, S_NULL}, // S_FLAMEPARTICLE + {SPR_FLAM, FF_FULLBRIGHT|FF_ANIMATE|FF_TRANSADD, -1, {NULL}, 7, 3, S_NULL}, // S_FLAMEREST // Eggman statue {SPR_ESTA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_EGGSTATUE1 @@ -4383,10 +4383,10 @@ state_t states[NUMSTATES] = {SPR_AUDI, 4|FF_ANIMATE, -1, {NULL}, 1, 17, S_NULL}, // S_AUDIENCE_CHAO_LOSE - {SPR_FLAM, 0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1, - {SPR_FLAM, 1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2, - {SPR_FLAM, 2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3, - {SPR_FLAM, 3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|0, 3, {NULL}, 0, 0, S_FLAYM2}, // S_FLAYM1, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|1, 3, {NULL}, 0, 0, S_FLAYM3}, // S_FLAYM2, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|2, 3, {NULL}, 0, 0, S_FLAYM4}, // S_FLAYM3, + {SPR_FLAM, FF_FULLBRIGHT|FF_TRANSADD|3, 3, {NULL}, 0, 0, S_FLAYM1}, // S_FLAYM4, {SPR_DECO, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DEVIL, {SPR_DECO, 1, -1, {NULL}, 0, 0, S_NULL}, // S_ANGEL, diff --git a/src/p_mobj.h b/src/p_mobj.h index cd0cc3bc7..04a75c85e 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -268,6 +268,7 @@ typedef enum MFD_TRANS70 = 0x0070, MFD_TRANS80 = 0x0080, MFD_TRANS90 = 0x0090, + MFD_TRANSADD = 0x00A0, MFD_TRANSMASK = 0x00F0, // Brightness override flags MFD_FULLBRIGHT = 0x0100, diff --git a/src/p_pspr.h b/src/p_pspr.h index 6eaf33279..eaa469cd7 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -59,6 +59,7 @@ #define FF_TRANS70 (tr_trans70< Date: Mon, 19 Oct 2020 11:57:12 +0100 Subject: [PATCH 02/11] Subtractive translation map --- src/dehacked.c | 3 +++ src/hardware/hw_main.c | 1 + src/p_mobj.h | 1 + src/p_pspr.h | 2 ++ src/r_draw.c | 3 ++- 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/dehacked.c b/src/dehacked.c index b57d52c7f..c564174c2 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11124,6 +11124,7 @@ struct { {"FF_TRANS80",FF_TRANS80}, {"FF_TRANS90",FF_TRANS90}, {"FF_TRANSADD",FF_TRANSADD}, + {"FF_TRANSSUB",FF_TRANSSUB}, // compatibility // Transparency for SOCs is pre-shifted {"TR_TRANS10",tr_trans10<PolyColor.s.alpha = 0x33;return PF_Translucent; case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent; case tr_transadd : pSurf->PolyColor.s.alpha = 0xFF;return PF_Additive; + case tr_transsub : pSurf->PolyColor.s.alpha = 0xFF;return PF_Substractive; } return PF_Translucent; } diff --git a/src/p_mobj.h b/src/p_mobj.h index 04a75c85e..6ffa393aa 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -269,6 +269,7 @@ typedef enum MFD_TRANS80 = 0x0080, MFD_TRANS90 = 0x0090, MFD_TRANSADD = 0x00A0, + MFD_TRANSSUB = 0x00B0, MFD_TRANSMASK = 0x00F0, // Brightness override flags MFD_FULLBRIGHT = 0x0100, diff --git a/src/p_pspr.h b/src/p_pspr.h index eaa469cd7..cbc1a845f 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -60,6 +60,7 @@ #define FF_TRANS80 (tr_trans80< Date: Thu, 22 Oct 2020 22:27:14 +0100 Subject: [PATCH 03/11] Additive/Subtractive translation map support on midtextures --- src/hardware/hw_main.c | 7 +++++-- src/r_segs.c | 24 ++++++++++++++++++++---- src/r_segs.h | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 4d5b136cf..9d0dc91b0 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1466,11 +1466,14 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom blendmode = PF_Translucent; break; default: - if (gl_linedef->alpha >= 0 && gl_linedef->alpha < FRACUNIT) - blendmode = HWR_TranstableToAlpha(R_GetLinedefTransTable(gl_linedef->alpha), &Surf); + { + transnum_t transtable = R_GetLinedefTransTable(gl_linedef); + if (transtable != NUMTRANSMAPS) + blendmode = HWR_TranstableToAlpha(transtable, &Surf); else blendmode = PF_Masked; break; + } } if (gl_curline->polyseg && gl_curline->polyseg->translucency > 0) diff --git a/src/r_segs.c b/src/r_segs.c index a848dd884..a646ff440 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -270,9 +270,23 @@ static void R_Render2sidedMultiPatchColumn(column_t *column) } } -transnum_t R_GetLinedefTransTable(fixed_t alpha) +transnum_t R_GetLinedefTransTable(line_t *ldef) { - return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); + transnum_t transnum = NUMTRANSMAPS; // Send back NUMTRANSMAPS for none + fixed_t alpha = ldef->alpha; + if (alpha > 0 && alpha < FRACUNIT) + transnum = (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); + else + { + switch (ldef->special) + { + case 910: transnum = tr_transadd; break; + case 911: transnum = tr_transsub; break; + default: transnum = NUMTRANSMAPS; break; + } + } + + return transnum; } void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) @@ -289,6 +303,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) INT32 times, repeats; INT64 overflow_test; INT32 range; + transnum_t transtable = NUMTRANSMAPS; // Calculate light table. // Use different light tables @@ -305,9 +320,10 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (!ldef->alpha) return; - if (ldef->alpha > 0 && ldef->alpha < FRACUNIT) + transtable = R_GetLinedefTransTable(ldef); + if (transtable != NUMTRANSMAPS) { - dc_transmap = transtables + ((R_GetLinedefTransTable(ldef->alpha) - 1) << FF_TRANSSHIFT); + dc_transmap = transtables + ((transtable - 1) << FF_TRANSSHIFT); colfunc = colfuncs[COLDRAWFUNC_FUZZY]; } diff --git a/src/r_segs.h b/src/r_segs.h index ace5711d4..6a79047e0 100644 --- a/src/r_segs.h +++ b/src/r_segs.h @@ -18,7 +18,7 @@ #pragma interface #endif -transnum_t R_GetLinedefTransTable(fixed_t alpha); +transnum_t R_GetLinedefTransTable(line_t *line); void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2); void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pffloor); void R_StoreWallRange(INT32 start, INT32 stop); From d311242a6e226c367c3f0c0e5f2f62a57a709f4d Mon Sep 17 00:00:00 2001 From: Sryder Date: Thu, 22 Oct 2020 23:13:51 +0100 Subject: [PATCH 04/11] Support for additive/subtractive translation maps on FOFs and Polyobjects Polyobjects set translucency to 11 for additive, and 12 for subtractive FOFs using the regular translucency settings set the top texture to #900 for additive, and #901 for subtractive --- src/hardware/hw_main.c | 50 +++++++++++++++++++++++++++++++++--------- src/p_polyobj.c | 2 +- src/r_defs.h | 3 +++ src/r_plane.c | 6 ++++- src/r_segs.c | 4 ++++ 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 9d0dc91b0..0e0c83f9f 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1735,10 +1735,17 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { - blendmode = PF_Translucent; - Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; + if (rover->alpha < 256) + { + blendmode = PF_Translucent; + Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1); + } + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; } if (gl_frontsector->numlights) @@ -1835,10 +1842,17 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { - blendmode = PF_Translucent; - Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; + if (rover->alpha < 256) + { + blendmode = PF_Translucent; + Surf.PolyColor.s.alpha = (UINT8)(rover->alpha-1 > 255 ? 255 : rover->alpha-1); + } + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; } if (gl_backsector->numlights) @@ -3098,8 +3112,16 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient + else if (rover->flags & FF_TRANSLUCENT + && (rover->alpha < 256 + || rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient { + FBITFIELD blendmode = PF_Translucent; + if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; + light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_AddTransparentFloor(&levelflats[*rover->bottompic], @@ -3107,7 +3129,7 @@ static void HWR_Subsector(size_t num) false, *rover->bottomheight, *gl_frontsector->lightlist[light].lightlevel, - rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode, false, *gl_frontsector->lightlist[light].extra_colormap); } else @@ -3143,8 +3165,16 @@ static void HWR_Subsector(size_t num) alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + else if (rover->flags & FF_TRANSLUCENT + && (rover->alpha < 256 + || rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE || rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE)) // SoM: Flags are more efficient { + FBITFIELD blendmode = PF_Translucent; + if (rover->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + blendmode = PF_Additive; + else if (rover->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + blendmode = PF_Substractive; + light = R_GetPlaneLight(gl_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); HWR_AddTransparentFloor(&levelflats[*rover->toppic], @@ -3152,7 +3182,7 @@ static void HWR_Subsector(size_t num) true, *rover->topheight, *gl_frontsector->lightlist[light].lightlevel, - rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent, + rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|blendmode, false, *gl_frontsector->lightlist[light].extra_colormap); } else diff --git a/src/p_polyobj.c b/src/p_polyobj.c index 5ec8fe007..645cf010d 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -2563,7 +2563,7 @@ void T_PolyObjFade(polyfade_t *th) { if (po->translucency >= NUMTRANSMAPS) // HACK: OpenGL renders fully opaque when >= NUMTRANSMAPS - po->translucency = NUMTRANSMAPS-1; + po->translucency = tr_trans90; po->flags |= (po->spawnflags & POF_RENDERALL); diff --git a/src/r_defs.h b/src/r_defs.h index 715067176..8372a5ae5 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -152,6 +152,9 @@ typedef enum FF_GOOWATER = FF_SHATTERBOTTOM, ///< Used with ::FF_SWIMMABLE. Makes thick bouncey goop. } ffloortype_e; +#define FFLOOR_ALPHA_SPECIAL_ADDITIVE (901) +#define FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE (902) + typedef struct ffloor_s { fixed_t *topheight; diff --git a/src/r_plane.c b/src/r_plane.c index 3e6f30235..7439886d7 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -952,7 +952,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->polyobj) { // Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red) - if (pl->polyobj->translucency >= 10) + if (pl->polyobj->translucency >= NUMTRANSMAPS) return; // Don't even draw it else if (pl->polyobj->translucency > 0) { @@ -1013,6 +1013,10 @@ void R_DrawSinglePlane(visplane_t *pl) ds_transmap = transtables + ((tr_trans20-1)<ffloor->alpha < 243) ds_transmap = transtables + ((tr_trans10-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + dc_transmap = transtables + ((tr_transadd-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + dc_transmap = transtables + ((tr_transsub-1)<alpha < 243) dc_transmap = transtables + ((tr_trans10-1)<alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) + dc_transmap = transtables + ((tr_transadd-1)<alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) + dc_transmap = transtables + ((tr_transsub-1)< Date: Sat, 24 Oct 2020 00:50:58 +0100 Subject: [PATCH 05/11] Fix dumb copy paste error that caused software to crash --- src/r_plane.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_plane.c b/src/r_plane.c index 7439886d7..0f11bcb02 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -1014,9 +1014,9 @@ void R_DrawSinglePlane(visplane_t *pl) else if (pl->ffloor->alpha < 243) ds_transmap = transtables + ((tr_trans10-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_ADDITIVE) - dc_transmap = transtables + ((tr_transadd-1)<ffloor->alpha == FFLOOR_ALPHA_SPECIAL_SUBTRACTIVE) - dc_transmap = transtables + ((tr_transsub-1)< Date: Sat, 24 Oct 2020 01:02:01 +0100 Subject: [PATCH 06/11] Fix the additive/subtractive floors not working in OpenGL. --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 0e0c83f9f..22f1e0b0a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -551,7 +551,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool HWR_Lighting(&Surf, lightlevel, planecolormap); - if (PolyFlags & (PF_Translucent|PF_Fog)) + if (PolyFlags & (PF_Translucent|PF_Additive|PF_Substractive|PF_Fog)) { Surf.PolyColor.s.alpha = (UINT8)alpha; PolyFlags |= PF_Modulated; From b16a16027d8b65550d9e0f45f8b390c9b18faf4e Mon Sep 17 00:00:00 2001 From: Sryder Date: Sun, 25 Oct 2020 00:27:28 +0100 Subject: [PATCH 07/11] Fix additive/subtractive walls not working when sectors have multiple lights in OpenGL This is a change that could have broken other areas so should be checked too for other areas --- src/hardware/hw_main.c | 90 ++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 22f1e0b0a..c7886c4a2 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -850,7 +850,7 @@ static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2) // // HWR_SplitWall // -static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor) +static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor, FBITFIELD blendmode) { /* SoM: split up and light walls according to the lightlist. This may also include leaving out parts @@ -987,12 +987,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, wallVerts[0].y = bot; wallVerts[1].y = endbot; - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + if (blendmode & PF_Fog) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap); + else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap); else - HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); + HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap); top = bot; endtop = endbot; @@ -1016,12 +1016,12 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, wallVerts[0].y = bot; wallVerts[1].y = endbot; - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + if (blendmode & PF_Fog) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, true, lightnum, colormap); + else if (blendmode & (PF_Translucent|PF_Additive|PF_Substractive|PF_Environment)) + HWR_AddTransparentWall(wallVerts, Surf, texnum, blendmode, false, lightnum, colormap); else - HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); + HWR_ProjectWall(wallVerts, Surf, blendmode, lightnum, colormap); } // HWR_DrawSkyWall @@ -1201,12 +1201,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); wallVerts[1].y = FIXED_TO_FLOAT(worldhighslope); - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL); - else if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, PF_Environment, false, lightnum, colormap); - else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + FBITFIELD blendmode = PF_Masked; + + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Environment; + + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_toptexture, &Surf, FF_CUTLEVEL, NULL, blendmode); + else if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_toptexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } // check BOTTOM TEXTURE @@ -1267,12 +1274,19 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldlowslope); wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL); - else if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, PF_Environment, false, lightnum, colormap); - else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + FBITFIELD blendmode = PF_Masked; + + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Environment; + + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_bottomtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); + else if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_bottomtexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } gl_midtexture = R_GetTextureNum(gl_sidedef->midtexture); if (gl_midtexture) @@ -1490,10 +1504,10 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_frontsector->numlights) { if (!(blendmode & PF_Masked)) - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL); + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_TRANSLUCENT, NULL, blendmode); else { - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); } } else if (!(blendmode & PF_Masked)) @@ -1574,15 +1588,21 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom wallVerts[2].y = FIXED_TO_FLOAT(worldtopslope); wallVerts[1].y = FIXED_TO_FLOAT(worldbottomslope); - // I don't think that solid walls can use translucent linedef types... - if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL); - else { + FBITFIELD blendmode = PF_Masked; if (grTex->mipmap.flags & TF_TRANSPARENT) - HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, PF_Environment, false, lightnum, colormap); + blendmode = PF_Environment; + + // I don't think that solid walls can use translucent linedef types... + if (gl_frontsector->numlights) + HWR_SplitWall(gl_frontsector, wallVerts, gl_midtexture, &Surf, FF_CUTLEVEL, NULL, blendmode); else - HWR_ProjectWall(wallVerts, &Surf, PF_Masked, lightnum, colormap); + { + if (grTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, &Surf, gl_midtexture, blendmode, false, lightnum, colormap); + else + HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap); + } } } @@ -1727,7 +1747,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -1749,7 +1769,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom } if (gl_frontsector->numlights) - HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gl_frontsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) @@ -1834,7 +1854,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitWall(gl_backsector, wallVerts, 0, &Surf, rover->flags, rover, blendmode); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -1856,7 +1876,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom } if (gl_backsector->numlights) - HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gl_backsector, wallVerts, texnum, &Surf, rover->flags, rover, blendmode); else { if (blendmode != PF_Masked) From dc453fbbda15f6a40bdac3f9455dad44f8f0bfbd Mon Sep 17 00:00:00 2001 From: Sryder Date: Sun, 25 Oct 2020 23:19:20 +0000 Subject: [PATCH 08/11] Fix various things that used NUMTRANSMAPS for the number of translucent trans maps --- src/dehacked.c | 1 + src/hu_stuff.c | 10 +++++----- src/k_battle.c | 4 ++-- src/p_mobj.c | 22 +++++++++++----------- src/p_polyobj.c | 16 ++++++++-------- src/p_pspr.h | 3 ++- src/p_setup.c | 2 +- src/p_spec.c | 2 +- src/s_sound.c | 2 +- 9 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 9bd84fdbc..6268aca86 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11148,6 +11148,7 @@ struct { {"tr_trans70",tr_trans70}, {"tr_trans80",tr_trans80}, {"tr_trans90",tr_trans90}, + {"NUMTRANSLUCENTTRANSMAPS",NUMTRANSLUCENTTRANSMAPS}, {"tr_transadd",tr_transadd}, {"tr_transsub",tr_transsub}, {"NUMTRANSMAPS",NUMTRANSMAPS}, diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 35f977bd6..93192d796 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -703,7 +703,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum) } else if (target == -1) // say team { - if (players[playernum].ctfteam == 1) + if (players[playernum].ctfteam == 1) { // red text cstart = textcolor = "\x85"; @@ -1934,7 +1934,7 @@ void HU_DrawSongCredits(void) } else { - if (cursongcredit.trans < NUMTRANSMAPS) + if (cursongcredit.trans < NUMTRANSLUCENTTRANSMAPS) cursongcredit.trans++; if (cursongcredit.x > 0) cursongcredit.x /= 2; @@ -1942,10 +1942,10 @@ void HU_DrawSongCredits(void) cursongcredit.x = 0; } - bgt = (NUMTRANSMAPS/2)+(cursongcredit.trans/2); - if (bgt < NUMTRANSMAPS) + bgt = (NUMTRANSLUCENTTRANSMAPS/2)+(cursongcredit.trans/2); + if (bgt < NUMTRANSLUCENTTRANSMAPS) V_DrawScaledPatch(cursongcredit.x, y-2, V_SNAPTOLEFT|(bgt<x, battleovertime.y-players[displayplayers[0]].mo->y); - transparency = max(0, NUMTRANSMAPS - ((256 + (dist>>FRACBITS)) / 256)); + transparency = max(0, NUMTRANSLUCENTTRANSMAPS - ((256 + (dist>>FRACBITS)) / 256)); } - if (transparency < NUMTRANSMAPS) + if (transparency < NUMTRANSLUCENTTRANSMAPS) { mobj_t *beam = P_SpawnMobj(battleovertime.x, battleovertime.y, battleovertime.z + (mobjinfo[MT_RANDOMITEM].height/2), MT_OVERTIMEBEAM); P_SetScale(beam, beam->scale*2); diff --git a/src/p_mobj.c b/src/p_mobj.c index be907321e..25cb1bf8c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6442,7 +6442,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->color = K_RainbowColor( (SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state + ((mobj->fuse - 32) * 2) // Make the color flashing slow down while it runs out - ); + ); switch (mobj->extravalue1) { @@ -6674,12 +6674,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj) const angle_t off = FixedAngle(40*FRACUNIT); angle_t ang = mobj->target->angle; fixed_t z; - UINT8 trans = (mobj->target->player->kartstuff[k_tiregrease] * (NUMTRANSMAPS+1)) / greasetics; + UINT8 trans = (mobj->target->player->kartstuff[k_tiregrease] * (NUMTRANSLUCENTTRANSMAPS+1)) / greasetics; - if (trans > NUMTRANSMAPS) - trans = NUMTRANSMAPS; + if (trans > NUMTRANSLUCENTTRANSMAPS) + trans = NUMTRANSLUCENTTRANSMAPS; - trans = NUMTRANSMAPS - trans; + trans = NUMTRANSLUCENTTRANSMAPS - trans; z = mobj->target->z; if (mobj->eflags & MFE_VERTICALFLIP) @@ -6702,7 +6702,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (leveltime & 1) mobj->drawflags |= MFD_DONTDRAW; - if (trans >= NUMTRANSMAPS) + if (trans >= NUMTRANSLUCENTTRANSMAPS) mobj->drawflags |= MFD_DONTDRAW; else if (trans == 0) mobj->drawflags = (mobj->drawflags & ~MFD_TRANSMASK); @@ -8437,15 +8437,15 @@ void P_MobjThinker(mobj_t *mobj) { if (mobj->flags2 & MF2_BOSSNOTRAP) // "fast" flag { - if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSMAPS-1) - (2*mobj->fuse)/3) + if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSLUCENTTRANSMAPS-1) - (2*mobj->fuse)/3) // fade out when nearing the end of fuse... - mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSMAPS-1) - (2*mobj->fuse)/3) << FF_TRANSSHIFT); + mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSLUCENTTRANSMAPS-1) - (2*mobj->fuse)/3) << FF_TRANSSHIFT); } else { - if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSMAPS-1) - mobj->fuse / 2) + if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSLUCENTTRANSMAPS-1) - mobj->fuse / 2) // fade out when nearing the end of fuse... - mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSMAPS-1) - mobj->fuse / 2) << FF_TRANSSHIFT); + mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSLUCENTTRANSMAPS-1) - mobj->fuse / 2) << FF_TRANSSHIFT); } } @@ -10048,7 +10048,7 @@ void P_SpawnPlayer(INT32 playernum) /* if (bonusgame || specialstage) { - // Bots should avoid + // Bots should avoid p->spectator = true; } */ diff --git a/src/p_polyobj.c b/src/p_polyobj.c index eff28e21d..6b6d7d588 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -2515,7 +2515,7 @@ void T_PolyObjFade(polyfade_t *th) if (th->timer <= 0) { - po->translucency = max(min(th->destvalue, NUMTRANSMAPS), 0); + po->translucency = max(min(th->destvalue, NUMTRANSLUCENTTRANSMAPS), 0); // remove thinker if (po->thinker == &th->thinker) @@ -2526,8 +2526,8 @@ void T_PolyObjFade(polyfade_t *th) { INT16 delta = abs(th->destvalue - th->sourcevalue); INT32 duration = th->ticbased ? th->duration - : abs(FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->destvalue) - - FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->sourcevalue)); // speed-based internal counter duration: delta in 256 scale + : abs(FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->destvalue) + - FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->sourcevalue)); // speed-based internal counter duration: delta in 256 scale fixed_t factor = min(FixedDiv(duration - th->timer, duration), 1*FRACUNIT); if (th->destvalue < th->sourcevalue) po->translucency = max(min(po->translucency, th->sourcevalue - (INT16)FixedMul(delta, factor)), th->destvalue); @@ -2538,7 +2538,7 @@ void T_PolyObjFade(polyfade_t *th) if (!stillfading) { // set render flags - if (po->translucency >= NUMTRANSMAPS) // invisible + if (po->translucency >= NUMTRANSLUCENTTRANSMAPS) // invisible po->flags &= ~POF_RENDERALL; else po->flags |= (po->spawnflags & POF_RENDERALL); @@ -2561,8 +2561,8 @@ void T_PolyObjFade(polyfade_t *th) } else { - if (po->translucency >= NUMTRANSMAPS) - // HACK: OpenGL renders fully opaque when >= NUMTRANSMAPS + if (po->translucency >= NUMTRANSLUCENTTRANSMAPS) + // HACK: OpenGL renders add/sub.opaque when >= NUMTRANSLUCENTTRANSMAPS po->translucency = tr_trans90; po->flags |= (po->spawnflags & POF_RENDERALL); @@ -2630,8 +2630,8 @@ boolean EV_DoPolyObjFade(polyfadedata_t *pfdata) else { th->ticbased = false; - th->timer = abs(FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->destvalue) - - FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->sourcevalue)); // delta converted to 256 scale, use as internal counter + th->timer = abs(FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->destvalue) + - FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->sourcevalue)); // delta converted to 256 scale, use as internal counter th->duration = abs(pfdata->speed); // use th->duration as speed decrement } diff --git a/src/p_pspr.h b/src/p_pspr.h index cbc1a845f..ee82ade6a 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -101,7 +101,8 @@ typedef enum tr_trans70, tr_trans80, tr_trans90, - tr_transadd, + NUMTRANSLUCENTTRANSMAPS, + tr_transadd = NUMTRANSLUCENTTRANSMAPS, tr_transsub, NUMTRANSMAPS } transnum_t; diff --git a/src/p_setup.c b/src/p_setup.c index 50f39c5fa..df4fec9c8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3381,7 +3381,7 @@ static void P_InitLevelSettings(void) // song credit init memset(&cursongcredit,0,sizeof(struct cursongcredit)); - cursongcredit.trans = NUMTRANSMAPS; + cursongcredit.trans = NUMTRANSLUCENTTRANSMAPS; for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/p_spec.c b/src/p_spec.c index 34a962975..2435e964d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1257,7 +1257,7 @@ static boolean PolyFade(line_t *line) else pfd.destvalue = value; - pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0); + pfd.destvalue = max(min(pfd.destvalue, NUMTRANSLUCENTTRANSMAPS), 0); // already equal, nothing to do if (po->translucency == pfd.destvalue) diff --git a/src/s_sound.c b/src/s_sound.c index 197e65e57..302a352a7 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1800,7 +1800,7 @@ void S_ShowMusicCredit(void) cursongcredit.def = def; cursongcredit.anim = 5*TICRATE; cursongcredit.x = 0; - cursongcredit.trans = NUMTRANSMAPS; + cursongcredit.trans = NUMTRANSLUCENTTRANSMAPS; return; } else From a585d3c9d1b6e4ce514afbf2bce33f6f853c007e Mon Sep 17 00:00:00 2001 From: Sryder Date: Mon, 26 Oct 2020 11:07:17 +0000 Subject: [PATCH 09/11] Revert "Fix various things that used NUMTRANSMAPS for the number of translucent trans maps" This reverts commit dc453fbbda15f6a40bdac3f9455dad44f8f0bfbd. --- src/dehacked.c | 1 - src/hu_stuff.c | 10 +++++----- src/k_battle.c | 4 ++-- src/p_mobj.c | 22 +++++++++++----------- src/p_polyobj.c | 16 ++++++++-------- src/p_pspr.h | 3 +-- src/p_setup.c | 2 +- src/p_spec.c | 2 +- src/s_sound.c | 2 +- 9 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 6268aca86..9bd84fdbc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11148,7 +11148,6 @@ struct { {"tr_trans70",tr_trans70}, {"tr_trans80",tr_trans80}, {"tr_trans90",tr_trans90}, - {"NUMTRANSLUCENTTRANSMAPS",NUMTRANSLUCENTTRANSMAPS}, {"tr_transadd",tr_transadd}, {"tr_transsub",tr_transsub}, {"NUMTRANSMAPS",NUMTRANSMAPS}, diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 93192d796..35f977bd6 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -703,7 +703,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum) } else if (target == -1) // say team { - if (players[playernum].ctfteam == 1) + if (players[playernum].ctfteam == 1) { // red text cstart = textcolor = "\x85"; @@ -1934,7 +1934,7 @@ void HU_DrawSongCredits(void) } else { - if (cursongcredit.trans < NUMTRANSLUCENTTRANSMAPS) + if (cursongcredit.trans < NUMTRANSMAPS) cursongcredit.trans++; if (cursongcredit.x > 0) cursongcredit.x /= 2; @@ -1942,10 +1942,10 @@ void HU_DrawSongCredits(void) cursongcredit.x = 0; } - bgt = (NUMTRANSLUCENTTRANSMAPS/2)+(cursongcredit.trans/2); - if (bgt < NUMTRANSLUCENTTRANSMAPS) + bgt = (NUMTRANSMAPS/2)+(cursongcredit.trans/2); + if (bgt < NUMTRANSMAPS) V_DrawScaledPatch(cursongcredit.x, y-2, V_SNAPTOLEFT|(bgt<x, battleovertime.y-players[displayplayers[0]].mo->y); - transparency = max(0, NUMTRANSLUCENTTRANSMAPS - ((256 + (dist>>FRACBITS)) / 256)); + transparency = max(0, NUMTRANSMAPS - ((256 + (dist>>FRACBITS)) / 256)); } - if (transparency < NUMTRANSLUCENTTRANSMAPS) + if (transparency < NUMTRANSMAPS) { mobj_t *beam = P_SpawnMobj(battleovertime.x, battleovertime.y, battleovertime.z + (mobjinfo[MT_RANDOMITEM].height/2), MT_OVERTIMEBEAM); P_SetScale(beam, beam->scale*2); diff --git a/src/p_mobj.c b/src/p_mobj.c index 25cb1bf8c..be907321e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6442,7 +6442,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->color = K_RainbowColor( (SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state + ((mobj->fuse - 32) * 2) // Make the color flashing slow down while it runs out - ); + ); switch (mobj->extravalue1) { @@ -6674,12 +6674,12 @@ static boolean P_MobjRegularThink(mobj_t *mobj) const angle_t off = FixedAngle(40*FRACUNIT); angle_t ang = mobj->target->angle; fixed_t z; - UINT8 trans = (mobj->target->player->kartstuff[k_tiregrease] * (NUMTRANSLUCENTTRANSMAPS+1)) / greasetics; + UINT8 trans = (mobj->target->player->kartstuff[k_tiregrease] * (NUMTRANSMAPS+1)) / greasetics; - if (trans > NUMTRANSLUCENTTRANSMAPS) - trans = NUMTRANSLUCENTTRANSMAPS; + if (trans > NUMTRANSMAPS) + trans = NUMTRANSMAPS; - trans = NUMTRANSLUCENTTRANSMAPS - trans; + trans = NUMTRANSMAPS - trans; z = mobj->target->z; if (mobj->eflags & MFE_VERTICALFLIP) @@ -6702,7 +6702,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (leveltime & 1) mobj->drawflags |= MFD_DONTDRAW; - if (trans >= NUMTRANSLUCENTTRANSMAPS) + if (trans >= NUMTRANSMAPS) mobj->drawflags |= MFD_DONTDRAW; else if (trans == 0) mobj->drawflags = (mobj->drawflags & ~MFD_TRANSMASK); @@ -8437,15 +8437,15 @@ void P_MobjThinker(mobj_t *mobj) { if (mobj->flags2 & MF2_BOSSNOTRAP) // "fast" flag { - if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSLUCENTTRANSMAPS-1) - (2*mobj->fuse)/3) + if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSMAPS-1) - (2*mobj->fuse)/3) // fade out when nearing the end of fuse... - mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSLUCENTTRANSMAPS-1) - (2*mobj->fuse)/3) << FF_TRANSSHIFT); + mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSMAPS-1) - (2*mobj->fuse)/3) << FF_TRANSSHIFT); } else { - if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSLUCENTTRANSMAPS-1) - mobj->fuse / 2) + if ((signed)((mobj->frame & FF_TRANSMASK) >> FF_TRANSSHIFT) < (NUMTRANSMAPS-1) - mobj->fuse / 2) // fade out when nearing the end of fuse... - mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSLUCENTTRANSMAPS-1) - mobj->fuse / 2) << FF_TRANSSHIFT); + mobj->frame = (mobj->frame & ~FF_TRANSMASK) | (((NUMTRANSMAPS-1) - mobj->fuse / 2) << FF_TRANSSHIFT); } } @@ -10048,7 +10048,7 @@ void P_SpawnPlayer(INT32 playernum) /* if (bonusgame || specialstage) { - // Bots should avoid + // Bots should avoid p->spectator = true; } */ diff --git a/src/p_polyobj.c b/src/p_polyobj.c index 6b6d7d588..eff28e21d 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -2515,7 +2515,7 @@ void T_PolyObjFade(polyfade_t *th) if (th->timer <= 0) { - po->translucency = max(min(th->destvalue, NUMTRANSLUCENTTRANSMAPS), 0); + po->translucency = max(min(th->destvalue, NUMTRANSMAPS), 0); // remove thinker if (po->thinker == &th->thinker) @@ -2526,8 +2526,8 @@ void T_PolyObjFade(polyfade_t *th) { INT16 delta = abs(th->destvalue - th->sourcevalue); INT32 duration = th->ticbased ? th->duration - : abs(FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->destvalue) - - FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->sourcevalue)); // speed-based internal counter duration: delta in 256 scale + : abs(FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->destvalue) + - FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->sourcevalue)); // speed-based internal counter duration: delta in 256 scale fixed_t factor = min(FixedDiv(duration - th->timer, duration), 1*FRACUNIT); if (th->destvalue < th->sourcevalue) po->translucency = max(min(po->translucency, th->sourcevalue - (INT16)FixedMul(delta, factor)), th->destvalue); @@ -2538,7 +2538,7 @@ void T_PolyObjFade(polyfade_t *th) if (!stillfading) { // set render flags - if (po->translucency >= NUMTRANSLUCENTTRANSMAPS) // invisible + if (po->translucency >= NUMTRANSMAPS) // invisible po->flags &= ~POF_RENDERALL; else po->flags |= (po->spawnflags & POF_RENDERALL); @@ -2561,8 +2561,8 @@ void T_PolyObjFade(polyfade_t *th) } else { - if (po->translucency >= NUMTRANSLUCENTTRANSMAPS) - // HACK: OpenGL renders add/sub.opaque when >= NUMTRANSLUCENTTRANSMAPS + if (po->translucency >= NUMTRANSMAPS) + // HACK: OpenGL renders fully opaque when >= NUMTRANSMAPS po->translucency = tr_trans90; po->flags |= (po->spawnflags & POF_RENDERALL); @@ -2630,8 +2630,8 @@ boolean EV_DoPolyObjFade(polyfadedata_t *pfdata) else { th->ticbased = false; - th->timer = abs(FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->destvalue) - - FixedMul(FixedDiv(256, NUMTRANSLUCENTTRANSMAPS), NUMTRANSLUCENTTRANSMAPS - th->sourcevalue)); // delta converted to 256 scale, use as internal counter + th->timer = abs(FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->destvalue) + - FixedMul(FixedDiv(256, NUMTRANSMAPS), NUMTRANSMAPS - th->sourcevalue)); // delta converted to 256 scale, use as internal counter th->duration = abs(pfdata->speed); // use th->duration as speed decrement } diff --git a/src/p_pspr.h b/src/p_pspr.h index ee82ade6a..cbc1a845f 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -101,8 +101,7 @@ typedef enum tr_trans70, tr_trans80, tr_trans90, - NUMTRANSLUCENTTRANSMAPS, - tr_transadd = NUMTRANSLUCENTTRANSMAPS, + tr_transadd, tr_transsub, NUMTRANSMAPS } transnum_t; diff --git a/src/p_setup.c b/src/p_setup.c index df4fec9c8..50f39c5fa 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3381,7 +3381,7 @@ static void P_InitLevelSettings(void) // song credit init memset(&cursongcredit,0,sizeof(struct cursongcredit)); - cursongcredit.trans = NUMTRANSLUCENTTRANSMAPS; + cursongcredit.trans = NUMTRANSMAPS; for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/p_spec.c b/src/p_spec.c index 2435e964d..34a962975 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1257,7 +1257,7 @@ static boolean PolyFade(line_t *line) else pfd.destvalue = value; - pfd.destvalue = max(min(pfd.destvalue, NUMTRANSLUCENTTRANSMAPS), 0); + pfd.destvalue = max(min(pfd.destvalue, NUMTRANSMAPS), 0); // already equal, nothing to do if (po->translucency == pfd.destvalue) diff --git a/src/s_sound.c b/src/s_sound.c index 302a352a7..197e65e57 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1800,7 +1800,7 @@ void S_ShowMusicCredit(void) cursongcredit.def = def; cursongcredit.anim = 5*TICRATE; cursongcredit.x = 0; - cursongcredit.trans = NUMTRANSLUCENTTRANSMAPS; + cursongcredit.trans = NUMTRANSMAPS; return; } else From 11386e12bade4630e6ee267c43afb38dd0935b14 Mon Sep 17 00:00:00 2001 From: Sryder Date: Mon, 26 Oct 2020 11:18:53 +0000 Subject: [PATCH 10/11] Keep NUMTRANSMAPS what it was, instead add NUMEFFECTMAPS to end of enum Should have easier merging and be less likely to break current effects. --- src/dehacked.c | 3 ++- src/hardware/hw_main.c | 6 +++--- src/p_polyobj.c | 2 +- src/p_pspr.h | 5 +++-- src/p_spec.c | 2 +- src/r_plane.c | 2 +- src/r_segs.c | 10 +++++----- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 9bd84fdbc..88af5757b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11148,9 +11148,10 @@ struct { {"tr_trans70",tr_trans70}, {"tr_trans80",tr_trans80}, {"tr_trans90",tr_trans90}, + {"NUMTRANSMAPS",NUMTRANSMAPS}, {"tr_transadd",tr_transadd}, {"tr_transsub",tr_transsub}, - {"NUMTRANSMAPS",NUMTRANSMAPS}, + {"NUMEFFECTMAPS",NUMEFFECTMAPS}, // Type of levels {"TOL_RACE",TOL_RACE}, diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 24f7a124d..68077ce95 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1488,7 +1488,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom default: { transnum_t transtable = R_GetLinedefTransTable(gl_linedef); - if (transtable != NUMTRANSMAPS) + if (transtable != NUMEFFECTMAPS) blendmode = HWR_TranstableToAlpha(transtable, &Surf); else blendmode = PF_Masked; @@ -1498,7 +1498,7 @@ static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom if (gl_curline->polyseg && gl_curline->polyseg->translucency > 0) { - if (gl_curline->polyseg->translucency >= NUMTRANSMAPS) // wall not drawn + if (gl_curline->polyseg->translucency >= NUMEFFECTMAPS) // wall not drawn { Surf.PolyColor.s.alpha = 0x00; // This shouldn't draw anything regardless of blendmode blendmode = PF_Masked; @@ -2902,7 +2902,7 @@ static void HWR_AddPolyObjectPlanes(void) if (!(po_ptrs[i]->flags & POF_RENDERPLANES)) // Only render planes when you should continue; - if (po_ptrs[i]->translucency >= NUMTRANSMAPS) + if (po_ptrs[i]->translucency >= NUMEFFECTMAPS) continue; if (polyobjsector->floorheight <= gl_frontsector->ceilingheight diff --git a/src/p_polyobj.c b/src/p_polyobj.c index eff28e21d..6733fca79 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -212,7 +212,7 @@ static void Polyobj_GetInfo(polyobj_t *po, line_t *line) if (po->parent == po->id) // do not allow a self-reference po->parent = -1; - po->translucency = max(min(line->args[2], NUMTRANSMAPS), 0); + po->translucency = max(min(line->args[2], NUMEFFECTMAPS), 0); po->flags = POF_SOLID|POF_TESTHEIGHT|POF_RENDERSIDES|POF_RENDERPLANES; diff --git a/src/p_pspr.h b/src/p_pspr.h index cbc1a845f..aa49f0306 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -101,9 +101,10 @@ typedef enum tr_trans70, tr_trans80, tr_trans90, - tr_transadd, + NUMTRANSMAPS, + tr_transadd = NUMTRANSMAPS, tr_transsub, - NUMTRANSMAPS + NUMEFFECTMAPS, } transnum_t; #endif diff --git a/src/p_spec.c b/src/p_spec.c index 34a962975..a86c54c07 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1213,7 +1213,7 @@ static void PolyTranslucency(line_t *line) else po->translucency = value; - po->translucency = max(min(po->translucency, NUMTRANSMAPS), 0); + po->translucency = max(min(po->translucency, NUMEFFECTMAPS), 0); } // Makes a polyobject translucency fade and applies tangibility diff --git a/src/r_plane.c b/src/r_plane.c index 723a388d6..7770d2d12 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -780,7 +780,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->polyobj) { // Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red) - if (pl->polyobj->translucency >= NUMTRANSMAPS) + if (pl->polyobj->translucency >= NUMEFFECTMAPS) return; // Don't even draw it else if (pl->polyobj->translucency > 0) { diff --git a/src/r_segs.c b/src/r_segs.c index 9998c51ca..8dcb61992 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -281,7 +281,7 @@ static void R_Render2sidedMultiPatchColumn(column_t *column) transnum_t R_GetLinedefTransTable(line_t *ldef) { - transnum_t transnum = NUMTRANSMAPS; // Send back NUMTRANSMAPS for none + transnum_t transnum = NUMEFFECTMAPS; // Send back NUMEFFECTMAPS for none fixed_t alpha = ldef->alpha; if (alpha > 0 && alpha < FRACUNIT) transnum = (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); @@ -291,7 +291,7 @@ transnum_t R_GetLinedefTransTable(line_t *ldef) { case 910: transnum = tr_transadd; break; case 911: transnum = tr_transsub; break; - default: transnum = NUMTRANSMAPS; break; + default: transnum = NUMEFFECTMAPS; break; } } @@ -312,7 +312,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) INT32 times, repeats; INT64 overflow_test; INT32 range; - transnum_t transtable = NUMTRANSMAPS; + transnum_t transtable = NUMEFFECTMAPS; // Calculate light table. // Use different light tables @@ -330,7 +330,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) return; transtable = R_GetLinedefTransTable(ldef); - if (transtable != NUMTRANSMAPS) + if (transtable != NUMEFFECTMAPS) { dc_transmap = transtables + ((transtable - 1) << FF_TRANSSHIFT); colfunc = colfuncs[COLDRAWFUNC_FUZZY]; @@ -347,7 +347,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if (curline->polyseg && curline->polyseg->translucency > 0) { - if (curline->polyseg->translucency >= NUMTRANSMAPS) + if (curline->polyseg->translucency >= NUMEFFECTMAPS) return; dc_transmap = transtables + ((curline->polyseg->translucency-1)< Date: Mon, 26 Oct 2020 11:22:27 +0000 Subject: [PATCH 11/11] Add missing MFD_TRANSSUB to dehacked --- src/dehacked.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dehacked.c b/src/dehacked.c index 88af5757b..a467543e9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -11661,6 +11661,7 @@ struct { {"MFD_TRANS80",MFD_TRANS80}, {"MFD_TRANS90",MFD_TRANS90}, {"MFD_TRANSADD",MFD_TRANSADD}, + {"MFD_TRANSSUB",MFD_TRANSSUB}, {"MFD_TRANSMASK",MFD_TRANSMASK}, {"MFD_FULLBRIGHT",MFD_FULLBRIGHT}, {"MFD_SEMIBRIGHT",MFD_SEMIBRIGHT},