From c115c0a5b2dd99a8013c95061f283ee5a5d9beb9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 6 Dec 2016 18:35:34 +0100 Subject: [PATCH] - fixed: Random flicker lights must set up their size on the first tic they are run. If not they will keep the radius of the previous effect which may be too large. --- src/gl/dynlights/a_dynlight.cpp | 21 ++++++++++++--------- src/gl/dynlights/gl_dynlight.cpp | 13 +++++++++++-- src/gl/dynlights/gl_dynlight.h | 7 +------ 3 files changed, 24 insertions(+), 17 deletions(-) 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; };