From daab336784683e2573b1bcf197bd924488bd4b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Thu, 29 May 2025 08:19:32 -0300 Subject: [PATCH] make lm_dynlights toggling work --- .../rendering/hwrenderer/data/hw_levelmesh.h | 3 ++ .../rendering/vulkan/vk_lightmapper.cpp | 2 +- src/g_levellocals.h | 1 + src/maploader/maploader.cpp | 4 ++- src/rendering/hwrenderer/doom_levelmesh.cpp | 32 ++++++++++++++++++- src/rendering/hwrenderer/doom_levelmesh.h | 8 +++++ src/rendering/hwrenderer/hw_vertexbuilder.cpp | 2 +- 7 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 812c3c9e5..645594d5a 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -106,6 +106,9 @@ public: LevelMesh(); virtual ~LevelMesh() = default; + + virtual void FullRefresh() {}; + LevelMeshSurface* Trace(const FVector3& start, FVector3 direction, float maxDist); LevelMeshTileStats GatherTilePixelStats(); diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index e48e873f0..d714c104e 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -31,7 +31,7 @@ CVAR(Bool, lm_ao, true, CVAR_ARCHIVE); CVAR(Bool, lm_softshadows, true, CVAR_ARCHIVE); CVAR(Bool, lm_bounce, true, CVAR_ARCHIVE); CVAR(Bool, lm_dynamic, true, CVAR_ARCHIVE); -CVAR(Bool, lm_dynlights, false, CVAR_ARCHIVE); +EXTERN_CVAR(Bool, lm_dynlights); VkLightmapper::VkLightmapper(VulkanRenderDevice* fb) : fb(fb) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 29b23c9a0..954d3c3bf 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -469,6 +469,7 @@ public: // Lightmaps bool lightmaps = false; + bool orig_lightmapped = false; TArray LightmapTiles; FVector3 SunDirection; FVector3 SunColor; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index f4123285f..d2ed151b8 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -2965,6 +2965,8 @@ void MapLoader::InitLightmapTiles(MapData* map) } } + Level->orig_lightmapped = Level->lightmaps || genlightmaps; + if (map->Size(ML_LIGHTMAP) && !RunningAsTool) { // Arbitrary ZDRay limit. This will break lightmap lump loading if not enforced. @@ -2977,7 +2979,7 @@ void MapLoader::InitLightmapTiles(MapData* map) } else { - if (!Level->lightmaps && lm_dynlights) + if (!Level->lightmaps && !genlightmaps) { // Turn off AO and sunlight if we are only enabling the lightmapper for dynamic lights Level->AmbientOcclusion = false; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index f654794b9..bca86ea0b 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -19,8 +19,38 @@ #include #include "vm.h" +#include "p_setup.h" -EXTERN_CVAR(Bool, lm_dynlights); +static int InvalidateLightmap(); +static void InvalidateActorLightTraceCache(); + +static void RefreshLightmap() +{ + if(level.levelMesh) + { + level.levelMesh->FullRefresh(); + InvalidateLightmap(); + InvalidateActorLightTraceCache(); + screen->SetLevelMesh(level.levelMesh); // force lightmap texture binding update + } +} + +CUSTOM_CVAR(Bool, lm_dynlights, false, CVAR_ARCHIVE) +{ + if(*self) + { + level.lightmaps = true; + RefreshLightmap(); + } + else + { + level.lightmaps = level.orig_lightmapped; + if(level.lightmaps) + { + RefreshLightmap(); + } + } +} static bool RequireLevelMesh() { diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index f350c6480..54fe41f3a 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -142,6 +142,14 @@ public: DoomLevelMesh(FLevelLocals &doomMap); ~DoomLevelMesh(); + void FullRefresh() override + { + for (unsigned int i = 0; i < Sides.Size(); i++) + UpdateSide(i, SurfaceUpdateType::Full); + for (unsigned int i = 0; i < Flats.Size(); i++) + UpdateFlat(i, SurfaceUpdateType::Full); + } + void PrintSurfaceInfo(const LevelMeshSurface* surface); void BeginFrame(FLevelLocals& doomMap); diff --git a/src/rendering/hwrenderer/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/hw_vertexbuilder.cpp index 82d0d1acd..33af2e483 100644 --- a/src/rendering/hwrenderer/hw_vertexbuilder.cpp +++ b/src/rendering/hwrenderer/hw_vertexbuilder.cpp @@ -288,7 +288,7 @@ static int CreateIndexedSectorVerticesLM(sector_t* sec, const secplane_t& plane, static int CreateIndexedSectorVertices(sector_t* sec, const secplane_t& plane, int floor, VertexContainer& verts, int h, int lightmapIndex) { - if (level.lightmaps && lightmapIndex != -1) + if (lightmapIndex != -1) return CreateIndexedSectorVerticesLM(sec, plane, floor, h, lightmapIndex); auto& vbo_shadowdata = sector_vertices;