diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 699fe2b86..9e2810549 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -318,22 +318,22 @@ void DoomLevelMesh::SetLimits(FLevelLocals& doomMap) Reset(limits); } -void DoomLevelMesh::DrawSector(FRenderState& renderstate, int sectorIndex, LevelMeshDrawType drawType, bool noFragmentShader) +void DoomLevelMesh::DrawSectors(FRenderState& renderstate, const TArray& sectors, LevelMeshDrawType drawType, bool noFragmentShader) { - for (const DrawRangeInfo& di : Flats[sectorIndex].DrawRanges) + for (int sectorIndex : sectors) { - if (di.DrawType == drawType) + for (const DrawRangeInfo& di : Flats[sectorIndex].DrawRanges[(int)drawType]) { renderstate.DrawLevelMeshRange(di.IndexStart, di.IndexCount, di.PipelineID, drawType, noFragmentShader); } } } -void DoomLevelMesh::DrawSide(FRenderState& renderstate, int sideIndex, LevelMeshDrawType drawType, bool noFragmentShader) +void DoomLevelMesh::DrawSides(FRenderState& renderstate, const TArray& sides, LevelMeshDrawType drawType, bool noFragmentShader) { - for (const DrawRangeInfo& di : Sides[sideIndex].DrawRanges) + for (int sideIndex : sides) { - if (di.DrawType == drawType) + for (const DrawRangeInfo& di : Sides[sideIndex].DrawRanges[(int)drawType]) { renderstate.DrawLevelMeshRange(di.IndexStart, di.IndexCount, di.PipelineID, drawType, noFragmentShader); } @@ -653,7 +653,8 @@ void DoomLevelMesh::FreeSide(FLevelLocals& doomMap, unsigned int sideIndex) FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); Sides[sideIndex].Geometries.Clear(); - Sides[sideIndex].DrawRanges.Clear(); + for (auto& list : Sides[sideIndex].DrawRanges) + list.Clear(); for (auto& uni : Sides[sideIndex].Uniforms) FreeUniforms(uni.Start, uni.Count); @@ -695,7 +696,8 @@ void DoomLevelMesh::FreeFlat(FLevelLocals& doomMap, unsigned int sectorIndex) FreeGeometry(geo.VertexStart, geo.VertexCount, geo.IndexStart, geo.IndexCount); Flats[sectorIndex].Geometries.Clear(); - Flats[sectorIndex].DrawRanges.Clear(); + for (auto& list : Flats[sectorIndex].DrawRanges) + list.Clear(); for (auto& uni : Flats[sectorIndex].Uniforms) FreeUniforms(uni.Start, uni.Count); @@ -1377,16 +1379,15 @@ void DoomLevelMesh::CreateWallSurface(side_t* side, HWWallDispatcher& disp, Mesh Sides[sideIndex].Geometries.Push(ginfo); Sides[sideIndex].Uniforms.Push(uinfo); - AddToDrawList(Sides[sideIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType); + AddToDrawList(Sides[sideIndex].DrawRanges[(int)drawType], pipelineID, ginfo.IndexStart, ginfo.IndexCount); } } -void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType) +void DoomLevelMesh::AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount) { DrawRangeInfo info; info.IndexStart = indexStart; info.IndexCount = indexCount; - info.DrawType = drawType; info.PipelineID = pipelineID; drawRanges.Push(info); } @@ -1662,7 +1663,7 @@ void DoomLevelMesh::CreateFlatSurface(HWFlatDispatcher& disp, MeshBuilder& state SetSubsectorLightmap(sinfo.Index); } - AddToDrawList(Flats[sectorIndex].DrawRanges, pipelineID, ginfo.IndexStart, ginfo.IndexCount, drawType); + AddToDrawList(Flats[sectorIndex].DrawRanges[(int)drawType], pipelineID, ginfo.IndexStart, ginfo.IndexCount); } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 3a172c5cf..96338466a 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -53,7 +53,6 @@ struct GeometryFreeInfo struct DrawRangeInfo { int PipelineID = 0; - LevelMeshDrawType DrawType = {}; int IndexStart = 0; int IndexCount = 0; }; @@ -76,7 +75,7 @@ struct SideSurfaceBlock TArray Decals; bool InSidePortalsList = false; bool InSideDecalsList = false; - TArray DrawRanges; + TArray DrawRanges[(int)LevelMeshDrawType::NumDrawTypes]; SurfaceUpdateType UpdateType = SurfaceUpdateType::None; LightListAllocInfo Lights; }; @@ -86,7 +85,7 @@ struct FlatSurfaceBlock int FirstSurface = -1; TArray Geometries; TArray Uniforms; - TArray DrawRanges; + TArray DrawRanges[(int)LevelMeshDrawType::NumDrawTypes]; SurfaceUpdateType UpdateType = SurfaceUpdateType::None; TArray Lights; }; @@ -107,8 +106,8 @@ public: void ProcessDecals(HWDrawInfo* drawinfo, FRenderState& state); - void DrawSector(FRenderState& renderstate, int sectorIndex, LevelMeshDrawType drawType, bool noFragmentShader); - void DrawSide(FRenderState& renderstate, int sideIndex, LevelMeshDrawType drawType, bool noFragmentShader); + void DrawSectors(FRenderState& renderstate, const TArray& sectors, LevelMeshDrawType drawType, bool noFragmentShader); + void DrawSides(FRenderState& renderstate, const TArray& sides, LevelMeshDrawType drawType, bool noFragmentShader); TArray& GetSidePortals(int sideIndex); TArray SideDecals; @@ -197,7 +196,7 @@ private: void UpdateLight(FDynamicLight* light); void CopyToMeshLight(FDynamicLight* light, LevelMeshLight& meshlight, int portalgroup); - void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount, LevelMeshDrawType drawType); + void AddToDrawList(TArray& drawRanges, int pipelineID, int indexStart, int indexCount); void UploadDynLights(FLevelLocals& doomMap); diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 8f3fdb1b8..899096b21 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -829,16 +829,14 @@ void HWDrawInfo::RenderScene(FRenderState &state) void HWDrawInfo::DrawSeenSides(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader) { RenderWall.Clock(); - for (int sideIndex : SeenSides.Get()) - level.levelMesh->DrawSide(state, sideIndex, drawType, noFragmentShader); + level.levelMesh->DrawSides(state, SeenSides.Get(), drawType, noFragmentShader); RenderWall.Unclock(); } void HWDrawInfo::DrawSeenFlats(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader) { RenderFlat.Clock(); - for (int sectorIndex : SeenSectors.Get()) - level.levelMesh->DrawSector(state, sectorIndex, drawType, noFragmentShader); + level.levelMesh->DrawSectors(state, SeenSectors.Get(), drawType, noFragmentShader); RenderFlat.Unclock(); }