diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 64b05057b..8bce30fab 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -329,7 +329,7 @@ void DoomLevelMesh::AddSectorsToDrawLists(const TArray& sectors, LevelMeshD } } -void DoomLevelMesh::AddSidesToDrawLists(const TArray& sides, LevelMeshDrawLists& lists) +void DoomLevelMesh::AddSidesToDrawLists(const TArray& sides, LevelMeshDrawLists& lists, HWDrawInfo* di) { for (int sideIndex : sides) { @@ -337,6 +337,16 @@ void DoomLevelMesh::AddSidesToDrawLists(const TArray& sides, LevelMeshDrawL { lists.Add(di.DrawType, di.PipelineID, { di.IndexStart, di.IndexStart + di.IndexCount }); } + + for (const HWMissing& missing : Sides[sideIndex].MissingUpper) + { + di->AddUpperMissingTexture(missing.side, missing.sub, missing.plane); + } + + for (const HWMissing& missing : Sides[sideIndex].MissingLower) + { + di->AddLowerMissingTexture(missing.side, missing.sub, missing.plane); + } } } @@ -660,6 +670,8 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) Sides[sideIndex].Uniforms.Clear(); Sides[sideIndex].WallPortals.Clear(); + Sides[sideIndex].MissingUpper.Clear(); + Sides[sideIndex].MissingLower.Clear(); Sides[sideIndex].Decals.Clear(); } @@ -1090,10 +1102,14 @@ void DoomLevelMesh::CreateSide(FLevelLocals& doomMap, unsigned int sideIndex) state.SetRenderStyle(STYLE_Normal); */ - for (HWWall& portal : result.portals) - { + for (const HWWall& portal : result.portals) sideBlock.WallPortals.Push(portal); - } + + for (const HWMissing& missing : result.upper) + sideBlock.MissingUpper.Push(missing); + + for (const HWMissing& missing : result.lower) + sideBlock.MissingLower.Push(missing); // Add portal surface to the level mesh so raytraces can see them CreateWallSurface(side, disp, state, result.portals, LevelMeshDrawType::Portal, sideIndex, sideBlock.Lights); diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index c18cc50fd..28f2945c4 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -19,6 +19,13 @@ struct HWDrawInfo; class DoomLevelMesh; class MeshBuilder; +struct HWMissing +{ + side_t* side; + subsector_t* sub; + double plane; +}; + struct DoomSurfaceInfo { DoomLevelMeshSurfaceType Type = ST_NONE; @@ -73,6 +80,8 @@ struct SideSurfaceBlock TArray Geometries; TArray Uniforms; TArray WallPortals; + TArray MissingUpper; + TArray MissingLower; TArray Decals; bool InSideDecalsList = false; TArray DrawRanges; @@ -143,7 +152,7 @@ public: void ProcessDecals(HWDrawInfo* drawinfo, FRenderState& state); void AddSectorsToDrawLists(const TArray& sectors, LevelMeshDrawLists& lists); - void AddSidesToDrawLists(const TArray& sides, LevelMeshDrawLists& lists); + void AddSidesToDrawLists(const TArray& sides, LevelMeshDrawLists& lists, HWDrawInfo* di); TArray& GetSidePortals(int sideIndex); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 6f4479495..22ac64dfe 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -575,7 +575,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) SeenFlatsDrawLists.Clear(); SeenSidesDrawLists.Clear(); level.levelMesh->AddSectorsToDrawLists(SeenSectors.Get(), SeenFlatsDrawLists); - level.levelMesh->AddSidesToDrawLists(SeenSides.Get(), SeenSidesDrawLists); + level.levelMesh->AddSidesToDrawLists(SeenSides.Get(), SeenSidesDrawLists, this); // And now the crappy hacks that have to be done to avoid rendering anomalies. // These cannot be multithreaded when the time comes because all these depend diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index ca3f61b68..c25c3e9ef 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -96,7 +96,6 @@ enum DrawListType GLDL_TYPES, }; - struct HWDrawInfo { struct wallseg diff --git a/src/rendering/hwrenderer/scene/hw_walldispatcher.h b/src/rendering/hwrenderer/scene/hw_walldispatcher.h index 15aec94af..3ca408818 100644 --- a/src/rendering/hwrenderer/scene/hw_walldispatcher.h +++ b/src/rendering/hwrenderer/scene/hw_walldispatcher.h @@ -1,12 +1,5 @@ #pragma once -struct HWMissing -{ - side_t* side; - subsector_t* sub; - double plane; -}; - struct HWMeshHelper { TArray opaque;