From ab4a825385bee6aa3fd4577d4744e3e1e1830134 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 19:00:50 -0400 Subject: [PATCH 1/4] 420: Combine speed and duration logic for fade lighting --- src/p_lights.c | 61 ++++++++++++++------------------------------------ src/p_saveg.c | 4 ++-- src/p_spec.h | 4 ++-- 3 files changed, 21 insertions(+), 48 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index 8bcdd8ce0..6eb9b02ca 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -13,6 +13,7 @@ /// Fire flicker, light flash, strobe flash, lightning flash, glow, and fade. #include "doomdef.h" +#include "doomstat.h" #include "p_local.h" #include "r_state.h" #include "z_zone.h" @@ -327,7 +328,8 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, * * \param sector Target sector * \param destvalue The final light value in these sectors. - * \param speed Speed of the fade; the change to the ligh + * \param speed If tic-based: total duration of effect. + * If speed-based: Speed of the fade; the change to the ligh * level in each sector per tic. * \param ticbased Use a specific duration for the fade, defined by speed * \sa T_LightFade @@ -357,13 +359,13 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean if (ticbased) { ll->ticbased = true; - ll->timer = ll->speed = abs(speed); // use ll->speed for total duration + ll->timer = ll->duration = abs(speed); // speed means duration } else { ll->ticbased = false; - ll->timer = -1; - ll->speed = abs(speed); + ll->timer = abs(ll->destlevel - ll->sourcelevel); + ll->duration = abs(speed); // ll->duration is used as speed } } @@ -382,49 +384,20 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) */ void T_LightFade(lightlevel_t *ll) { - if (ll->ticbased) + if ((ll->ticbased && --ll->timer <= 0) + || (!ll->ticbased && (ll->timer -= ll->duration) <= 0)) { - if (--ll->timer <= 0) - { - ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel - P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker - } - else - { - INT16 delta = abs(ll->destlevel - ll->sourcelevel); - fixed_t factor = min(FixedDiv(ll->speed - ll->timer, ll->speed), 1*FRACUNIT); - if (ll->destlevel < ll->sourcelevel) - ll->sector->lightlevel = max(min(ll->sector->lightlevel, ll->sourcelevel - (INT16)FixedMul(delta, factor)), ll->destlevel); - else if (ll->destlevel > ll->sourcelevel) - ll->sector->lightlevel = min(max(ll->sector->lightlevel, ll->sourcelevel + (INT16)FixedMul(delta, factor)), ll->destlevel); - } - return; - } - - if (ll->sector->lightlevel < ll->destlevel) - { - // increase the lightlevel - if (ll->sector->lightlevel + ll->speed >= ll->destlevel) - { - // stop changing light level - ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel - - P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker - } - else - ll->sector->lightlevel += ll->speed; // move lightlevel + ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel + P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker } else { - // decrease lightlevel - if (ll->sector->lightlevel - ll->speed <= ll->destlevel) - { - // stop changing light level - ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel - - P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker - } - else - ll->sector->lightlevel -= ll->speed; // move lightlevel + INT16 delta = abs(ll->destlevel - ll->sourcelevel); + INT32 duration = ll->ticbased ? ll->duration : delta; // speed-based: timer's initial value is equal to delta + fixed_t factor = min(FixedDiv(duration - ll->timer, duration), 1*FRACUNIT); + if (ll->destlevel < ll->sourcelevel) + ll->sector->lightlevel = max(min(ll->sector->lightlevel, ll->sourcelevel - (INT16)FixedMul(delta, factor)), ll->destlevel); + else if (ll->destlevel > ll->sourcelevel) + ll->sector->lightlevel = min(max(ll->sector->lightlevel, ll->sourcelevel + (INT16)FixedMul(delta, factor)), ll->destlevel); } } diff --git a/src/p_saveg.c b/src/p_saveg.c index 574f871bb..b2d430d1e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1561,8 +1561,8 @@ static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, SaveSector(ht->sector)); WRITEINT16(save_p, ht->sourcelevel); WRITEINT16(save_p, ht->destlevel); - WRITEINT16(save_p, ht->speed); WRITEUINT8(save_p, (UINT8)ht->ticbased); + WRITEINT16(save_p, ht->duration); WRITEINT32(save_p, ht->timer); } @@ -2537,8 +2537,8 @@ static inline void LoadLightlevelThinker(actionf_p1 thinker) ht->sector = LoadSector(READUINT32(save_p)); ht->sourcelevel = READINT16(save_p); ht->destlevel = READINT16(save_p); - ht->speed = READINT16(save_p); ht->ticbased = (boolean)READUINT8(save_p); + ht->duration = READINT16(save_p); ht->timer = READINT32(save_p); if (ht->sector) ht->sector->lightingdata = ht; diff --git a/src/p_spec.h b/src/p_spec.h index 69087d6c4..daa6dd18a 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -138,11 +138,11 @@ typedef struct sector_t *sector; ///< Sector where action is taking place. INT16 sourcelevel; ///< Light level we're fading from. INT16 destlevel; ///< Light level we're fading to. - INT16 speed; ///< Speed at which to change light level. OR: Tic-based duration // Tic-based behavior boolean ticbased; ///< Tic-based logic - INT32 timer; ///< Tic-based timer + INT16 duration; ///< If tic-based: duration of effect. If speed-based: amount to increment + INT32 timer; ///< Internal timer } lightlevel_t; #define GLOWSPEED 8 From d939e597a5a5fa5a8e89c34edfcc12cce6e3fc2e Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 15 Sep 2018 20:03:43 -0400 Subject: [PATCH 2/4] 420: Unncessary include --- src/p_lights.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/p_lights.c b/src/p_lights.c index 6eb9b02ca..e4d7ebe9d 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -13,7 +13,6 @@ /// Fire flicker, light flash, strobe flash, lightning flash, glow, and fade. #include "doomdef.h" -#include "doomstat.h" #include "p_local.h" #include "r_state.h" #include "z_zone.h" From 350cd1435b55449a0ed9b6feee21cd8ba289fd19 Mon Sep 17 00:00:00 2001 From: Nev3r Date: Sat, 15 Sep 2018 12:21:25 +0200 Subject: [PATCH 3/4] The thinker is entirely unified now, and there is no difference in the light levels between the "old" behavior and this one now. --- src/p_lights.c | 33 ++++++++++++++++----------------- src/p_saveg.c | 8 ++++---- src/p_spec.h | 16 ++++++++-------- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index e4d7ebe9d..00c0e960f 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -355,17 +355,21 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ll->sourcelevel = sector->lightlevel; ll->destlevel = destvalue; + ll->fixedcurlevel = sector->lightlevel<ticbased = true; - ll->timer = ll->duration = abs(speed); // speed means duration + // Speed means duration. + ll->timer = abs(speed); + ll->fixedpertic = FixedDiv((destvalue<fixedcurlevel, speed<ticbased = false; - ll->timer = abs(ll->destlevel - ll->sourcelevel); - ll->duration = abs(speed); // ll->duration is used as speed + // Speed means increment per tic (literally speed). + ll->timer = FixedDiv((destvalue<fixedcurlevel, speed<>FRACBITS; + ll->fixedpertic = speed<sector->lightlevel, destvalue, ll->fixedpertic>>FRACBITS, ll->timer); } void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) @@ -383,20 +387,15 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) */ void T_LightFade(lightlevel_t *ll) { - if ((ll->ticbased && --ll->timer <= 0) - || (!ll->ticbased && (ll->timer -= ll->duration) <= 0)) + if (--ll->timer <= 0) { ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker + CONS_Printf("End tic, final light value: %d\n", ll->sector->lightlevel); + return; } - else - { - INT16 delta = abs(ll->destlevel - ll->sourcelevel); - INT32 duration = ll->ticbased ? ll->duration : delta; // speed-based: timer's initial value is equal to delta - fixed_t factor = min(FixedDiv(duration - ll->timer, duration), 1*FRACUNIT); - if (ll->destlevel < ll->sourcelevel) - ll->sector->lightlevel = max(min(ll->sector->lightlevel, ll->sourcelevel - (INT16)FixedMul(delta, factor)), ll->destlevel); - else if (ll->destlevel > ll->sourcelevel) - ll->sector->lightlevel = min(max(ll->sector->lightlevel, ll->sourcelevel + (INT16)FixedMul(delta, factor)), ll->destlevel); - } + + ll->fixedcurlevel = ll->fixedcurlevel + ll->fixedpertic; + ll->sector->lightlevel = (ll->fixedcurlevel)>>FRACBITS; + CONS_Printf("Light %d\n", ll->sector->lightlevel); } diff --git a/src/p_saveg.c b/src/p_saveg.c index b2d430d1e..c95a08361 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1561,8 +1561,8 @@ static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type) WRITEUINT32(save_p, SaveSector(ht->sector)); WRITEINT16(save_p, ht->sourcelevel); WRITEINT16(save_p, ht->destlevel); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT16(save_p, ht->duration); + WRITEFIXED(save_p, ht->fixedcurlevel); + WRITEFIXED(save_p, ht->fixedpertic); WRITEINT32(save_p, ht->timer); } @@ -2537,8 +2537,8 @@ static inline void LoadLightlevelThinker(actionf_p1 thinker) ht->sector = LoadSector(READUINT32(save_p)); ht->sourcelevel = READINT16(save_p); ht->destlevel = READINT16(save_p); - ht->ticbased = (boolean)READUINT8(save_p); - ht->duration = READINT16(save_p); + ht->fixedcurlevel = READFIXED(save_p); + ht->fixedpertic = READFIXED(save_p); ht->timer = READINT32(save_p); if (ht->sector) ht->sector->lightingdata = ht; diff --git a/src/p_spec.h b/src/p_spec.h index daa6dd18a..2c9e986ce 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -134,15 +134,15 @@ typedef struct */ typedef struct { - thinker_t thinker; ///< Thinker in use for the effect. - sector_t *sector; ///< Sector where action is taking place. - INT16 sourcelevel; ///< Light level we're fading from. - INT16 destlevel; ///< Light level we're fading to. + thinker_t thinker; ///< Thinker in use for the effect. + sector_t *sector; ///< Sector where action is taking place. + INT16 sourcelevel; ///< Light level we're fading from. + INT16 destlevel; ///< Light level we're fading to. - // Tic-based behavior - boolean ticbased; ///< Tic-based logic - INT16 duration; ///< If tic-based: duration of effect. If speed-based: amount to increment - INT32 timer; ///< Internal timer + fixed_t fixedcurlevel; ///< Fixed point for current light level. + fixed_t fixedpertic; ///< Fixed point for increment per tic. + // The reason for those two above to be fixed point is to deal with decimal values that would otherwise get trimmed away. + INT32 timer; ///< Internal timer. } lightlevel_t; #define GLOWSPEED 8 From d49f0be4ee11b57678c8ef1230063463d6c0c432 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 16 Sep 2018 08:20:14 -0400 Subject: [PATCH 4/4] 420: Strip test comments --- src/p_lights.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/p_lights.c b/src/p_lights.c index 00c0e960f..2ea93b796 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -369,7 +369,6 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ll->timer = FixedDiv((destvalue<fixedcurlevel, speed<>FRACBITS; ll->fixedpertic = speed<sector->lightlevel, destvalue, ll->fixedpertic>>FRACBITS, ll->timer); } void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) @@ -391,11 +390,9 @@ void T_LightFade(lightlevel_t *ll) { ll->sector->lightlevel = ll->destlevel; // set to dest lightlevel P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker - CONS_Printf("End tic, final light value: %d\n", ll->sector->lightlevel); return; } ll->fixedcurlevel = ll->fixedcurlevel + ll->fixedpertic; ll->sector->lightlevel = (ll->fixedcurlevel)>>FRACBITS; - CONS_Printf("Light %d\n", ll->sector->lightlevel); }