Link lightprobe targets on map load

This commit is contained in:
Magnus Norddahl 2025-07-10 03:18:44 +02:00
commit b285d35d80
3 changed files with 53 additions and 51 deletions

View file

@ -723,6 +723,55 @@ public:
TObjPtr<DSpotState *> SpotState = MakeObjPtr<DSpotState*>(nullptr);
int FindClosestProbe(FVector3 pos)
{
float bestDist = std::numeric_limits<float>::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);
}
}
//==========================================================================
//
//

View file

@ -3587,6 +3587,8 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position)
}
}
Level->RecalculateLightProbeTargets();
InitLevelMesh(map);
UpdateVBOLightmap(*screen->RenderState(), Level->sectors);

View file

@ -1,55 +1,6 @@
#include "c_dispatch.h"
#include "g_levellocals.h"
static int FindClosestProbe(FVector3 pos)
{
float bestDist = std::numeric_limits<float>::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);
}