Toggle all manner of directional lighting with MSF_FLATLIGHTING

This commit is contained in:
James R 2023-07-27 17:49:45 -07:00
parent 49e7357704
commit 46406931c1
8 changed files with 34 additions and 24 deletions

View file

@ -295,7 +295,7 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg)
{ {
INT16 finallight = lightnum; INT16 finallight = lightnum;
if (seg != NULL && P_ApplyLightOffsetFine(lightnum)) if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector->flags))
{ {
finallight += seg->hwLightOffset; finallight += seg->hwLightOffset;
@ -306,11 +306,11 @@ static FUINT HWR_CalcWallLight(FUINT lightnum, seg_t *seg)
return (FUINT)finallight; 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; INT16 finallight = lightnum;
if (slope != NULL && P_ApplyLightOffsetFine(lightnum)) if (slope != NULL && P_ApplyLightOffsetFine(lightnum, sectorflags))
{ {
finallight += slope->hwLightOffset; 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++) for (i = 0, v3d = planeVerts; i < nrPlaneVerts; i++,v3d++,pv++)
SETUP3DVERT(v3d, pv->x, pv->y); 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); HWR_Lighting(&Surf, lightlevel, planecolormap);
if (PolyFlags & PF_EnvironmentTrans) if (PolyFlags & PF_EnvironmentTrans)

View file

@ -3482,15 +3482,25 @@ void P_UpdateSegLightOffset(seg_t *li)
#endif #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. // Don't apply light offsets at full bright or full dark.
// Is in steps of light num . // Is in steps of light num .
return (baselightnum < LIGHTLEVELS-1 && baselightnum > 0); 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. // Don't apply light offsets at full bright or full dark.
// Uses exact light levels for more smoothness. // Uses exact light levels for more smoothness.
return (baselightlevel < 255 && baselightlevel > 0); return (baselightlevel < 255 && baselightlevel > 0);

View file

@ -140,8 +140,8 @@ void P_LoadSoundsRange(UINT16 wadnum, UINT16 first, UINT16 num);
void P_LoadMusicsRange(UINT16 wadnum, UINT16 first, UINT16 num); void P_LoadMusicsRange(UINT16 wadnum, UINT16 first, UINT16 num);
//void P_WriteThings(void); //void P_WriteThings(void);
void P_UpdateSegLightOffset(seg_t *li); void P_UpdateSegLightOffset(seg_t *li);
boolean P_ApplyLightOffset(UINT8 baselightnum); boolean P_ApplyLightOffset(UINT8 baselightnum, sectorflags_t sectorflags);
boolean P_ApplyLightOffsetFine(UINT8 baselightlevel); boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, sectorflags_t sectorflags);
size_t P_PrecacheLevelFlats(void); size_t P_PrecacheLevelFlats(void);
void P_AllocMapHeader(INT16 i); void P_AllocMapHeader(INT16 i);

View file

@ -977,7 +977,7 @@ static void R_Subsector(size_t num)
floorcolormap, NULL, NULL, frontsector->f_slope, floorcolormap, NULL, NULL, frontsector->f_slope,
R_NoEncore(frontsector, &levelflats[frontsector->floorpic], false), R_NoEncore(frontsector, &levelflats[frontsector->floorpic], false),
R_IsRipplePlane(frontsector, NULL, false), R_IsRipplePlane(frontsector, NULL, false),
false false, frontsector->flags
); );
} }
else else
@ -993,7 +993,7 @@ static void R_Subsector(size_t num)
ceilingcolormap, NULL, NULL, frontsector->c_slope, ceilingcolormap, NULL, NULL, frontsector->c_slope,
R_NoEncore(frontsector, &levelflats[frontsector->ceilingpic], true), R_NoEncore(frontsector, &levelflats[frontsector->ceilingpic], true),
R_IsRipplePlane(frontsector, NULL, true), R_IsRipplePlane(frontsector, NULL, true),
true true, frontsector->flags
); );
} }
else 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, *rover->bottomyoffs, *rover->bottomangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope,
R_NoEncore(rover->master->frontsector, &levelflats[*rover->bottompic], true), R_NoEncore(rover->master->frontsector, &levelflats[*rover->bottompic], true),
R_IsRipplePlane(rover->master->frontsector, rover, true), R_IsRipplePlane(rover->master->frontsector, rover, true),
true true, rover->master->frontsector->flags
); );
ffloor[numffloors].slope = *rover->b_slope; 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, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope,
R_NoEncore(rover->master->frontsector, &levelflats[*rover->toppic], false), R_NoEncore(rover->master->frontsector, &levelflats[*rover->toppic], false),
R_IsRipplePlane(rover->master->frontsector, rover, false), R_IsRipplePlane(rover->master->frontsector, rover, false),
false false, rover->master->frontsector->flags
); );
ffloor[numffloors].slope = *rover->t_slope; ffloor[numffloors].slope = *rover->t_slope;
@ -1125,7 +1125,7 @@ static void R_Subsector(size_t num)
NULL, // will ffloors be slopable eventually? NULL, // will ffloors be slopable eventually?
R_NoEncore(polysec, &levelflats[polysec->floorpic], false), R_NoEncore(polysec, &levelflats[polysec->floorpic], false),
false, /* TODO: wet polyobjects? */ false, /* TODO: wet polyobjects? */
true true, polysec->flags
); );
ffloor[numffloors].height = polysec->floorheight; ffloor[numffloors].height = polysec->floorheight;
@ -1154,7 +1154,7 @@ static void R_Subsector(size_t num)
NULL, // will ffloors be slopable eventually? NULL, // will ffloors be slopable eventually?
R_NoEncore(polysec, &levelflats[polysec->ceilingpic], true), R_NoEncore(polysec, &levelflats[polysec->ceilingpic], true),
false, /* TODO: wet polyobjects? */ false, /* TODO: wet polyobjects? */
false false, polysec->flags
); );
ffloor[numffloors].polyobj = po; ffloor[numffloors].polyobj = po;

View file

@ -355,7 +355,7 @@ static visplane_t *new_visplane(unsigned hash)
visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel,
fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap, fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap,
ffloor_t *pfloor, polyobj_t *polyobj, pslope_t *slope, boolean noencore, 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; visplane_t *check;
unsigned hash; 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) if (reverseLight && maplighting.directional == true)
{ {

View file

@ -88,7 +88,7 @@ void R_ClearFFloorClips (void);
void R_DrawPlanes(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, 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, 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); visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop);
void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop); void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop);
void R_PlaneBounds(visplane_t *plane); void R_PlaneBounds(visplane_t *plane);

View file

@ -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)) 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; lightnum += curline->lightOffset;
rlight->lightnum = lightnum; 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) if ((R_CheckColumnFunc(COLDRAWFUNC_FOG) == true)
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))) || (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 += curline->lightOffset;
lightnum = R_AdjustLightLevel(lightnum); 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))) 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; rlight->lightnum += curline->lightOffset;
p++; 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))) 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 += curline->lightOffset;
lightnum = R_AdjustLightLevel(lightnum); lightnum = R_AdjustLightLevel(lightnum);
@ -1511,7 +1511,7 @@ static void R_RenderSegLoop (void)
if (dc_lightlist[i].extra_colormap) if (dc_lightlist[i].extra_colormap)
; ;
else if (P_ApplyLightOffset(lightnum)) else if (P_ApplyLightOffset(lightnum, curline->frontsector->flags))
lightnum += curline->lightOffset; lightnum += curline->lightOffset;
lightnum = R_AdjustLightLevel(lightnum); lightnum = R_AdjustLightLevel(lightnum);
@ -2504,7 +2504,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
// OPTIMIZE: get rid of LIGHTSEGSHIFT globally // OPTIMIZE: get rid of LIGHTSEGSHIFT globally
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
if (P_ApplyLightOffset(lightnum)) if (P_ApplyLightOffset(lightnum, frontsector->flags))
lightnum += curline->lightOffset; lightnum += curline->lightOffset;
lightnum = R_AdjustLightLevel(lightnum); lightnum = R_AdjustLightLevel(lightnum);

View file

@ -2295,7 +2295,7 @@ static void R_ProjectSprite(mobj_t *thing)
lightnum = (lightnum + R_ThingLightLevel(oldthing)) >> LIGHTSEGSHIFT; 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 fixed_t extralight = R_GetSpriteDirectionalLighting(papersprite
? interp.angle + (ang >= ANGLE_180 ? -ANGLE_90 : ANGLE_90) ? interp.angle + (ang >= ANGLE_180 ? -ANGLE_90 : ANGLE_90)