From 88c57a66779b962cd8150c6169b8faf8f0d76253 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 1 Jun 2025 01:06:51 +0200 Subject: [PATCH] Draw decals --- src/rendering/hwrenderer/doom_levelmesh.cpp | 56 +++++++------------ src/rendering/hwrenderer/doom_levelmesh.h | 4 -- .../hwrenderer/scene/hw_drawinfo.cpp | 10 +++- src/rendering/hwrenderer/scene/hw_drawinfo.h | 2 - .../hwrenderer/scene/hw_visibleset.cpp | 5 -- 5 files changed, 29 insertions(+), 48 deletions(-) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index f801ff45c..f654794b9 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -334,22 +334,39 @@ void DoomLevelMesh::AddSidesToDrawLists(const TArray& sides, LevelMeshDrawL { for (int sideIndex : sides) { - if (!Sides[sideIndex].NeedsImmediateRendering) + auto& sideInfo = Sides[sideIndex]; + + if (!sideInfo.NeedsImmediateRendering) { - for (const DrawRangeInfo& di : Sides[sideIndex].DrawRanges) + for (const DrawRangeInfo& di : sideInfo.DrawRanges) { lists.Add(di.DrawType, di.PipelineID, { di.IndexStart, di.IndexStart + di.IndexCount }); } - for (const HWMissing& missing : Sides[sideIndex].MissingUpper) + for (const HWMissing& missing : sideInfo.MissingUpper) { di->AddUpperMissingTexture(missing.side, missing.sub, missing.plane); } - for (const HWMissing& missing : Sides[sideIndex].MissingLower) + for (const HWMissing& missing : sideInfo.MissingLower) { di->AddLowerMissingTexture(missing.side, missing.sub, missing.plane); } + + auto& decals = sideInfo.Decals; + if (decals.Size() != 0) + { + int dynlightindex = -1; + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && decals[0].texture != nullptr && !lm_dynlights) + { + dynlightindex = decals[0].SetupLights(di, state, lightdata, level.sides[sideIndex].lighthead); + } + + for (const HWDecalCreateInfo& info : decals) + { + info.ProcessDecal(di, state, dynlightindex); + } + } } else { @@ -494,27 +511,6 @@ TArray& DoomLevelMesh::GetSidePortals(int sideIndex) return Sides[sideIndex].WallPortals; } -void DoomLevelMesh::ProcessDecals(HWDrawInfo* di, FRenderState& state) -{ - for (int sideIndex : level.levelMesh->SideDecals) - { - const auto& side = Sides[sideIndex]; - if (side.Decals.Size() == 0) - continue; - - int dynlightindex = -1; - if (di->Level->HasDynamicLights && !di->isFullbrightScene() && side.Decals[0].texture != nullptr && !lm_dynlights) - { - dynlightindex = side.Decals[0].SetupLights(di, state, lightdata, level.sides[sideIndex].lighthead); - } - - for (const HWDecalCreateInfo& info : side.Decals) - { - info.ProcessDecal(di, state, dynlightindex); - } - } -} - int DoomLevelMesh::GetLightIndex(FDynamicLight* light, int portalgroup) { int index; @@ -1068,12 +1064,6 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) wall.Process(&disp, state, seg, front, back); // Grab the decals generated - if (result.decals.Size() != 0 && !sideBlock.InSideDecalsList) - { - SideDecals.Push(sideIndex); - sideBlock.InSideDecalsList = true; - } - sideBlock.Decals = result.decals; state.SetDepthMask(true); @@ -1097,10 +1087,6 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) CreateWallSurface(side, disp, state, result.maskedOffset, LevelMeshDrawType::MaskedOffset, sideIndex, sideBlock.Lights); state.ClearDepthBias(); - // Part 4: Draw decals (not a real pass) - state.SetDepthFunc(DF_LEqual); - // DrawDecals(state, Decals[0]); - // These things aren't working properly with the level mesh. bool incompatible = false; for (const HWWall& wall : result.opaque) diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 763b93808..f350c6480 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -150,15 +150,11 @@ public: void BuildSectorGroups(const FLevelLocals& doomMap); - void ProcessDecals(HWDrawInfo* drawinfo, FRenderState& state); - void AddSectorsToDrawLists(const TArray& sectors, LevelMeshDrawLists& lists); void AddSidesToDrawLists(const TArray& sides, LevelMeshDrawLists& lists, HWDrawInfo* di, FRenderState& state); TArray& GetSidePortals(int sideIndex); - TArray SideDecals; - TArray sectorGroup; // index is sector, value is sectorGroup TArray sectorPortals[2]; // index is sector+plane, value is index into the portal list TArray linePortals; // index is linedef, value is index into the portal list diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index fca3caee8..63d95edc4 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -441,6 +441,14 @@ HWDecal *HWDrawInfo::AddDecal(bool onmirror) void HWDrawInfo::RenderPVS(bool drawpsprites, FRenderState& state) { + SeenSectors.Clear(); + SeenSides.Clear(); + SeenSubsectors.Clear(); + SeenHackedSubsectors.Clear(); + SeenSubsectorPortals.Clear(); + SeenFlatsDrawLists.Clear(); + SeenSidesDrawLists.Clear(); + if (Viewpoint.IsOrtho() || !(gl_levelmesh && !outer)) { RenderBSP(Level->HeadNode(), drawpsprites, state); @@ -508,8 +516,6 @@ void HWDrawInfo::RenderPVS(bool drawpsprites, FRenderState& state) if (gl_levelmesh) level.levelMesh->CurFrameStats.Portals++; - SeenFlatsDrawLists.Clear(); - SeenSidesDrawLists.Clear(); level.levelMesh->AddSectorsToDrawLists(SeenSectors.Get(), SeenFlatsDrawLists); level.levelMesh->AddSidesToDrawLists(SeenSides.Get(), SeenSidesDrawLists, this, state); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 84cbcfff0..94f6562ca 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -228,8 +228,6 @@ struct HWDrawInfo VisList SeenSectors, SeenSides, SeenSubsectors, SeenHackedSubsectors, SeenSubsectorPortals; LevelMeshDrawLists SeenFlatsDrawLists, SeenSidesDrawLists; - TArray QueryResultsBuffer; - HWDrawInfo(HWDrawContext* drawctx) : drawctx(drawctx) { for (HWDrawList& list : drawlists) list.drawctx = drawctx; } void WorkerThread(); diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.cpp b/src/rendering/hwrenderer/scene/hw_visibleset.cpp index 83cc23dd9..53693c029 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.cpp +++ b/src/rendering/hwrenderer/scene/hw_visibleset.cpp @@ -579,11 +579,6 @@ void HWVisibleSetThreads::FindPVS(HWDrawInfo* di) WTTotal.Unclock(); // Merge results - di->SeenSectors.Clear(); - 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)