mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-07 08:52:01 +00:00
Snap light level to software values (32 levels)
* New properties `exactlightlevel` and `lightlevel` in `lightlevel_t`
This commit is contained in:
parent
68e67917f1
commit
cc26d03c93
5 changed files with 63 additions and 30 deletions
|
@ -1810,9 +1810,10 @@ static int lib_pFadeLight(lua_State *L)
|
||||||
INT32 destvalue = (INT32)luaL_checkinteger(L, 2);
|
INT32 destvalue = (INT32)luaL_checkinteger(L, 2);
|
||||||
INT32 speed = (INT32)luaL_checkinteger(L, 3);
|
INT32 speed = (INT32)luaL_checkinteger(L, 3);
|
||||||
boolean ticbased = lua_optboolean(L, 4);
|
boolean ticbased = lua_optboolean(L, 4);
|
||||||
|
boolean exactlightlevel = lua_optboolean(L, 5);
|
||||||
NOHUD
|
NOHUD
|
||||||
INLEVEL
|
INLEVEL
|
||||||
P_FadeLight(tag, destvalue, speed, ticbased);
|
P_FadeLight(tag, destvalue, speed, ticbased, exactlightlevel);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
#include "doomstat.h" // gametic
|
#include "doomstat.h" // gametic
|
||||||
#include "p_local.h"
|
#include "p_local.h"
|
||||||
|
#include "r_main.h" // LIGHTSEGSHIFT
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "m_random.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
|
* \param speed Speed of the fade; the change to the ligh
|
||||||
* level in each sector per tic.
|
* level in each sector per tic.
|
||||||
* \param ticbased Use a specific duration for the fade, defined by speed
|
* \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
|
* \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;
|
lightlevel_t *ll;
|
||||||
|
|
||||||
|
@ -353,6 +355,8 @@ void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean
|
||||||
|
|
||||||
ll->sector = sector;
|
ll->sector = sector;
|
||||||
ll->destlevel = destvalue;
|
ll->destlevel = destvalue;
|
||||||
|
ll->exactlightlevel = exactlightlevel;
|
||||||
|
ll->lightlevel = sector->lightlevel;
|
||||||
|
|
||||||
if (ticbased)
|
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;
|
INT32 i;
|
||||||
// search all sectors for ones with tag
|
// search all sectors for ones with tag
|
||||||
for (i = -1; (i = P_FindSectorFromTag(tag, i)) >= 0 ;)
|
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.
|
/** 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)
|
void T_LightFade(lightlevel_t *ll)
|
||||||
{
|
{
|
||||||
|
boolean stillfading = false;
|
||||||
|
INT16 lightlevel = ll->lightlevel;
|
||||||
|
|
||||||
if (ll->duration >= 0) // tic-based
|
if (ll->duration >= 0) // tic-based
|
||||||
{
|
{
|
||||||
|
stillfading = !(gametic - ll->firsttic >= ll->duration);
|
||||||
if (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
|
P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker
|
||||||
}
|
}
|
||||||
else if (!((gametic - ll->firsttic) % ll->interval))
|
else if (!((gametic - ll->firsttic) % ll->interval))
|
||||||
{
|
{
|
||||||
if (ll->speed < 0)
|
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
|
else
|
||||||
ll->sector->lightlevel = min(ll->sector->lightlevel + (INT16)ll->speed, (INT16)ll->destlevel);
|
lightlevel = min(lightlevel + (INT16)ll->speed, (INT16)ll->destlevel);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else // x/tic speed-based
|
||||||
if (ll->sector->lightlevel < ll->destlevel)
|
|
||||||
{
|
{
|
||||||
// increase the lightlevel
|
if (lightlevel < ll->destlevel)
|
||||||
if (ll->sector->lightlevel + ll->speed >= ll->destlevel)
|
|
||||||
{
|
{
|
||||||
// stop changing light level
|
// increase the lightlevel
|
||||||
ll->sector->lightlevel = (INT16)ll->destlevel; // set to dest 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
|
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
|
else
|
||||||
{
|
ll->sector->lightlevel = (lightlevel >> LIGHTSEGSHIFT) << LIGHTSEGSHIFT;
|
||||||
// decrease lightlevel
|
|
||||||
if (ll->sector->lightlevel - ll->speed <= ll->destlevel)
|
|
||||||
{
|
|
||||||
// stop changing light level
|
|
||||||
ll->sector->lightlevel = (INT16)ll->destlevel; // set to dest lightlevel
|
|
||||||
|
|
||||||
P_RemoveLighting(ll->sector); // clear lightingdata, remove thinker
|
ll->lightlevel = lightlevel;
|
||||||
}
|
|
||||||
else
|
|
||||||
ll->sector->lightlevel = (INT16)(ll->sector->lightlevel - (INT16)ll->speed); // move lightlevel
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1542,6 +1542,8 @@ static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type)
|
||||||
WRITEINT32(save_p, ht->duration);
|
WRITEINT32(save_p, ht->duration);
|
||||||
WRITEUINT32(save_p, ht->interval);
|
WRITEUINT32(save_p, ht->interval);
|
||||||
WRITEUINT32(save_p, (UINT32)ht->firsttic);
|
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->duration = READINT32(save_p);
|
||||||
ht->interval = READUINT32(save_p);
|
ht->interval = READUINT32(save_p);
|
||||||
ht->firsttic = (tic_t)READUINT32(save_p);
|
ht->firsttic = (tic_t)READUINT32(save_p);
|
||||||
|
ht->exactlightlevel = (boolean)READUINT8(save_p);
|
||||||
|
ht->lightlevel = READINT16(save_p);
|
||||||
if (ht->sector)
|
if (ht->sector)
|
||||||
ht->sector->lightingdata = ht;
|
ht->sector->lightingdata = ht;
|
||||||
P_AddThinker(&ht->thinker);
|
P_AddThinker(&ht->thinker);
|
||||||
|
|
|
@ -2781,7 +2781,8 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
P_FadeLight(line->tag,
|
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(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_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;
|
break;
|
||||||
|
|
||||||
case 421: // Stop lighting effect in tagged sectors
|
case 421: // Stop lighting effect in tagged sectors
|
||||||
|
|
|
@ -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.
|
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
|
UINT32 interval; ///< Interval to deduct light level
|
||||||
tic_t firsttic; ///< First gametic to count from
|
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;
|
} lightlevel_t;
|
||||||
|
|
||||||
#define GLOWSPEED 8
|
#define GLOWSPEED 8
|
||||||
|
@ -161,8 +165,8 @@ strobe_t * P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector
|
||||||
void T_Glow(glow_t *g);
|
void T_Glow(glow_t *g);
|
||||||
glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, INT32 length);
|
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_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel);
|
||||||
void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased);
|
void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean exactlightlevel);
|
||||||
void T_LightFade(lightlevel_t *ll);
|
void T_LightFade(lightlevel_t *ll);
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
Loading…
Reference in a new issue