Link lightprobe targets on map load
This commit is contained in:
parent
ed0db43eaa
commit
b285d35d80
3 changed files with 53 additions and 51 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
|
|
|||
|
|
@ -3587,6 +3587,8 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position)
|
|||
}
|
||||
}
|
||||
|
||||
Level->RecalculateLightProbeTargets();
|
||||
|
||||
InitLevelMesh(map);
|
||||
|
||||
UpdateVBOLightmap(*screen->RenderState(), Level->sectors);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue