From 9a262a308cfe003e918af7bdcf4023c1d6feb44b Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 27 Jul 2023 17:47:59 -0700 Subject: [PATCH 1/3] Add missing flags to MSF_LIST --- src/deh_tables.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index 8e15ef2f1..29724923f 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5997,9 +5997,13 @@ const char *const MSF_LIST[] = { "TRIGGERSPECIAL_HEADBUMP", "TRIGGERLINE_PLANE", "TRIGGERLINE_MOBJ", + "INVERTPRECIP", "GRAVITYFLIP", "HEATWAVE", "NOCLIPCAMERA", + "RIPPLE_FLOOR", + "RIPPLE_CEILING", + "INVERTENCORE", NULL }; From 49e735770481276bb8d7844f31211430ba9cc236 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 27 Jul 2023 17:49:26 -0700 Subject: [PATCH 2/3] Add MSF_FLATLIGHTING --- src/deh_tables.c | 1 + src/p_setup.c | 2 ++ src/r_defs.h | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index 29724923f..353bae7ab 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -6004,6 +6004,7 @@ const char *const MSF_LIST[] = { "RIPPLE_FLOOR", "RIPPLE_CEILING", "INVERTENCORE", + "FLATLIGHTING", NULL }; diff --git a/src/p_setup.c b/src/p_setup.c index ea2fb595d..3a98716dc 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1705,6 +1705,8 @@ static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char sectors[i].flags |= MSF_RIPPLE_CEILING; else if (fastcmp(param, "invertencore") && fastcmp("true", val)) sectors[i].flags |= MSF_INVERTENCORE; + else if (fastcmp(param, "flatlighting") && fastcmp("true", val)) + sectors[i].flags |= MSF_FLATLIGHTING; else if (fastcmp(param, "nostepup") && fastcmp("true", val)) sectors[i].specialflags |= SSF_NOSTEPUP; else if (fastcmp(param, "doublestepup") && fastcmp("true", val)) diff --git a/src/r_defs.h b/src/r_defs.h index 634928a59..a33162ac6 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -350,6 +350,8 @@ typedef enum MSF_RIPPLE_CEILING = 1<<11, // invert encore color remap status MSF_INVERTENCORE = 1<<12, + // turn off directional lighting + MSF_FLATLIGHTING = 1<<13, } sectorflags_t; typedef enum From 46406931c1cda4e237823f6a2463e2ff045d4ad3 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 27 Jul 2023 17:49:45 -0700 Subject: [PATCH 3/3] Toggle all manner of directional lighting with MSF_FLATLIGHTING --- src/hardware/hw_main.c | 8 ++++---- src/p_setup.c | 14 ++++++++++++-- src/p_setup.h | 4 ++-- src/r_bsp.cpp | 12 ++++++------ src/r_plane.c | 4 ++-- src/r_plane.h | 2 +- src/r_segs.cpp | 12 ++++++------ src/r_things.c | 2 +- 8 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index f40f21818..3d55c8ecf 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -295,7 +295,7 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg) { INT16 finallight = lightnum; - if (seg != NULL && P_ApplyLightOffsetFine(lightnum)) + if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector->flags)) { finallight += seg->hwLightOffset; @@ -306,11 +306,11 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg) return (FUINT)finallight; } -static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope) +static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, sectorflags_t sectorflags) { INT16 finallight = lightnum; - if (slope != NULL && P_ApplyLightOffsetFine(lightnum)) + if (slope != NULL && P_ApplyLightOffsetFine(lightnum, sectorflags)) { finallight += slope->hwLightOffset; @@ -504,7 +504,7 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool for (i = 0, v3d = planeVerts; i < nrPlaneVerts; i++,v3d++,pv++) SETUP3DVERT(v3d, pv->x, pv->y); - lightlevel = HWR_CalcSlopeLight(lightlevel, slope); + lightlevel = HWR_CalcSlopeLight(lightlevel, slope, (FOFsector ? FOFsector : gl_frontsector)->flags); HWR_Lighting(&Surf, lightlevel, planecolormap); if (PolyFlags & PF_EnvironmentTrans) diff --git a/src/p_setup.c b/src/p_setup.c index 3a98716dc..75ac73f4c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3482,15 +3482,25 @@ void P_UpdateSegLightOffset(seg_t *li) #endif } -boolean P_ApplyLightOffset(UINT8 baselightnum) +boolean P_ApplyLightOffset(UINT8 baselightnum, sectorflags_t sectorflags) { + if (sectorflags & MSF_FLATLIGHTING) + { + return false; + } + // Don't apply light offsets at full bright or full dark. // Is in steps of light num . return (baselightnum < LIGHTLEVELS-1 && baselightnum > 0); } -boolean P_ApplyLightOffsetFine(UINT8 baselightlevel) +boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, sectorflags_t sectorflags) { + if (sectorflags & MSF_FLATLIGHTING) + { + return false; + } + // Don't apply light offsets at full bright or full dark. // Uses exact light levels for more smoothness. return (baselightlevel < 255 && baselightlevel > 0); diff --git a/src/p_setup.h b/src/p_setup.h index e626363f4..8a77fc8dd 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -140,8 +140,8 @@ void P_LoadSoundsRange(UINT16 wadnum, UINT16 first, UINT16 num); void P_LoadMusicsRange(UINT16 wadnum, UINT16 first, UINT16 num); //void P_WriteThings(void); void P_UpdateSegLightOffset(seg_t *li); -boolean P_ApplyLightOffset(UINT8 baselightnum); -boolean P_ApplyLightOffsetFine(UINT8 baselightlevel); +boolean P_ApplyLightOffset(UINT8 baselightnum, sectorflags_t sectorflags); +boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, sectorflags_t sectorflags); size_t P_PrecacheLevelFlats(void); void P_AllocMapHeader(INT16 i); diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index 74b78397d..228c57a86 100644 --- a/src/r_bsp.cpp +++ b/src/r_bsp.cpp @@ -977,7 +977,7 @@ static void R_Subsector(size_t num) floorcolormap, NULL, NULL, frontsector->f_slope, R_NoEncore(frontsector, &levelflats[frontsector->floorpic], false), R_IsRipplePlane(frontsector, NULL, false), - false + false, frontsector->flags ); } else @@ -993,7 +993,7 @@ static void R_Subsector(size_t num) ceilingcolormap, NULL, NULL, frontsector->c_slope, R_NoEncore(frontsector, &levelflats[frontsector->ceilingpic], true), R_IsRipplePlane(frontsector, NULL, true), - true + true, frontsector->flags ); } else @@ -1041,7 +1041,7 @@ static void R_Subsector(size_t num) *rover->bottomyoffs, *rover->bottomangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, R_NoEncore(rover->master->frontsector, &levelflats[*rover->bottompic], true), R_IsRipplePlane(rover->master->frontsector, rover, true), - true + true, rover->master->frontsector->flags ); ffloor[numffloors].slope = *rover->b_slope; @@ -1075,7 +1075,7 @@ static void R_Subsector(size_t num) *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, R_NoEncore(rover->master->frontsector, &levelflats[*rover->toppic], false), R_IsRipplePlane(rover->master->frontsector, rover, false), - false + false, rover->master->frontsector->flags ); ffloor[numffloors].slope = *rover->t_slope; @@ -1125,7 +1125,7 @@ static void R_Subsector(size_t num) NULL, // will ffloors be slopable eventually? R_NoEncore(polysec, &levelflats[polysec->floorpic], false), false, /* TODO: wet polyobjects? */ - true + true, polysec->flags ); ffloor[numffloors].height = polysec->floorheight; @@ -1154,7 +1154,7 @@ static void R_Subsector(size_t num) NULL, // will ffloors be slopable eventually? R_NoEncore(polysec, &levelflats[polysec->ceilingpic], true), false, /* TODO: wet polyobjects? */ - false + false, polysec->flags ); ffloor[numffloors].polyobj = po; diff --git a/src/r_plane.c b/src/r_plane.c index 57de53ea9..0c95023a9 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -355,7 +355,7 @@ static visplane_t *new_visplane(unsigned hash) visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap, ffloor_t *pfloor, polyobj_t *polyobj, pslope_t *slope, boolean noencore, - boolean ripple, boolean reverseLight) + boolean ripple, boolean reverseLight, sectorflags_t sectorflags) { visplane_t *check; unsigned hash; @@ -392,7 +392,7 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, } } - if (slope != NULL && P_ApplyLightOffset(lightlevel >> LIGHTSEGSHIFT)) + if (slope != NULL && P_ApplyLightOffset(lightlevel >> LIGHTSEGSHIFT, sectorflags)) { if (reverseLight && maplighting.directional == true) { diff --git a/src/r_plane.h b/src/r_plane.h index e238878f5..06db26ebf 100644 --- a/src/r_plane.h +++ b/src/r_plane.h @@ -88,7 +88,7 @@ void R_ClearFFloorClips (void); void R_DrawPlanes(void); visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap, ffloor_t *ffloor, polyobj_t *polyobj, pslope_t *slope, boolean noencore, - boolean ripple, boolean reverseLight); + boolean ripple, boolean reverseLight, sectorflags_t sectorflags); visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop); void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop); void R_PlaneBounds(visplane_t *plane); diff --git a/src/r_segs.cpp b/src/r_segs.cpp index bb63cd1ad..21b8676c9 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -222,7 +222,7 @@ static void R_RenderMaskedSegLoop(drawseg_t *ds, INT32 x1, INT32 x2, INT32 texnu if (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG)) ; - else if (P_ApplyLightOffset(lightnum)) + else if (P_ApplyLightOffset(lightnum, frontsector->flags)) lightnum += curline->lightOffset; rlight->lightnum = lightnum; @@ -245,7 +245,7 @@ static void R_RenderMaskedSegLoop(drawseg_t *ds, INT32 x1, INT32 x2, INT32 texnu if ((R_CheckColumnFunc(COLDRAWFUNC_FOG) == true) || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))) ; - else if (P_ApplyLightOffset(lightnum)) + else if (P_ApplyLightOffset(lightnum, frontsector->flags)) lightnum += curline->lightOffset; lightnum = R_AdjustLightLevel(lightnum); @@ -882,7 +882,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) if (pfloor->fofflags & FOF_FOG || rlight->flags & FOF_FOG || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG))) ; - else if (P_ApplyLightOffset(rlight->lightnum)) + else if (P_ApplyLightOffset(rlight->lightnum, pfloor->master->frontsector->flags)) rlight->lightnum += curline->lightOffset; p++; @@ -905,7 +905,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) if (pfloor->fofflags & FOF_FOG || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))) ; - else if (P_ApplyLightOffset(lightnum)) + else if (P_ApplyLightOffset(lightnum, pfloor->master->frontsector->flags)) lightnum += curline->lightOffset; lightnum = R_AdjustLightLevel(lightnum); @@ -1511,7 +1511,7 @@ static void R_RenderSegLoop (void) if (dc_lightlist[i].extra_colormap) ; - else if (P_ApplyLightOffset(lightnum)) + else if (P_ApplyLightOffset(lightnum, curline->frontsector->flags)) lightnum += curline->lightOffset; lightnum = R_AdjustLightLevel(lightnum); @@ -2504,7 +2504,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) // OPTIMIZE: get rid of LIGHTSEGSHIFT globally lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); - if (P_ApplyLightOffset(lightnum)) + if (P_ApplyLightOffset(lightnum, frontsector->flags)) lightnum += curline->lightOffset; lightnum = R_AdjustLightLevel(lightnum); diff --git a/src/r_things.c b/src/r_things.c index d10c402a3..54fb49d62 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2295,7 +2295,7 @@ static void R_ProjectSprite(mobj_t *thing) lightnum = (lightnum + R_ThingLightLevel(oldthing)) >> LIGHTSEGSHIFT; - if (maplighting.directional == true) + if (maplighting.directional == true && !(thing->subsector->sector->flags & MSF_FLATLIGHTING)) { fixed_t extralight = R_GetSpriteDirectionalLighting(papersprite ? interp.angle + (ang >= ANGLE_180 ? -ANGLE_90 : ANGLE_90)