diff --git a/src/gl/dynlights/a_dynlight.cpp b/src/gl/dynlights/a_dynlight.cpp index 0e52eedd8a..84e1d9ab1b 100644 --- a/src/gl/dynlights/a_dynlight.cpp +++ b/src/gl/dynlights/a_dynlight.cpp @@ -67,6 +67,7 @@ #include "templates.h" #include "doomdata.h" #include "r_utility.h" +#include "p_local.h" #include "portal.h" #include "doomstat.h" #include "serializer.h" @@ -192,6 +193,7 @@ void ADynamicLight::BeginPlay() m_Radius[0] = args[LIGHT_INTENSITY]; m_Radius[1] = args[LIGHT_SECONDARY_INTENSITY]; + specialf1 = DAngle(double(SpawnAngle)).Normalized360().Degrees; visibletoplayer = true; } @@ -228,7 +230,7 @@ void ADynamicLight::Activate(AActor *activator) if (lighttype == PulseLight) { - float pulseTime = Angles.Yaw.Degrees / TICRATE; + float pulseTime = specialf1 / TICRATE; m_lastUpdate = level.maptime; m_cycler.SetParams(float(m_Radius[1]), float(m_Radius[0]), pulseTime); @@ -293,7 +295,7 @@ void ADynamicLight::Tick() case FlickerLight: { BYTE rnd = randLight(); - float pct = Angles.Yaw.Degrees / 360.f; + float pct = specialf1 / 360.f; m_currentRadius = float(m_Radius[rnd >= pct * 255]); break; @@ -304,12 +306,13 @@ void ADynamicLight::Tick() int flickerRange = m_Radius[1] - m_Radius[0]; float amt = randLight() / 255.f; - m_tickCount++; - - if (m_tickCount > Angles.Yaw.Degrees) + if (m_tickCount > specialf1) + { + m_tickCount = 0; + } + if (m_tickCount++ == 0 || m_currentRadius > m_Radius[1]) { m_currentRadius = float(m_Radius[0] + (amt * flickerRange)); - m_tickCount = 0; } break; } @@ -319,7 +322,7 @@ void ADynamicLight::Tick() case ColorFlickerLight: { BYTE rnd = randLight(); - float pct = Angles.Yaw.Degrees/360.f; + float pct = specialf1/360.f; m_currentRadius = m_Radius[rnd >= pct * 255]; break; @@ -332,7 +335,7 @@ void ADynamicLight::Tick() m_tickCount++; - if (m_tickCount > Angles.Yaw.Degrees) + if (m_tickCount > specialf1) { m_currentRadius = m_Radius[0] + (amt * flickerRange); m_tickCount = 0; @@ -359,7 +362,6 @@ void ADynamicLight::Tick() m_currentRadius = float(m_Radius[0]); break; } - UpdateLocation(); } @@ -416,6 +418,7 @@ void ADynamicLight::UpdateLocation() intensity = m_currentRadius; } radius = intensity * 2.0f; + assert(radius >= m_currentRadius * 2); if (X() != oldx || Y() != oldy || radius != oldradius) { diff --git a/src/gl/dynlights/gl_dynlight.cpp b/src/gl/dynlights/gl_dynlight.cpp index 40008e3ad5..63ddfee605 100644 --- a/src/gl/dynlights/gl_dynlight.cpp +++ b/src/gl/dynlights/gl_dynlight.cpp @@ -164,7 +164,7 @@ FLightDefaults::FLightDefaults(FName name, ELightType type) void FLightDefaults::ApplyProperties(ADynamicLight * light) const { light->lighttype = m_type; - light->Angles.Yaw.Degrees = m_Param; + light->specialf1 = m_Param; light->SetOffset(m_Pos); light->halo = m_halo; for (int a = 0; a < 3; a++) light->args[a] = clamp((int)(m_Args[a]), 0, 255); @@ -174,6 +174,7 @@ void FLightDefaults::ApplyProperties(ADynamicLight * light) const if (m_subtractive) light->flags4 |= MF4_SUBTRACTIVE; if (m_additive) light->flags4 |= MF4_ADDITIVE; if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF; + light->m_tickCount = 0; } @@ -431,6 +432,14 @@ void gl_ParsePulseLight(FScanner &sc) sc.ScriptError("Unknown tag: %s\n", sc.String); } } + if (defaults->GetArg(LIGHT_INTENSITY) > defaults->GetArg(LIGHT_SECONDARY_INTENSITY)) + { + auto i = defaults->GetArg(LIGHT_INTENSITY); + auto j = defaults->GetArg(LIGHT_SECONDARY_INTENSITY); + defaults->SetArg(LIGHT_INTENSITY, j); + defaults->SetArg(LIGHT_SECONDARY_INTENSITY, i); + } + gl_AddLightDefaults(defaults); } else @@ -1082,7 +1091,7 @@ void gl_AttachLight(AActor *actor, unsigned int count, const FLightDefaults *lig light->target = actor; light->owned = true; light->ObjectFlags |= OF_Transient; - light->flags4 |= MF4_ATTENUATE; + //light->flags4 |= MF4_ATTENUATE; actor->dynamiclights.Push(light); } light->flags2&=~MF2_DORMANT; diff --git a/src/gl/dynlights/gl_dynlight.h b/src/gl/dynlights/gl_dynlight.h index c51e0c79d8..e8448890bc 100644 --- a/src/gl/dynlights/gl_dynlight.h +++ b/src/gl/dynlights/gl_dynlight.h @@ -128,12 +128,12 @@ private: protected: DVector3 m_off; float m_currentRadius; - int m_tickCount; unsigned int m_lastUpdate; FCycler m_cycler; subsector_t * subsector; public: + int m_tickCount; int m_Radius[2]; BYTE lightflags; BYTE lighttype; @@ -143,11 +143,6 @@ public: bool visibletoplayer; int bufferindex; - // intermediate texture coordinate data - // this is stored in the light object to avoid recalculating it - // several times during rendering of a flat - Vector nearPt, up, right; - float scale; };