From 8ec3e23ed598a4a8bb61b6047425ac02112a7cdf Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 8 Sep 2018 23:01:35 -0400 Subject: [PATCH] Snap light level to software values (32 levels) * New properties `exactlightlevel` and `lightlevel` in `lightlevel_t` --- src/lua_baselib.c | 3 +- src/p_lights.c | 75 +++++++++++++++++++++++++++++++---------------- src/p_saveg.c | 4 +++ src/p_spec.c | 3 +- src/p_spec.h | 8 +++-- 5 files changed, 63 insertions(+), 30 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 840863eb0..74b842e2a 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1810,9 +1810,10 @@ static int lib_pFadeLight(lua_State *L) INT32 destvalue = (INT32)luaL_checkinteger(L, 2); INT32 speed = (INT32)luaL_checkinteger(L, 3); boolean ticbased = lua_optboolean(L, 4); + boolean exactlightlevel = lua_optboolean(L, 5); NOHUD INLEVEL - P_FadeLight(tag, destvalue, speed, ticbased); + P_FadeLight(tag, destvalue, speed, ticbased, exactlightlevel); return 0; } diff --git a/src/p_lights.c b/src/p_lights.c index 8be3d793c..b2934b792 100644 --- a/src/p_lights.c +++ b/src/p_lights.c @@ -15,6 +15,7 @@ #include "doomdef.h" #include "doomstat.h" // gametic #include "p_local.h" +#include "r_main.h" // LIGHTSEGSHIFT #include "r_state.h" #include "z_zone.h" #include "m_random.h" @@ -331,9 +332,10 @@ glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, * \param speed 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 + * \param exactlightlevel Do not snap to software values (for OpenGL) * \sa T_LightFade */ -void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased) +void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel) { lightlevel_t *ll; @@ -353,6 +355,8 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ll->sector = sector; ll->destlevel = destvalue; + ll->exactlightlevel = exactlightlevel; + ll->lightlevel = sector->lightlevel; if (ticbased) { @@ -370,12 +374,12 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean } } -void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) +void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel) { INT32 i; // search all sectors for ones with tag for (i = -1; (i = P_FindSectorFromTag(tag, i)) >= 0 ;) - P_FadeLightBySector(§ors[i], destvalue, speed, ticbased); + P_FadeLightBySector(§ors[i], destvalue, speed, ticbased, exactlightlevel); } /** Fades the light level in a sector to a new value. @@ -385,47 +389,66 @@ void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased) */ void T_LightFade(lightlevel_t *ll) { + boolean stillfading = false; + INT16 lightlevel = ll->lightlevel; + if (ll->duration >= 0) // tic-based { + stillfading = !(gametic - ll->firsttic >= ll->duration); if (gametic - ll->firsttic >= ll->duration) { - ll->sector->lightlevel = (INT16)ll->destlevel; // set to dest lightlevel + lightlevel = (INT16)ll->destlevel; // set to dest lightlevel P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker } else if (!((gametic - ll->firsttic) % ll->interval)) { if (ll->speed < 0) - ll->sector->lightlevel = max(ll->sector->lightlevel + (INT16)ll->speed, (INT16)ll->destlevel); + lightlevel = max(lightlevel + (INT16)ll->speed, (INT16)ll->destlevel); else - ll->sector->lightlevel = min(ll->sector->lightlevel + (INT16)ll->speed, (INT16)ll->destlevel); + lightlevel = min(lightlevel + (INT16)ll->speed, (INT16)ll->destlevel); } - return; } - - if (ll->sector->lightlevel < ll->destlevel) + else // x/tic speed-based { - // increase the lightlevel - if (ll->sector->lightlevel + ll->speed >= ll->destlevel) + if (lightlevel < ll->destlevel) { - // stop changing light level - ll->sector->lightlevel = (INT16)ll->destlevel; // set to dest lightlevel + // increase the lightlevel + if (lightlevel + ll->speed >= ll->destlevel) + { + // stop changing light level + lightlevel = (INT16)ll->destlevel; // set to dest lightlevel - P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker + P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker + } + else + { + stillfading = true; + lightlevel = (INT16)(lightlevel + (INT16)ll->speed); // move lightlevel + } } else - ll->sector->lightlevel = (INT16)(ll->sector->lightlevel + (INT16)ll->speed); // move lightlevel + { + // decrease lightlevel + if (lightlevel - ll->speed <= ll->destlevel) + { + // stop changing light level + lightlevel = (INT16)ll->destlevel; // set to dest lightlevel + + P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker + } + else + { + stillfading = true; + lightlevel = (INT16)(lightlevel - (INT16)ll->speed); // move lightlevel + } + } } + + // Snap light level to software values + if (!stillfading || ll->exactlightlevel) + ll->sector->lightlevel = lightlevel; else - { - // decrease lightlevel - if (ll->sector->lightlevel - ll->speed <= ll->destlevel) - { - // stop changing light level - ll->sector->lightlevel = (INT16)ll->destlevel; // set to dest lightlevel + ll->sector->lightlevel = (lightlevel >> LIGHTSEGSHIFT) << LIGHTSEGSHIFT; - P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker - } - else - ll->sector->lightlevel = (INT16)(ll->sector->lightlevel - (INT16)ll->speed); // move lightlevel - } + ll->lightlevel = lightlevel; } diff --git a/src/p_saveg.c b/src/p_saveg.c index 8ec5b5ea8..95d073fc9 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1542,6 +1542,8 @@ static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, ht->duration); WRITEUINT32(save_p, ht->interval); WRITEUINT32(save_p, (UINT32)ht->firsttic); + WRITEUINT8(save_p, (UINT8)ht->exactlightlevel); + WRITEINT16(save_p, ht->lightlevel); } // @@ -2518,6 +2520,8 @@ static inline void LoadLightlevelThinker(actionf_p1 thinker) ht->duration = READINT32(save_p); ht->interval = READUINT32(save_p); ht->firsttic = (tic_t)READUINT32(save_p); + ht->exactlightlevel = (boolean)READUINT8(save_p); + ht->lightlevel = READINT16(save_p); if (ht->sector) ht->sector->lightingdata = ht; P_AddThinker(&ht->thinker); diff --git a/src/p_spec.c b/src/p_spec.c index a894dcbfb..707e19f08 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2781,7 +2781,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) P_FadeLight(line->tag, (line->flags & ML_BLOCKMONSTERS) ? max(min(sides[line->sidenum[0]].textureoffset>>FRACBITS, 255), 0) : line->frontsector->lightlevel, (line->flags & ML_BLOCKMONSTERS) ? max(sides[line->sidenum[0]].rowoffset>>FRACBITS, 0) : P_AproxDistance(line->dx, line->dy)>>FRACBITS, - (line->flags & ML_NOCLIMB)); + (line->flags & ML_NOCLIMB), + (line->flags & ML_TFERLINE)); break; case 421: // Stop lighting effect in tagged sectors diff --git a/src/p_spec.h b/src/p_spec.h index c2c4c8976..b354e6772 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -143,6 +143,10 @@ typedef struct INT32 duration; ///< If <0, do not use tic-based behavior. If 0, set instantly. If >0, fade lasts this duration. UINT32 interval; ///< Interval to deduct light level tic_t firsttic; ///< First gametic to count from + + // Snap to software values + boolean exactlightlevel; ///< Use exact values for OpenGL + INT16 lightlevel; ///< Internal counter for fading } lightlevel_t; #define GLOWSPEED 8 @@ -161,8 +165,8 @@ strobe_t * P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector void T_Glow(glow_t *g); glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, INT32 length); -void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased); -void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased); +void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel); +void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel); void T_LightFade(lightlevel_t *ll); typedef enum