diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 3e108b18f7..2204dea95d 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 2539f85723..2b56e77238 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -127,6 +127,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 15613cbda0..ae096197f0 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 996848422c..e06852e1d5 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);