diff --git a/src/polyrenderer/scene/poly_cull.cpp b/src/polyrenderer/scene/poly_cull.cpp index d79ca0467f..77e1c068fc 100644 --- a/src/polyrenderer/scene/poly_cull.cpp +++ b/src/polyrenderer/scene/poly_cull.cpp @@ -28,7 +28,7 @@ #include "poly_cull.h" #include "polyrenderer/poly_renderer.h" -void PolyCull::CullScene(const PolyClipPlane &portalClipPlane) +void PolyCull::CullScene(const PolyClipPlane &portalClipPlane, sector_t *portalEnter) { ClearSolidSegments(); MarkViewFrustum(); @@ -49,6 +49,7 @@ void PolyCull::CullScene(const PolyClipPlane &portalClipPlane) PvsLineVisible.resize(level.segs.Size()); PortalClipPlane = portalClipPlane; + PortalEnter = portalEnter; // Cull front to back FirstSkyHeight = true; @@ -87,6 +88,14 @@ void PolyCull::CullNode(void *node) void PolyCull::CullSubsector(subsector_t *sub) { + // Ignore everything in front of the portal + if (PortalEnter) + { + if (sub->sector != PortalEnter) + return; + PortalEnter = nullptr; + } + // Check if subsector is clipped entirely by the portal clip plane bool visible = false; for (uint32_t i = 0; i < sub->numlines; i++) diff --git a/src/polyrenderer/scene/poly_cull.h b/src/polyrenderer/scene/poly_cull.h index 4b851373e6..62e533e2ff 100644 --- a/src/polyrenderer/scene/poly_cull.h +++ b/src/polyrenderer/scene/poly_cull.h @@ -29,7 +29,7 @@ class PolyCull { public: - void CullScene(const PolyClipPlane &portalClipPlane); + void CullScene(const PolyClipPlane &portalClipPlane, sector_t *portalEnter); bool IsLineSegVisible(uint32_t subsectorDepth, uint32_t lineIndex) { @@ -78,6 +78,7 @@ private: bool FirstSkyHeight = true; PolyClipPlane PortalClipPlane; + sector_t *PortalEnter = nullptr; std::vector PvsLineStart; std::vector PvsLineVisible; diff --git a/src/polyrenderer/scene/poly_portal.cpp b/src/polyrenderer/scene/poly_portal.cpp index afed60f0bf..20c6833bd7 100644 --- a/src/polyrenderer/scene/poly_portal.cpp +++ b/src/polyrenderer/scene/poly_portal.cpp @@ -50,6 +50,7 @@ void PolyDrawSectorPortal::Render(int portalDepth) PortalViewpoint.StencilValue = StencilValue; PortalViewpoint.PortalPlane = PolyClipPlane(0.0f, 0.0f, 0.0f, 1.0f); PortalViewpoint.PortalDepth = portalDepth; + PortalViewpoint.PortalEnterSector = Portal->mDestination; PolyRenderer::Instance()->Scene.Render(&PortalViewpoint); diff --git a/src/polyrenderer/scene/poly_scene.cpp b/src/polyrenderer/scene/poly_scene.cpp index 2f1b929062..63c2b5637a 100644 --- a/src/polyrenderer/scene/poly_scene.cpp +++ b/src/polyrenderer/scene/poly_scene.cpp @@ -59,7 +59,7 @@ void RenderPolyScene::Render(PolyPortalViewpoint *viewpoint) CurrentViewpoint->LinePortalsStart = thread->LinePortals.size(); PolyCullCycles.Clock(); - Cull.CullScene(CurrentViewpoint->PortalPlane); + Cull.CullScene(CurrentViewpoint->PortalPlane, CurrentViewpoint->PortalEnterSector); PolyCullCycles.Unclock(); RenderSectors(); diff --git a/src/polyrenderer/scene/poly_scene.h b/src/polyrenderer/scene/poly_scene.h index de9619beea..f0927db90a 100644 --- a/src/polyrenderer/scene/poly_scene.h +++ b/src/polyrenderer/scene/poly_scene.h @@ -66,6 +66,7 @@ public: bool Mirror = false; line_t *PortalEnterLine = nullptr; + sector_t *PortalEnterSector = nullptr; size_t ObjectsStart = 0; size_t ObjectsEnd = 0;