From b285d35d806fa7fee16dad7b43074d3487a4ca9b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 10 Jul 2025 03:18:44 +0200 Subject: [PATCH] Link lightprobe targets on map load --- src/g_levellocals.h | 49 +++++++++++++++++ src/maploader/maploader.cpp | 2 + src/rendering/hwrenderer/doom_lightprobes.cpp | 53 +------------------ 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index fb9a699ab..ce93f115e 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -723,6 +723,55 @@ public: TObjPtr SpotState = MakeObjPtr(nullptr); + int FindClosestProbe(FVector3 pos) + { + float bestDist = std::numeric_limits::max(); + int best = 0; + + for (int i = 0, size = lightProbes.size(); i < size; ++i) + { + const auto& probe = lightProbes[i]; + + const auto probeDist = (probe.position - pos).LengthSquared(); + + if (probeDist < bestDist) + { + best = i; + bestDist = probeDist; + } + } + + return best; + } + + void RecalculateLightProbeTargets() + { + for (int i = 0, size = sectors.size(); i < size; ++i) + { + auto& sector = sectors[i]; + const auto origin = FVector3(sector.centerspot.X, sector.centerspot.Y, float(sector.floorplane.ZatPoint(sector.centerspot) + 64.0)); + + sector.lightProbe.index = FindClosestProbe(origin); + } + + for (int i = 0, size = sides.size(); i < size; ++i) + { + auto& side = sides[i]; + + const auto sector = side.sector; + + if (!sector) // better safe than sorry + { + continue; + } + + const auto xy = side.linedef->v1->fPos() + side.linedef->delta * 0.5; + const auto origin = FVector3(xy.X, xy.Y, float(sector->floorplane.ZatPoint(sector->centerspot) + 64.0)); + + side.lightProbe.index = FindClosestProbe(origin); + } + } + //========================================================================== // // diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 0c651206b..b7d52eb89 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3587,6 +3587,8 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) } } + Level->RecalculateLightProbeTargets(); + InitLevelMesh(map); UpdateVBOLightmap(*screen->RenderState(), Level->sectors); diff --git a/src/rendering/hwrenderer/doom_lightprobes.cpp b/src/rendering/hwrenderer/doom_lightprobes.cpp index 23cc2214c..b6a7fa95f 100644 --- a/src/rendering/hwrenderer/doom_lightprobes.cpp +++ b/src/rendering/hwrenderer/doom_lightprobes.cpp @@ -1,55 +1,6 @@ #include "c_dispatch.h" #include "g_levellocals.h" -static int FindClosestProbe(FVector3 pos) -{ - float bestDist = std::numeric_limits::max(); - int best = 0; - - for (int i = 0, size = level.lightProbes.size(); i < size; ++i) - { - const auto& probe = level.lightProbes[i]; - - const auto probeDist = (probe.position - pos).LengthSquared(); - - if (probeDist < bestDist) - { - best = i; - bestDist = probeDist; - } - } - - return best; -} - -static void RecalculateLightProbeTargets() -{ - for (int i = 0, size = level.sectors.size(); i < size; ++i) - { - auto& sector = level.sectors[i]; - const auto origin = FVector3(sector.centerspot.X, sector.centerspot.Y, float(sector.floorplane.ZatPoint(sector.centerspot) + 64.0)); - - sector.lightProbe.index = FindClosestProbe(origin); - } - - for (int i = 0, size = level.sides.size(); i < size; ++i) - { - auto& side = level.sides[i]; - - const auto sector = side.sector; - - if (!sector) // better safe than sorry - { - continue; - } - - const auto xy = side.linedef->v1->fPos() + side.linedef->delta * 0.5; - const auto origin = FVector3(xy.X, xy.Y, float(sector->floorplane.ZatPoint(sector->centerspot) + 64.0)); - - side.lightProbe.index = FindClosestProbe(origin); - } -} - static void DumpLightProbeTargets() { for (int i = 0, size = level.sectors.size(); i < size; ++i) @@ -96,7 +47,7 @@ CCMD(addlightprobe) { const auto pos = FVector3(players[0].mo->Pos().X, players[0].mo->Pos().Y, players[0].viewz); AddLightProbe(pos); - RecalculateLightProbeTargets(); + level.RecalculateLightProbeTargets(); Printf("Spawned probe at %.1f, %.1f, %.1f\n", pos.X, pos.Y, pos.Z); } @@ -122,7 +73,7 @@ CCMD(autoaddlightprobes) AddLightProbe(origin); } - RecalculateLightProbeTargets(); + level.RecalculateLightProbeTargets(); Printf("Spawned %d probes\n", probes); }