From 7cd33cc060c7d285adf27a8d26031eafce87e69f Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Thu, 14 Sep 2023 12:17:33 +0200 Subject: [PATCH] Optimize which surfaces are passed to lightmapper --- src/common/rendering/hwrenderer/data/hw_levelmesh.h | 4 ++++ src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp | 3 +++ src/rendering/hwrenderer/doom_levelmesh.cpp | 1 + src/rendering/hwrenderer/scene/hw_bsp.cpp | 2 +- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 3e108b18f..2204dea95 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -93,6 +93,10 @@ struct LevelMeshSurface int lightmapperAtlasY = -1; }; +inline float IsInFrontOfPlane(const FVector4& plane, const FVector3& point) +{ + return (plane.X * point.X + plane.Y * point.Y + plane.Z * point.Z) >= plane.W; +} struct LevelMeshSmoothingGroup { diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp index ec6075245..4dbfad0f8 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -126,6 +126,9 @@ void VkLightmap::RenderAtlasImage(size_t pageIndex, const TArraylightmapperAtlasPage != pageIndex) continue; + if (targetSurface->LightList.empty() && (targetSurface->plane.XYZ() | mesh->SunDirection) < 0.0f) // No lights, no sun //TODO fill the area with black pixels skipping blur and resolve pass + continue; + VkViewport viewport = {}; viewport.maxDepth = 1; viewport.x = (float)targetSurface->lightmapperAtlasX - 1; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 15613cbda..ae096197f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -204,6 +204,7 @@ void DoomLevelMesh::PropagateLight(const LevelMeshLight* light, std::set == surface.sectorGroup) + if (IsInFrontOfPlane(surface.plane, light->RelativeOrigin)) { if (surface.portalIndex >= 0) { diff --git a/src/rendering/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp index 996848422..e06852e1d 100644 --- a/src/rendering/hwrenderer/scene/hw_bsp.cpp +++ b/src/rendering/hwrenderer/scene/hw_bsp.cpp @@ -869,7 +869,7 @@ void UpdateLightmaps(DFrameBuffer* screen, FRenderState& RenderState) { for (auto& e : level.levelMesh->Surfaces) { - if (e.needsUpdate) + if (e.needsUpdate && !e.bSky) { list.Push(&e);