dynlight optimize attempt

This commit is contained in:
Ricardo Luís Vaz Silva 2025-08-06 23:35:34 -03:00
commit 807043b995
12 changed files with 67 additions and 147 deletions

View file

@ -159,11 +159,9 @@ void HWFlat::SetupLights(HWDrawInfo *di, FDynLightData &lightdata, int portalgro
return; // no lights on additively blended surfaces.
}
auto flatLightList = di->Level->lightlists.flat_dlist.CheckKey(section);
if (flatLightList)
if (di->Level->lightlists.flat_dlist.SSize() > section->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(di->Level->lightlists.flat_dlist[section->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{

View file

@ -117,11 +117,9 @@ int HWDrawInfo::SetupLightsForOtherPlane(subsector_t * sub, FDynLightData &light
lightdata.Clear();
auto flatLightList = Level->lightlists.flat_dlist.CheckKey(sub->section);
if (flatLightList)
if (Level->lightlists.flat_dlist.SSize() > sub->section->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(Level->lightlists.flat_dlist[sub->section->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{

View file

@ -124,11 +124,9 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FSec
}
// Go through both light lists
auto flatLightList = Level->lightlists.flat_dlist.CheckKey(sec);
if (flatLightList)
if (Level->lightlists.flat_dlist.SSize() > sec->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(Level->lightlists.flat_dlist[sec->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{
@ -255,10 +253,10 @@ void hw_GetDynModelLight(AActor *self, FDynLightData &modellightdata)
{
auto section = subsector->section;
if (section->validcount == dl_validcount) return; // already done from a previous subsector.
auto flatLightList = self->Level->lightlists.flat_dlist.CheckKey(subsector->section);
if (flatLightList)
if (self->Level->lightlists.flat_dlist.SSize() > subsector->section->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(self->Level->lightlists.flat_dlist[subsector->section->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{ // check all lights touching a subsector

View file

@ -427,11 +427,9 @@ void HWWall::SetupLights(HWDrawInfo*di, FDynLightData &lightdata)
if ((seg->sidedef->Flags & WALLF_POLYOBJ) && sub)
{
// Polobject segs cannot be checked per sidedef so use the subsector instead.
auto flatLightList = di->Level->lightlists.flat_dlist.CheckKey(sub->section);
if (flatLightList)
if (di->Level->lightlists.flat_dlist.SSize() > sub->section->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(di->Level->lightlists.flat_dlist[sub->section->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{
@ -492,11 +490,9 @@ void HWWall::SetupLights(HWDrawInfo*di, FDynLightData &lightdata)
}
else
{
auto wallLightList = di->Level->lightlists.wall_dlist.CheckKey(seg->sidedef);
if (wallLightList)
if (di->Level->lightlists.wall_dlist.SSize() > seg->sidedef->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*wallLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(di->Level->lightlists.wall_dlist[seg->sidedef->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{

View file

@ -224,10 +224,10 @@ namespace swrenderer
else if (curline && curline->sidedef)
{
auto Level = curline->Subsector->sector->Level;
auto wallLightList = Level->lightlists.wall_dlist.CheckKey(curline->sidedef);
if (wallLightList)
if (Level->lightlists.wall_dlist.SSize() > curline->sidedef->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*wallLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(Level->lightlists.wall_dlist[curline->sidedef->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{

View file

@ -76,10 +76,10 @@ namespace swrenderer
return; // [SP] no dynlights if invul or lightamp
auto Level = sec->sector->Level;
auto flatLightList = Level->lightlists.flat_dlist.CheckKey(sec);
if (flatLightList)
if (Level->lightlists.flat_dlist.SSize() > sec->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(Level->lightlists.flat_dlist[sec->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{

View file

@ -209,10 +209,10 @@ namespace swrenderer
float lit_green = 0;
float lit_blue = 0;
auto Level = vis->sector->Level;
auto flatLightList = Level->lightlists.flat_dlist.CheckKey(vis->section);
if (flatLightList)
if (Level->lightlists.flat_dlist.SSize() > vis->section->Index())
{
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(*flatLightList);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Iterator it(Level->lightlists.flat_dlist[vis->section->Index()]);
TMap<FDynamicLight *, std::unique_ptr<FLightNode>>::Pair *pair;
while (it.NextPair(pair))
{