mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-19 08:51:59 +00:00
stuff player, beam and explosion entities into the map (rather than
building the render entity lists directly) so they get vis-clipped. The benefits of this to newer gl cards/drivers or sw is negligable, but is a pretty serious boost for the voodoo2 (~24%).
This commit is contained in:
parent
bf323c3f0a
commit
2b2c0401cf
2 changed files with 50 additions and 45 deletions
|
@ -739,7 +739,7 @@ CL_LinkPlayers (void)
|
|||
{
|
||||
double playertime;
|
||||
int msec, oldphysent, i, j;
|
||||
entity_t **_ent;
|
||||
//entity_t **_ent;
|
||||
entity_t *ent;
|
||||
frame_t *frame;
|
||||
player_info_t *info;
|
||||
|
@ -755,6 +755,9 @@ CL_LinkPlayers (void)
|
|||
|
||||
for (j = 0, info = cl.players, state = frame->playerstate; j < MAX_CLIENTS;
|
||||
j++, info++, state++) {
|
||||
ent = &cl_player_ents[j];
|
||||
if (ent->efrag)
|
||||
R_RemoveEfrags (ent);
|
||||
if (state->messagenum != cl.parsecount)
|
||||
continue; // not present this frame
|
||||
|
||||
|
@ -790,11 +793,8 @@ CL_LinkPlayers (void)
|
|||
|| i == 93 || i == 102))
|
||||
continue;
|
||||
|
||||
// grab an entity to fill in
|
||||
_ent = R_NewEntity ();
|
||||
if (!_ent) // object list is full
|
||||
break;
|
||||
ent = *_ent = &cl_player_ents[j];
|
||||
// stuff entity in map
|
||||
R_AddEfrags (ent);
|
||||
|
||||
ent->frame = state->frame;
|
||||
ent->model = cl.model_precache[state->modelindex];
|
||||
|
|
|
@ -182,6 +182,22 @@ CL_AllocExplosion (void)
|
|||
return &cl_explosions[index];
|
||||
}
|
||||
|
||||
beam_t *
|
||||
CL_AllocBeam (int ent)
|
||||
{
|
||||
int i;
|
||||
beam_t *b;
|
||||
// override any beam with the same entity
|
||||
for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++)
|
||||
return b;
|
||||
// find a free beam
|
||||
for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++)
|
||||
if (!b->model || b->endtime < cl.time)
|
||||
return b;
|
||||
Con_Printf ("beam list overflow!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
CL_ParseBeam (model_t *m)
|
||||
{
|
||||
|
@ -194,30 +210,17 @@ CL_ParseBeam (model_t *m)
|
|||
MSG_ReadCoordV (net_message, start);
|
||||
MSG_ReadCoordV (net_message, end);
|
||||
|
||||
// override any beam with the same entity
|
||||
for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++)
|
||||
if (b->entity == ent) {
|
||||
b->entity = ent;
|
||||
b->model = m;
|
||||
b->endtime = cl.time + 0.2;
|
||||
b->seed = rand();
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
return;
|
||||
}
|
||||
// find a free beam
|
||||
for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) {
|
||||
if (!b->model || b->endtime < cl.time) {
|
||||
b->entity = ent;
|
||||
b->model = m;
|
||||
b->endtime = cl.time + 0.2;
|
||||
b->seed = rand();
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
return;
|
||||
}
|
||||
if ((b = CL_AllocBeam (ent))) {
|
||||
for (i = 0; i < b->ent_count; i++)
|
||||
if (b->ent_list[i].efrag)
|
||||
R_RemoveEfrags (&b->ent_list[i]);
|
||||
b->entity = ent;
|
||||
b->model = m;
|
||||
b->endtime = cl.time + 0.2;
|
||||
b->seed = rand();
|
||||
VectorCopy (start, b->start);
|
||||
VectorCopy (end, b->end);
|
||||
}
|
||||
Con_Printf ("beam list overflow!\n");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -298,6 +301,8 @@ CL_ParseTEnt (void)
|
|||
|
||||
// sprite
|
||||
ex = CL_AllocExplosion ();
|
||||
if (ex->ent.efrag)
|
||||
R_RemoveEfrags (&ex->ent);
|
||||
VectorCopy (pos, ex->ent.origin);
|
||||
ex->start = cl.time;
|
||||
ex->ent.model = cl_spr_explod;
|
||||
|
@ -397,7 +402,7 @@ void
|
|||
CL_UpdateBeams (void)
|
||||
{
|
||||
beam_t *b;
|
||||
entity_t **ent;
|
||||
entity_t *ent;
|
||||
float forward, pitch, yaw, d;
|
||||
int i, ent_count;
|
||||
vec3_t dist, org;
|
||||
|
@ -405,8 +410,11 @@ CL_UpdateBeams (void)
|
|||
|
||||
// update lightning
|
||||
for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) {
|
||||
if (!b->model || b->endtime < cl.time)
|
||||
if (!b->model || b->endtime < cl.time) {
|
||||
while (b->ent_count)
|
||||
R_RemoveEfrags (&b->ent_list[--b->ent_count]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// if coming from the player, update the start position
|
||||
if (b->entity == cl.viewentity) {
|
||||
|
@ -444,16 +452,15 @@ CL_UpdateBeams (void)
|
|||
b->ent_count = ent_count;
|
||||
d = 0;
|
||||
while (ent_count--) {
|
||||
ent = R_NewEntity ();
|
||||
if (!ent)
|
||||
return;
|
||||
*ent = &b->ent_list[ent_count];
|
||||
VectorMA (org, d, dist, (*ent)->origin);
|
||||
ent = &b->ent_list[ent_count];
|
||||
VectorMA (org, d, dist, ent->origin);
|
||||
d += 1;
|
||||
(*ent)->model = b->model;
|
||||
(*ent)->angles[0] = pitch;
|
||||
(*ent)->angles[1] = yaw;
|
||||
(*ent)->angles[2] = (seed = seed * BEAM_SEED_PRIME) % 360;
|
||||
ent->model = b->model;
|
||||
ent->angles[0] = pitch;
|
||||
ent->angles[1] = yaw;
|
||||
ent->angles[2] = (seed = seed * BEAM_SEED_PRIME) % 360;
|
||||
if (!ent->efrag)
|
||||
R_AddEfrags (ent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -462,7 +469,6 @@ void
|
|||
CL_UpdateExplosions (void)
|
||||
{
|
||||
int f, i;
|
||||
entity_t **ent;
|
||||
explosion_t *ex;
|
||||
|
||||
for (i = 0, ex = cl_explosions; i < MAX_EXPLOSIONS; i++, ex++) {
|
||||
|
@ -470,15 +476,14 @@ CL_UpdateExplosions (void)
|
|||
continue;
|
||||
f = 10 * (cl.time - ex->start);
|
||||
if (f >= ex->ent.model->numframes) {
|
||||
R_RemoveEfrags (&ex->ent);
|
||||
ex->ent.model = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
ent = R_NewEntity ();
|
||||
if (!ent)
|
||||
return;
|
||||
ex->ent.frame = f;
|
||||
*ent = &ex->ent;
|
||||
if (!ex->ent.efrag)
|
||||
R_AddEfrags (&ex->ent);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue