diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index 257c27377..79b157575 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -421,17 +421,22 @@ void FDynamicLight::Tick() lightStrength = LightCalcStrength(m_currentRadius); } - bool updated = UpdateLocation(); + updated = UpdateLocation(); - if(!updated && markTiles && (m_active != wasactive || oldred != GetRed() || oldblue != GetBlue() || oldgreen != GetGreen() || oldradius != m_currentRadius)) + if(!updated && (m_active != wasactive || oldred != GetRed() || oldblue != GetBlue() || oldgreen != GetGreen() || oldradius != m_currentRadius)) { - MarkTilesForUpdate(Level, touching_sides, touching_sector); + if(markTiles) + { + MarkTilesForUpdate(Level, touching_sides, touching_sector); + } - wasactive = m_active; - oldred = GetRed(); - oldblue = GetBlue(); - oldgreen = GetGreen(); + updated = true; } + + wasactive = m_active; + oldred = GetRed(); + oldblue = GetBlue(); + oldgreen = GetGreen(); } diff --git a/src/playsim/a_dynlight.h b/src/playsim/a_dynlight.h index 5b274c2bb..1860e0def 100644 --- a/src/playsim/a_dynlight.h +++ b/src/playsim/a_dynlight.h @@ -300,6 +300,8 @@ public: bool swapped; bool explicitpitch; + bool updated; + int oldred, oldgreen, oldblue; float lightStrength; diff --git a/src/rendering/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp index 7ee9c8e03..27dbb6a11 100644 --- a/src/rendering/hwrenderer/scene/hw_spritelight.cpp +++ b/src/rendering/hwrenderer/scene/hw_spritelight.cpp @@ -60,13 +60,13 @@ public: } } - bool TraceLightVisbility(FLightNode* node, const FVector3& L, float dist) + bool TraceLightVisbility(FLightNode* node, const FVector3& L, float dist, bool ignoreCache) { FDynamicLight* light = node->lightsource; if (!light->TraceActors() || !level.levelMesh || !Actor) return true; - if (!ActorMoved && CurrentBit < 64) + if (!ignoreCache && !ActorMoved && CurrentBit < 64) { bool traceResult = (Actor->StaticLightsTraceCache.Bits >> CurrentBit) & 1; CurrentBit++; @@ -176,7 +176,7 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig if (light->IsSpot() || light->Trace()) L *= -1.0f / dist; - if (staticLight.TraceLightVisbility(node, L, dist)) + if (staticLight.TraceLightVisbility(node, L, dist, light->updated)) { if(level.info->lightattenuationmode == ELightAttenuationMode::INVERSE_SQUARE) { @@ -299,7 +299,7 @@ void hw_GetDynModelLight(HWDrawContext* drawctx, AActor *self, FDynLightData &mo if (light->Trace()) L *= 1.0f / dist; - if (staticLight.TraceLightVisbility(node, L, dist)) + if (staticLight.TraceLightVisbility(node, L, dist, light->updated)) { AddLightToList(modellightdata, group, light, true); }