Revert "- restricted the portal rendering shortcut only to real skies in the primary layer."

This reverts commit b193e582ce.

This made the one thing I hoped it would fix even worse so it's useless.
This commit is contained in:
Christoph Oelckers 2021-05-07 09:05:23 +02:00
parent bb58dedff2
commit c51af868de
2 changed files with 36 additions and 7 deletions

View file

@ -126,13 +126,42 @@ bool FPortalSceneState::RenderFirstSkyPortal(int recursion, HWDrawInfo *outer_di
HWPortal * best = nullptr; HWPortal * best = nullptr;
unsigned bestindex = 0; unsigned bestindex = 0;
if (recursion > 0 || outer_di->Portals.Size() != 1 || !outer_di->Portals[0]->IsSky()) return false; // 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)
{
auto p = portals[i];
if (p->lines.Size() > 0 && p->IsSky())
{
// Cannot clear the depth buffer inside a portal recursion
if (recursion && p->NeedDepthBuffer()) continue;
best = outer_di->Portals[0]; if (!best || p->lines.Size() > best->lines.Size())
outer_di->Portals.Clear(); {
RenderPortal(best, state, false, outer_di); best = p;
delete best; bestindex = i;
return true; }
// 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;
} }

View file

@ -279,7 +279,7 @@ protected:
bool Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clipper) override; bool Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *clipper) override;
void Shutdown(HWDrawInfo *di, FRenderState &rstate) override; void Shutdown(HWDrawInfo *di, FRenderState &rstate) override;
virtual void * GetSource() const { return origin; } virtual void * GetSource() const { return origin; }
virtual bool IsSky() { return false; } virtual bool IsSky() { return true; } // although this isn't a real sky it can be handled as one.
virtual const char *GetName(); virtual const char *GetName();
FSectorPortalGroup *origin; FSectorPortalGroup *origin;