Hook up sector portals

This commit is contained in:
Magnus Norddahl 2025-05-31 17:45:42 +02:00
commit bda01dec98
5 changed files with 48 additions and 33 deletions

View file

@ -1257,15 +1257,6 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh
}
else
{
if (wallpart.texture && wallpart.texture->isMasked())
{
state.AlphaFunc(Alpha_GEqual, gl_mask_threshold);
}
else
{
state.AlphaFunc(Alpha_GEqual, 0.f);
}
wallpart.DrawWall(&disp, state, drawType == LevelMeshDrawType::Translucent || drawType == LevelMeshDrawType::TranslucentBorder);
}

View file

@ -477,6 +477,33 @@ void HWDrawInfo::RenderPVS(bool drawpsprites, FRenderState& state)
SubsectorHacks.Push(sh);
}
for (int subIndex : SeenSubsectorPortals.Get())
{
subsector_t* sub = &Level->subsectors[subIndex];
sector_t* sector = sub->sector;
auto fakesector = hw_FakeFlat(drawctx, sector, in_area, false);
FSectorPortalGroup* portal = fakesector->GetPortalGroup(sector_t::ceiling);
if (portal != nullptr)
{
AddSubsectorToPortal(portal, sub);
}
portal = fakesector->GetPortalGroup(sector_t::floor);
if (portal != nullptr)
{
AddSubsectorToPortal(portal, sub);
}
}
for (int sideIndex : SeenSides.Get())
{
for (HWWall& portal : level.levelMesh->GetSidePortals(sideIndex))
{
PutWallPortal(portal, state);
}
}
if (gl_render_things)
{
for (int subIndex : SeenSubsectors.Get())
@ -542,23 +569,9 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state)
RenderPVS(drawpsprites, state);
if (uselevelmesh)
{
if (gl_levelmesh)
level.levelMesh->CurFrameStats.Portals++;
for (int sideIndex : SeenSides.Get())
{
for (HWWall& portal : level.levelMesh->GetSidePortals(sideIndex))
{
// sector portals not handled yet by PutWallPortal
if (portal.portaltype != PORTALTYPE_SECTORSTACK)
{
PutWallPortal(portal, state);
}
}
}
}
SeenFlatsDrawLists.Clear();
SeenSidesDrawLists.Clear();
level.levelMesh->AddSectorsToDrawLists(SeenSectors.Get(), SeenFlatsDrawLists);
@ -594,20 +607,24 @@ void HWDrawInfo::PutWallPortal(HWWall wall, FRenderState& state)
int portaltype = wall.portaltype;
int portalplane = wall.portalplane;
HWSkyInfo skyinfo;
if (portaltype == PORTALTYPE_SKY)
{
HWSkyInfo skyinfo;
skyinfo.init(this, wall.frontsector, sector_t::ceiling, wall.frontsector->skytransfer, wall.Colormap.FadeColor);
wall.sky = &skyinfo;
wall.PutPortal(&ddi, state, portaltype, portalplane);
}
else if (portaltype == PORTALTYPE_SECTORSTACK)
{
// To do: this seems to need AddSubsectorToPortal?
auto glport = wall.frontsector->GetPortalGroup(portalplane);
if (glport)
{
if (wall.frontsector->PortalBlocksView(portalplane)) return;
if (screen->instack[1 - portalplane]) return;
//if (screen->instack[1 - portalplane])
// return;
//wall.PutPortal(&ddi, state, portaltype, portalplane);
wall.portal = glport;
wall.PutPortal(&ddi, state, portaltype, portalplane);
}
}
else if (portaltype == PORTALTYPE_PLANEMIRROR)
{

View file

@ -226,7 +226,7 @@ struct HWDrawInfo
TArray<bool> AddedToList;
};
VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors;
VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors, SeenSubsectorPortals;
LevelMeshDrawLists SeenFlatsDrawLists, SeenSidesDrawLists;
TArray<bool> QueryResultsBuffer;

View file

@ -99,6 +99,7 @@ void HWVisibleSet::RenderBSP(void* node)
SeenSides.Clear();
SeenSubsectors.Clear();
SeenHackedSubsectors.Clear();
SeenSubsectorPortals.Clear();
RenderBSPNode(node);
}
@ -247,14 +248,14 @@ void HWVisibleSet::DoSubsector(subsector_t* sub)
portal = fakesector->GetPortalGroup(sector_t::ceiling);
if (portal != nullptr)
{
// To do: what to do here?
SeenSubsectorPortals.Add(sub->Index());
// AddSubsectorToPortal(portal, sub);
}
portal = fakesector->GetPortalGroup(sector_t::floor);
if (portal != nullptr)
{
// To do: what to do here?
SeenSubsectorPortals.Add(sub->Index());
// AddSubsectorToPortal(portal, sub);
}
}
@ -582,6 +583,7 @@ void HWVisibleSetThreads::FindPVS(HWDrawInfo* di)
di->SeenSides.Clear();
di->SeenSubsectors.Clear();
di->SeenHackedSubsectors.Clear();
di->SeenSubsectorPortals.Clear();
for (int i = 0; i < SliceCount; i++)
{
if (gl_debug_slice != -1 && gl_debug_slice < SliceCount)
@ -595,6 +597,8 @@ void HWVisibleSetThreads::FindPVS(HWDrawInfo* di)
di->SeenSubsectors.Add(subIndex);
for (int subIndex : Slices[i].SeenHackedSubsectors.Get())
di->SeenHackedSubsectors.Add(subIndex);
for (int subIndex : Slices[i].SeenSubsectorPortals.Get())
di->SeenSubsectorPortals.Add(subIndex);
if (gl_debug_slice != -1)
break;
@ -631,10 +635,13 @@ void HWVisibleSetThreads::WorkerMain(int sliceIndex)
Slices[left].SeenSubsectors.Add(subIndex);
for (int subIndex : Slices[right].SeenHackedSubsectors.Get())
Slices[left].SeenHackedSubsectors.Add(subIndex);
for (int subIndex : Slices[right].SeenSubsectorPortals.Get())
Slices[left].SeenSubsectorPortals.Add(subIndex);
Slices[right].SeenSectors.Clear();
Slices[right].SeenSides.Clear();
Slices[right].SeenSubsectors.Clear();
Slices[right].SeenHackedSubsectors.Clear();
Slices[right].SeenSubsectorPortals.Clear();
lock.lock();
}
}

View file

@ -95,7 +95,7 @@ public:
TArray<bool> AddedToList;
};
VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors;
VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors, SeenSubsectorPortals;
private:
void RenderBSP(void* node);