Quad/pentagram dlights for 2021 rerelease

This commit is contained in:
Andrei Drexler 2022-03-11 23:55:10 +03:00 committed by Ozkan Sezer
parent 6cf0547d01
commit 065c158254
4 changed files with 61 additions and 3 deletions

View file

@ -548,6 +548,26 @@ void CL_RelinkEntities (void)
dl->radius = 200 + (rand()&31);
dl->die = cl.time + 0.001;
}
if (ent->effects & EF_QEX_QUADLIGHT)
{
dl = CL_AllocDlight (i);
VectorCopy (ent->origin, dl->origin);
dl->radius = 200 + (rand()&31);
dl->die = cl.time + 0.001;
dl->color[0] = 0.25f;
dl->color[1] = 0.25f;
dl->color[2] = 1.0f;
}
if (ent->effects & EF_QEX_PENTALIGHT)
{
dl = CL_AllocDlight (i);
VectorCopy (ent->origin, dl->origin);
dl->radius = 200 + (rand()&31);
dl->die = cl.time + 0.001;
dl->color[0] = 1.0f;
dl->color[1] = 0.25f;
dl->color[2] = 0.25f;
}
if (ent->model->flags & EF_GIB)
R_RocketTrail (oldorg, ent->origin, 2);

View file

@ -39,6 +39,9 @@ m*_t structures are in-memory
#define EF_MUZZLEFLASH 2
#define EF_BRIGHTLIGHT 4
#define EF_DIMLIGHT 8
#define EF_QEX_QUADLIGHT 16 // 2021 rerelease
#define EF_QEX_PENTALIGHT 32 // 2021 rerelease
#define EF_QEX_CANDLELIGHT 64 // 2021 rerelease
/*

View file

@ -35,6 +35,7 @@ static ddef_t *pr_fielddefs;
static ddef_t *pr_globaldefs;
qboolean pr_alpha_supported; //johnfitz
int pr_effects_mask; // only enable 2021 rerelease quad/penta dlights when applicable
dstatement_t *pr_statements;
globalvars_t *pr_global_struct;
@ -1041,6 +1042,37 @@ void ED_LoadFromFile (const char *data)
}
/*
===============
PR_HasGlobal
===============
*/
static qboolean PR_HasGlobal (const char *name, float value)
{
ddef_t *g = ED_FindGlobal (name);
return g && (g->type & ~DEF_SAVEGLOBAL) == ev_float && G_FLOAT (g->ofs) == value;
}
/*
===============
PR_FindSupportedEffects
Checks for the presence of Quake 2021 release effects flags and returns a mask
with the correspondings bits either on or off depending on the result, in order
to avoid conflicts (e.g. Arcane Dimensions uses bit 32 for its explosions)
===============
*/
static int PR_FindSupportedEffects (void)
{
qboolean isqex =
PR_HasGlobal ("EF_QUADLIGHT", EF_QEX_QUADLIGHT) &&
(PR_HasGlobal ("EF_PENTLIGHT", EF_QEX_PENTALIGHT) || PR_HasGlobal ("EF_PENTALIGHT", EF_QEX_PENTALIGHT))
;
return isqex ? -1 : -1 & ~(EF_QEX_QUADLIGHT|EF_QEX_PENTALIGHT|EF_QEX_CANDLELIGHT);
}
/*
===============
PR_LoadProgs
@ -1145,6 +1177,8 @@ void PR_LoadProgs (void)
// properly aligned
pr_edict_size += sizeof(void *) - 1;
pr_edict_size &= ~(sizeof(void *) - 1);
pr_effects_mask = PR_FindSupportedEffects ();
}

View file

@ -31,6 +31,7 @@ static char localmodels[MAX_MODELS][8]; // inline model names for precache
int sv_protocol = PROTOCOL_FITZQUAKE; //johnfitz
extern qboolean pr_alpha_supported; //johnfitz
extern int pr_effects_mask;
//============================================================================
@ -644,7 +645,7 @@ void SV_WriteEntitiesToClient (edict_t *clent, sizebuf_t *msg)
if (ent->baseline.frame != ent->v.frame)
bits |= U_FRAME;
if (ent->baseline.effects != ent->v.effects)
if ((ent->baseline.effects ^ (int)ent->v.effects) & pr_effects_mask)
bits |= U_EFFECTS;
if (ent->baseline.modelindex != ent->v.modelindex)
@ -661,7 +662,7 @@ void SV_WriteEntitiesToClient (edict_t *clent, sizebuf_t *msg)
}
//don't send invisible entities unless they have effects
if (ent->alpha == ENTALPHA_ZERO && !ent->v.effects)
if (ent->alpha == ENTALPHA_ZERO && !((int)ent->v.effects & pr_effects_mask))
continue;
//johnfitz
@ -713,7 +714,7 @@ void SV_WriteEntitiesToClient (edict_t *clent, sizebuf_t *msg)
if (bits & U_SKIN)
MSG_WriteByte (msg, ent->v.skin);
if (bits & U_EFFECTS)
MSG_WriteByte (msg, ent->v.effects);
MSG_WriteByte (msg, (int)ent->v.effects & pr_effects_mask);
if (bits & U_ORIGIN1)
MSG_WriteCoord (msg, ent->v.origin[0], sv.protocolflags);
if (bits & U_ANGLE1)