mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-11 07:11:54 +00:00
- fixed: The cycler for a pulse light needs to be reinitialized when new light properties get applied.
- do not clamp the cycler's output to a byte.
This commit is contained in:
parent
a825d1d92f
commit
78737f9bc7
5 changed files with 32 additions and 8 deletions
|
@ -236,7 +236,7 @@ void ADynamicLight::Activate(AActor *activator)
|
||||||
m_cycler.SetParams(float(m_Radius[1]), float(m_Radius[0]), pulseTime);
|
m_cycler.SetParams(float(m_Radius[1]), float(m_Radius[0]), pulseTime);
|
||||||
m_cycler.ShouldCycle(true);
|
m_cycler.ShouldCycle(true);
|
||||||
m_cycler.SetCycleType(CYCLE_Sin);
|
m_cycler.SetCycleType(CYCLE_Sin);
|
||||||
m_currentRadius = (BYTE)m_cycler.GetVal();
|
m_currentRadius = m_cycler.GetVal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,8 @@ FLightDefaults::FLightDefaults(FName name, ELightType type)
|
||||||
|
|
||||||
void FLightDefaults::ApplyProperties(ADynamicLight * light) const
|
void FLightDefaults::ApplyProperties(ADynamicLight * light) const
|
||||||
{
|
{
|
||||||
|
auto oldtype = light->lighttype;
|
||||||
|
|
||||||
light->lighttype = m_type;
|
light->lighttype = m_type;
|
||||||
light->specialf1 = m_Param;
|
light->specialf1 = m_Param;
|
||||||
light->SetOffset(m_Pos);
|
light->SetOffset(m_Pos);
|
||||||
|
@ -179,6 +181,17 @@ void FLightDefaults::ApplyProperties(ADynamicLight * light) const
|
||||||
if (m_additive) light->flags4 |= MF4_ADDITIVE;
|
if (m_additive) light->flags4 |= MF4_ADDITIVE;
|
||||||
if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF;
|
if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF;
|
||||||
light->m_tickCount = 0;
|
light->m_tickCount = 0;
|
||||||
|
if (m_type == PulseLight)
|
||||||
|
{
|
||||||
|
float pulseTime = float(m_Param / TICRATE);
|
||||||
|
|
||||||
|
light->m_lastUpdate = level.maptime;
|
||||||
|
light->m_cycler.SetParams(float(light->m_Radius[1]), float(light->m_Radius[0]), pulseTime, oldtype == PulseLight);
|
||||||
|
light->m_cycler.ShouldCycle(true);
|
||||||
|
light->m_cycler.SetCycleType(CYCLE_Sin);
|
||||||
|
light->m_currentRadius = light->m_cycler.GetVal();
|
||||||
|
}
|
||||||
|
|
||||||
switch (m_attenuate)
|
switch (m_attenuate)
|
||||||
{
|
{
|
||||||
case 0: light->flags4 &= ~MF4_ATTENUATE; break;
|
case 0: light->flags4 &= ~MF4_ATTENUATE; break;
|
||||||
|
|
|
@ -33,7 +33,7 @@ EXTERN_CVAR(Bool, gl_attachedlights)
|
||||||
|
|
||||||
class ADynamicLight;
|
class ADynamicLight;
|
||||||
class FSerializer;
|
class FSerializer;
|
||||||
|
class FLightDefaults;
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -91,6 +91,7 @@ struct FLightNode
|
||||||
|
|
||||||
class ADynamicLight : public AActor
|
class ADynamicLight : public AActor
|
||||||
{
|
{
|
||||||
|
friend class FLightDefaults;
|
||||||
DECLARE_CLASS (ADynamicLight, AActor)
|
DECLARE_CLASS (ADynamicLight, AActor)
|
||||||
public:
|
public:
|
||||||
virtual void Tick();
|
virtual void Tick();
|
||||||
|
|
|
@ -83,13 +83,23 @@ FCycler::FCycler()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FCycler::SetParams(float start, float end, float cycle)
|
void FCycler::SetParams(float start, float end, float cycle, bool update)
|
||||||
{
|
{
|
||||||
|
if (!update || cycle != m_cycle)
|
||||||
|
{
|
||||||
m_cycle = cycle;
|
m_cycle = cycle;
|
||||||
m_time = 0.f;
|
m_time = 0.f;
|
||||||
m_start = m_current = start;
|
|
||||||
m_end = end;
|
|
||||||
m_increment = true;
|
m_increment = true;
|
||||||
|
m_current = start;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// When updating and keeping the same cycle, scale the current light size to the new dimensions.
|
||||||
|
float fact = (m_current - m_start) / (m_end - m_start);
|
||||||
|
m_current = start + fact *(end - start);
|
||||||
|
}
|
||||||
|
m_start = start;
|
||||||
|
m_end = end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ class FCycler
|
||||||
public:
|
public:
|
||||||
FCycler();
|
FCycler();
|
||||||
void Update(float diff);
|
void Update(float diff);
|
||||||
void SetParams(float start, float end, float cycle);
|
void SetParams(float start, float end, float cycle, bool update = false);
|
||||||
void ShouldCycle(bool sc) { m_shouldCycle = sc; }
|
void ShouldCycle(bool sc) { m_shouldCycle = sc; }
|
||||||
void SetCycleType(CycleType ct) { m_cycleType = ct; }
|
void SetCycleType(CycleType ct) { m_cycleType = ct; }
|
||||||
float GetVal() { return m_current; }
|
float GetVal() { return m_current; }
|
||||||
|
|
Loading…
Reference in a new issue