diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index bfdf40c73..257c27377 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -758,6 +758,8 @@ void FDynamicLight::CollectWithinRadius(const DVector3 &opos, FSection *section, void FDynamicLight::LinkLight() { + bool markTiles = (Trace() && Level->levelMesh); + // mark the old light nodes FLightNode * node; @@ -787,27 +789,62 @@ void FDynamicLight::LinkLight() // Now delete any nodes that won't be used. These are the ones where // m_thing is still nullptr. - - node = touching_sides; - while (node) - { - if (node->lightsource == nullptr) - { - node = DeleteLightNode(node); - } - else - node = node->nextTarget; - } - node = touching_sector; - while (node) + if(markTiles) { - if (node->lightsource == nullptr) + node = touching_sides; + while (node) { - node = DeleteLightNode(node); + if (node->lightsource == nullptr) + { + MarkTilesForUpdate(Level, node->targLine->LightmapTiles); + + node = DeleteLightNode(node); + } + else + node = node->nextTarget; + } + + node = touching_sector; + while (node) + { + if (node->lightsource == nullptr) + { + for(subsector_t * ss : static_cast(node->targ)->subsectors) + { + MarkTilesForUpdate(Level, ss->LightmapTiles[0]); + MarkTilesForUpdate(Level, ss->LightmapTiles[1]); + } + + node = DeleteLightNode(node); + } + else + node = node->nextTarget; + } + } + else + { + node = touching_sides; + while (node) + { + if (node->lightsource == nullptr) + { + node = DeleteLightNode(node); + } + else + node = node->nextTarget; + } + + node = touching_sector; + while (node) + { + if (node->lightsource == nullptr) + { + node = DeleteLightNode(node); + } + else + node = node->nextTarget; } - else - node = node->nextTarget; } }