diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 969dc1089..64b05057b 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -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); } diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index dc550530d..6f4479495 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -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) { diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index b1f146b43..ca3f61b68 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -226,7 +226,7 @@ struct HWDrawInfo TArray AddedToList; }; - VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors; + VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors, SeenSubsectorPortals; LevelMeshDrawLists SeenFlatsDrawLists, SeenSidesDrawLists; TArray QueryResultsBuffer; diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.cpp b/src/rendering/hwrenderer/scene/hw_visibleset.cpp index 70b0976c3..83cc23dd9 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.cpp +++ b/src/rendering/hwrenderer/scene/hw_visibleset.cpp @@ -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(); } } diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.h b/src/rendering/hwrenderer/scene/hw_visibleset.h index 06fc510d7..919a75321 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.h +++ b/src/rendering/hwrenderer/scene/hw_visibleset.h @@ -95,7 +95,7 @@ public: TArray AddedToList; }; - VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors; + VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors, SeenSubsectorPortals; private: void RenderBSP(void* node);