From b193e582ce3c3f92b01e364447ca8042b8c0152c Mon Sep 17 00:00:00 2001
From: Christoph Oelckers <coelckers@users.noreply.github.com>
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 a8565b2e1..e44f12cae 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 a08ddceb3..a43eb76e8 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;