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)