From b193e582ce3c3f92b01e364447ca8042b8c0152c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 3 May 2021 13:58:46 +0200 Subject: [PATCH] - restricted the portal rendering shortcut only to real skies in the primary layer. This won't work properly with sector portals that contain other portals because those setups require a proper stencil to work as expected. --- src/rendering/hwrenderer/scene/hw_portal.cpp | 41 +++----------------- src/rendering/hwrenderer/scene/hw_portal.h | 2 +- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp index a8565b2e17..e44f12cae4 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.cpp +++ b/src/rendering/hwrenderer/scene/hw_portal.cpp @@ -127,42 +127,13 @@ bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di HWPortal * best = nullptr; unsigned bestindex = 0; - // Find the one with the highest amount of lines. - // Normally this is also the one that saves the largest amount - // of time by drawing it before the scene itself. - auto &portals = outer_di->Portals; - for (int i = portals.Size() - 1; i >= 0; --i) - { - p = portals[i]; - if (p->lines.Size() > 0 && p->IsSky()) - { - // Cannot clear the depth buffer inside a portal recursion - if (recursion && p->NeedDepthBuffer()) continue; + if (recursion > 0 || outer_di->Portals.Size() != 1 || !outer_di->Portals[0]->IsSky()) return false; - if (!best || p->lines.Size() > best->lines.Size()) - { - best = p; - bestindex = i; - } - - // If the portal area contains the current camera viewpoint, let's always use it because it's likely to give the largest area. - if (p->boundingBox.contains(outer_di->Viewpoint.Pos)) - { - best = p; - bestindex = i; - break; - } - } - } - - if (best) - { - portals.Delete(bestindex); - RenderPortal(best, state, false, outer_di); - delete best; - return true; - } - return false; + best = outer_di->Portals[0]; + outer_di->Portals.Clear(); + RenderPortal(best, state, false, outer_di); + delete best; + return true; } diff --git a/src/rendering/hwrenderer/scene/hw_portal.h b/src/rendering/hwrenderer/scene/hw_portal.h index a08ddceb35..a43eb76e89 100644 --- a/src/rendering/hwrenderer/scene/hw_portal.h +++ b/src/rendering/hwrenderer/scene/hw_portal.h @@ -279,7 +279,7 @@ protected: bool Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clipper) override; void Shutdown(HWDrawInfo *di, FRenderState &rstate) override; virtual void * GetSource() const { return origin; } - virtual bool IsSky() { return true; } // although this isn't a real sky it can be handled as one. + virtual bool IsSky() { return false; } virtual const char *GetName(); FSectorPortalGroup *origin;