diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 60269bf1b1..e01e9f34a9 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -51,7 +51,7 @@ EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor); namespace swrenderer { - void SWRenderLine::Render(seg_t *line, subsector_t *subsector, sector_t *sector, sector_t *fakebacksector) + void SWRenderLine::Render(seg_t *line, subsector_t *subsector, sector_t *sector, sector_t *fakebacksector, visplane_t *linefloorplane, visplane_t *lineceilingplane) { static sector_t tempsec; // killough 3/8/98: ceiling/water hack bool solid; @@ -60,6 +60,8 @@ namespace swrenderer InSubsector = subsector; frontsector = sector; backsector = fakebacksector; + floorplane = linefloorplane; + ceilingplane = lineceilingplane; curline = line; diff --git a/src/swrenderer/line/r_line.h b/src/swrenderer/line/r_line.h index 7c677e072d..18d46e8b4e 100644 --- a/src/swrenderer/line/r_line.h +++ b/src/swrenderer/line/r_line.h @@ -15,6 +15,8 @@ namespace swrenderer { + struct visplane_t; + struct FWallCoords { FVector2 tleft; // coords at left of wall in view space rx1,ry1 @@ -38,7 +40,7 @@ namespace swrenderer class SWRenderLine { public: - void Render(seg_t *line, subsector_t *subsector, sector_t *sector, sector_t *fakebacksector); + void Render(seg_t *line, subsector_t *subsector, sector_t *sector, sector_t *fakebacksector, visplane_t *floorplane, visplane_t *ceilingplane); private: bool RenderWallSegment(int x1, int x2); @@ -51,6 +53,8 @@ namespace swrenderer subsector_t *InSubsector; sector_t *frontsector; sector_t *backsector; + visplane_t *floorplane; + visplane_t *ceilingplane; seg_t *curline; side_t *sidedef; diff --git a/src/swrenderer/scene/r_bsp.cpp b/src/swrenderer/scene/r_bsp.cpp index dc7747ec35..0440b41bb9 100644 --- a/src/swrenderer/scene/r_bsp.cpp +++ b/src/swrenderer/scene/r_bsp.cpp @@ -63,17 +63,13 @@ namespace swrenderer { subsector_t *InSubsector; sector_t *frontsector; + uint8_t FakeSide; SWRenderLine render_line; } bool r_fakingunderwater; -static BYTE FakeSide; - -visplane_t *floorplane; -visplane_t *ceilingplane; - // Clip values are the solid pixel bounding the range. // floorclip starts out SCREENHEIGHT and is just outside the range // ceilingclip starts out 0 and is just inside the range @@ -415,7 +411,7 @@ static void R_AddPolyobjs(subsector_t *sub) } // kg3D - add fake segs, never rendered -void R_FakeDrawLoop(subsector_t *sub) +void R_FakeDrawLoop(subsector_t *sub, visplane_t *floorplane, visplane_t *ceilingplane) { int count; seg_t* line; @@ -427,7 +423,7 @@ void R_FakeDrawLoop(subsector_t *sub) { if ((line->sidedef) && !(line->sidedef->Flags & WALLF_POLYOBJ)) { - render_line.Render(line, InSubsector, frontsector, nullptr); + render_line.Render(line, InSubsector, frontsector, nullptr, floorplane, ceilingplane); } line++; } @@ -517,7 +513,7 @@ void R_Subsector (subsector_t *sub) portal = frontsector->ValidatePortal(sector_t::ceiling); - ceilingplane = frontsector->ceilingplane.PointOnSide(ViewPos) > 0 || + visplane_t *ceilingplane = frontsector->ceilingplane.PointOnSide(ViewPos) > 0 || frontsector->GetTexture(sector_t::ceiling) == skyflatnum || portal != NULL || (frontsector->heightsec && @@ -557,7 +553,7 @@ void R_Subsector (subsector_t *sub) // killough 10/98: add support for skies transferred from sidedefs portal = frontsector->ValidatePortal(sector_t::floor); - floorplane = frontsector->floorplane.PointOnSide(ViewPos) > 0 || // killough 3/7/98 + visplane_t *floorplane = frontsector->floorplane.PointOnSide(ViewPos) > 0 || // killough 3/7/98 frontsector->GetTexture(sector_t::floor) == skyflatnum || portal != NULL || (frontsector->heightsec && @@ -636,7 +632,7 @@ void R_Subsector (subsector_t *sub) if (floorplane) R_AddPlaneLights(floorplane, frontsector->lighthead); - R_FakeDrawLoop(sub); + R_FakeDrawLoop(sub, floorplane, ceilingplane); fake3D = 0; frontsector = sub->sector; } @@ -700,7 +696,7 @@ void R_Subsector (subsector_t *sub) if (ceilingplane) R_AddPlaneLights(ceilingplane, frontsector->lighthead); - R_FakeDrawLoop(sub); + R_FakeDrawLoop(sub, floorplane, ceilingplane); fake3D = 0; frontsector = sub->sector; } @@ -719,8 +715,7 @@ void R_Subsector (subsector_t *sub) // lightlevels on floor & ceiling lightlevels in the surrounding area. // [RH] Handle sprite lighting like Duke 3D: If the ceiling is a sky, sprites are lit by // it, otherwise they are lit by the floor. - R_AddSprites (sub->sector, frontsector->GetTexture(sector_t::ceiling) == skyflatnum ? - ceilinglightlevel : floorlightlevel, FakeSide); + R_AddSprites (sub->sector, frontsector->GetTexture(sector_t::ceiling) == skyflatnum ? ceilinglightlevel : floorlightlevel, FakeSide); // [RH] Add particles if ((unsigned int)(sub - subsectors) < (unsigned int)numsubsectors) @@ -761,14 +756,14 @@ void R_Subsector (subsector_t *sub) fakeFloor->validcount = validcount; R_3D_NewClip(); } - render_line.Render(line, InSubsector, frontsector, &tempsec); // fake + render_line.Render(line, InSubsector, frontsector, &tempsec, floorplane, ceilingplane); // fake } fakeFloor = NULL; fake3D = 0; floorplane = backupfp; ceilingplane = backupcp; } - render_line.Render(line, InSubsector, frontsector, nullptr); // now real + render_line.Render(line, InSubsector, frontsector, nullptr, floorplane, ceilingplane); // now real } line++; } diff --git a/src/swrenderer/scene/r_bsp.h b/src/swrenderer/scene/r_bsp.h index e39b760955..ddd1f8bad4 100644 --- a/src/swrenderer/scene/r_bsp.h +++ b/src/swrenderer/scene/r_bsp.h @@ -52,8 +52,6 @@ void R_RenderBSPNode (void *node); // killough 4/13/98: fake floors/ceilings for deep water / fake ceilings: sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, int *floorlightlevel, int *ceilinglightlevel, seg_t *backline, int backx1, int backx2, double frontcz1, double frontcz2); -extern visplane_t *floorplane; -extern visplane_t *ceilingplane; extern short floorclip[MAXWIDTH]; extern short ceilingclip[MAXWIDTH];