diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 3d55c8ecf..976d210c2 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, seg->frontsector->flags)) + if (seg != NULL && P_ApplyLightOffsetFine(lightnum, seg->frontsector)) { 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, sectorflags_t sectorflags) +static FUINT HWR_CalcSlopeLight(FUINT lightnum, pslope_t *slope, const sector_t *sector) { INT16 finallight = lightnum; - if (slope != NULL && P_ApplyLightOffsetFine(lightnum, sectorflags)) + if (slope != NULL && P_ApplyLightOffsetFine(lightnum, sector)) { 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, (FOFsector ? FOFsector : gl_frontsector)->flags); + lightlevel = HWR_CalcSlopeLight(lightlevel, slope, gl_frontsector); HWR_Lighting(&Surf, lightlevel, planecolormap); if (PolyFlags & PF_EnvironmentTrans) diff --git a/src/p_setup.c b/src/p_setup.c index ac1edeca0..8f7111e0c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3483,9 +3483,28 @@ void P_UpdateSegLightOffset(seg_t *li) #endif } -boolean P_ApplyLightOffset(UINT8 baselightnum, sectorflags_t sectorflags) +boolean P_SectorUsesDirectionalLighting(const sector_t *sector) { - if (sectorflags & MSF_FLATLIGHTING) + // explicitly turned off + if (sector->flags & MSF_FLATLIGHTING) + { + return false; + } + + // automatically turned on + if (sector->ceilingpic == skyflatnum) + { + // sky is visible + return true; + } + + // default is off, for indoors + return false; +} + +boolean P_ApplyLightOffset(UINT8 baselightnum, const sector_t *sector) +{ + if (!P_SectorUsesDirectionalLighting(sector)) { return false; } @@ -3495,9 +3514,9 @@ boolean P_ApplyLightOffset(UINT8 baselightnum, sectorflags_t sectorflags) return (baselightnum < LIGHTLEVELS-1 && baselightnum > 0); } -boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, sectorflags_t sectorflags) +boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, const sector_t *sector) { - if (sectorflags & MSF_FLATLIGHTING) + if (!P_SectorUsesDirectionalLighting(sector)) { return false; } diff --git a/src/p_setup.h b/src/p_setup.h index 89ab09673..1d474dd10 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -142,8 +142,9 @@ 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, sectorflags_t sectorflags); -boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, sectorflags_t sectorflags); +boolean P_ApplyLightOffset(UINT8 baselightnum, const sector_t *sector); +boolean P_ApplyLightOffsetFine(UINT8 baselightlevel, const sector_t *sector); +boolean P_SectorUsesDirectionalLighting(const sector_t *sector); size_t P_PrecacheLevelFlats(void); void P_AllocMapHeader(INT16 i); diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index 228c57a86..794cb5f71 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, frontsector->flags + false, frontsector ); } 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, frontsector->flags + true, frontsector ); } 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, rover->master->frontsector->flags + true, frontsector ); 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, rover->master->frontsector->flags + false, frontsector ); 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, polysec->flags + true, frontsector ); 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, polysec->flags + false, frontsector ); ffloor[numffloors].polyobj = po; diff --git a/src/r_plane.c b/src/r_plane.c index 0c95023a9..a66f6bad2 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, sectorflags_t sectorflags) + boolean ripple, boolean reverseLight, const sector_t *lighting_sector) { 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, sectorflags)) + if (slope != NULL && P_ApplyLightOffset(lightlevel >> LIGHTSEGSHIFT, lighting_sector)) { if (reverseLight && maplighting.directional == true) { diff --git a/src/r_plane.h b/src/r_plane.h index 06db26ebf..2a77dcfea 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, sectorflags_t sectorflags); + boolean ripple, boolean reverseLight, const sector_t *lighting_sector); 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 1ee9e47f5..b94f1ff08 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, frontsector->flags)) + else if (P_ApplyLightOffset(lightnum, frontsector)) 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, frontsector->flags)) + else if (P_ApplyLightOffset(lightnum, frontsector)) 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, pfloor->master->frontsector->flags)) + else if (P_ApplyLightOffset(rlight->lightnum, frontsector)) 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, pfloor->master->frontsector->flags)) + else if (P_ApplyLightOffset(lightnum, frontsector)) 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, curline->frontsector->flags)) + else if (P_ApplyLightOffset(lightnum, curline->frontsector)) 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, frontsector->flags)) + if (P_ApplyLightOffset(lightnum, frontsector)) lightnum += curline->lightOffset; lightnum = R_AdjustLightLevel(lightnum); diff --git a/src/r_things.c b/src/r_things.c index 54fb49d62..6a7496495 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 && !(thing->subsector->sector->flags & MSF_FLATLIGHTING)) + if (maplighting.directional == true && P_SectorUsesDirectionalLighting(thing->subsector->sector)) { fixed_t extralight = R_GetSpriteDirectionalLighting(papersprite ? interp.angle + (ang >= ANGLE_180 ? -ANGLE_90 : ANGLE_90)