Rearrange "rocket" trail code. Some small optimizations, mostly a cleanup, will make tweaking individual effects separately easier.

This commit is contained in:
Ragnvald Maartmann-Moe IV 2001-09-06 04:26:53 +00:00
parent be7307faa9
commit 4c7e60e73a

View file

@ -424,151 +424,244 @@ R_TeleportSplash (vec3_t org)
} }
void void
R_RocketTrail (int type, entity_t *ent) R_RocketParticles (entity_t *ent)
{ {
byte palpha, pcolor; float dist, len, pscale, pscalenext;
float dist, len, pdie, pscale, pscalenext; vec3_t subtract, vec;
int ptex, j;
ptype_t ptype;
vec3_t porg, pvel, subtract, vec;
if (type == 0) R_AddFire (ent->old_origin, ent->origin, ent);
R_AddFire (ent->old_origin, ent->origin, ent);
if (!r_particles->int_val)
return;
VectorSubtract (ent->origin, ent->old_origin, vec); VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec); len = VectorNormalize (vec);
pdie = r_realtime + 2; pscale = 1.5 + qfrandom (1.5);
ptex = part_tex_dot;
ptype = pt_static; while (len > 0) {
palpha = 255; pscalenext = 1.5 + qfrandom (1.5);
pcolor = 0; dist = (pscale + pscalenext) * 1.3;
pscale = pscalenext = 4.5;
dist = 3; VectorScale (vec, min(dist, len), subtract);
/* VectorAdd (ent->old_origin, subtract, ent->old_origin);
This switch isn't just to avoid unnecessary variable unassignments, the main len -= dist;
use is to set the first pscale, since you need both it and the next to
calculate the distance to the 2nd particle -- Despair // Misty-chan's Easter Egg: change color to (rand () & 255)
*/ particle_new (pt_smoke, part_tex_smoke[rand () & 7], ent->old_origin,
switch (type) { pscale, vec3_origin, r_realtime + 2.0,
case 0: // rocket trail 12 + (rand () & 3), 128 + (rand () & 31));
pscale = 1.5 + qfrandom (1.5); pscale = pscalenext;
ptype = pt_smoke;
break;
case 1: // grenade trail
pscale = 6.0 + qfrandom (7.0);
ptype = pt_smoke;
break;
case 2: // blood
pscale = 5.0 + qfrandom (10.0);
ptype = pt_grav;
break;
case 4: // slight blood
palpha = 192;
pdie = r_realtime + 1.5;
pscale = 1.5 + qfrandom (7.5);
ptype = pt_grav;
break;
case 3: // green tracer
pdie = r_realtime + 0.5;
ptype = pt_fire;
break;
case 5: // flame tracer
pdie = r_realtime + 0.5;
ptype = pt_fire;
break;
case 6: // voor trail
pdie = r_realtime + 0.3;
ptex = part_tex_dot;
ptype = pt_static;
break;
} }
}
void
R_GrenadeParticles (entity_t *ent)
{
float dist, len, pscale, pscalenext;
vec3_t subtract, vec;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
pscale = 6.0 + qfrandom (7.0);
while (len > 0) {
pscalenext = 6.0 + qfrandom (7.0);
dist = (pscale + pscalenext) * 2.0;
VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist;
// Misty-chan's Easter Egg: change color to (rand () & 255)
particle_new (pt_smoke, part_tex_smoke[rand () & 7], ent->old_origin,
pscale, vec3_origin, r_realtime + 2.0, (rand () & 3),
128 + (rand () & 31));
pscale = pscalenext;
}
}
void
R_BloodParticles (entity_t *ent)
{
float dist, len, pscale, pscalenext;
int j;
vec3_t subtract, vec, porg, pvel;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
pscale = 5.0 + qfrandom (10.0);
while (len > 0) { while (len > 0) {
VectorCopy (vec3_origin, pvel); VectorCopy (vec3_origin, pvel);
VectorCopy (ent->old_origin, porg);
switch (type) { pscalenext = 5.0 + qfrandom (10.0);
case 0: // rocket trail dist = (pscale + pscalenext) * 1.5;
pscalenext = 1.5 + qfrandom (1.5);
dist = (pscale + pscalenext) * 1.3;
// pcolor = (rand () & 255); // Misty-chan's Easter Egg
pcolor = (rand () & 3) + 12;
palpha = 128 + (rand () & 31);
VectorCopy (ent->old_origin, porg);
ptex = part_tex_smoke[rand () & 7];
break;
case 1: // grenade trail
pscalenext = 6.0 + qfrandom (7.0);
dist = (pscale + pscalenext) * 2;
// pcolor = (rand () & 255); // Misty-chan's Easter Egg
pcolor = (rand () & 3);
palpha = 128 + (rand () & 31);
VectorCopy (ent->old_origin, porg);
ptex = part_tex_smoke[rand () & 7];
break;
case 2: // blood
pscalenext = 5.0 + qfrandom (10.0);
dist = (pscale + pscalenext) * 1.5;
ptex = part_tex_smoke[rand () & 7];
pcolor = 68 + (rand () & 3);
for (j = 0; j < 3; j++) {
pvel[j] = (qfrandom (6) - 3) * type;
porg[j] = ent->old_origin[j] + qfrandom (3.0) - 1.5;
}
break;
case 4: // slight blood
pscalenext = 1.5 + qfrandom (7.5);
dist = (pscale + pscalenext) * 1.5;
ptex = part_tex_smoke[rand () & 7];
pcolor = 68 + (rand () & 3);
for (j = 0; j < 3; j++) {
pvel[j] = (qfrandom (6) - 3) * type;
porg[j] = ent->old_origin[j] + qfrandom (3.0) - 1.5;
}
break;
case 3: // green tracer
case 5: // flame tracer
{
static int tracercount;
ptex = part_tex_smoke[rand () & 7]; for (j = 0; j < 3; j++) {
pscale = 2.0 + qfrandom (1.0); pvel[j] = (qfrandom (6.0) - 3.0) * 4.0;
if (type == 3) porg[j] = ent->old_origin[j] + qfrandom (3.0) - 1.5;
pcolor = 52 + ((tracercount & 4) << 1);
else
pcolor = 234;
tracercount++;
VectorCopy (ent->old_origin, porg);
if (tracercount & 1) {
pvel[0] = 30 * vec[1];
pvel[1] = 30 * -vec[0];
} else {
pvel[0] = 30 * -vec[1];
pvel[1] = 30 * vec[0];
}
}
break;
case 6: // voor trail
pcolor = 9 * 16 + 8 + (rand () & 3);
pscale = 1.0 + qfrandom (1.0);
for (j = 0; j < 3; j++)
porg[j] = ent->old_origin[j] + qfrandom (16.0) - 8.0;
break;
} }
VectorScale (vec, min(dist, len), subtract); VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin); VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist; len -= dist;
particle_new (ptype, ptex, porg, pscale, pvel, pdie, pcolor, palpha); particle_new (pt_grav, part_tex_smoke[rand () & 7], porg, pscale, pvel,
r_realtime + 2.0, 68 + (rand () & 3), 255);
pscale = pscalenext; pscale = pscalenext;
} }
} }
void
R_SlightBloodParticles (entity_t *ent)
{
float dist, len, pscale, pscalenext;
int j;
vec3_t subtract, vec, porg, pvel;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
pscale = 1.5 + qfrandom (7.5);
while (len > 0) {
VectorCopy (vec3_origin, pvel);
VectorCopy (ent->old_origin, porg);
pscalenext = 1.5 + qfrandom (7.5);
dist = (pscale + pscalenext) * 1.5;
for (j = 0; j < 3; j++) {
pvel[j] = (qfrandom (6.0) - 3.0) * 2.0;
porg[j] = ent->old_origin[j] + qfrandom (3.0) - 1.5;
}
VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist;
particle_new (pt_grav, part_tex_smoke[rand () & 7], porg, pscale, pvel,
r_realtime + 1.5, 68 + (rand () & 3), 192);
pscale = pscalenext;
}
}
void
R_GreenParticles (entity_t *ent)
{
float dist, len;
static int tracercount;
vec3_t subtract, vec, pvel;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
dist = 3.0;
while (len > 0) {
VectorCopy (vec3_origin, pvel);
tracercount++;
if (tracercount & 1) {
pvel[0] = 30 * vec[1];
pvel[1] = 30 * -vec[0];
} else {
pvel[0] = 30 * -vec[1];
pvel[1] = 30 * vec[0];
}
VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist;
particle_new (pt_fire, part_tex_smoke[rand () & 7], ent->old_origin,
2.0 + qfrandom (1.0), pvel, r_realtime + 0.5,
52 + (rand () & 4), 255);
}
}
void
R_FlameParticles (entity_t *ent)
{
float dist, len;
static int tracercount;
vec3_t subtract, vec, pvel;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
dist = 3.0;
while (len > 0) {
VectorCopy (vec3_origin, pvel);
tracercount++;
if (tracercount & 1) {
pvel[0] = 30 * vec[1];
pvel[1] = 30 * -vec[0];
} else {
pvel[0] = 30 * -vec[1];
pvel[1] = 30 * vec[0];
}
VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist;
particle_new (pt_fire, part_tex_smoke[rand () & 7], ent->old_origin,
2.0 + qfrandom (1.0), pvel, r_realtime + 0.5, 234, 255);
}
}
void
R_VoorParticles (entity_t *ent)
{
float dist, len;
int j;
vec3_t subtract, vec, porg;
VectorSubtract (ent->origin, ent->old_origin, vec);
len = VectorNormalize (vec);
dist = 3.0;
while (len > 0) {
for (j = 0; j < 3; j++)
porg[j] = ent->old_origin[j] + qfrandom (16.0) - 8.0;
VectorScale (vec, min(dist, len), subtract);
VectorAdd (ent->old_origin, subtract, ent->old_origin);
len -= dist;
particle_new (pt_static, part_tex_dot, porg, 1.0 + qfrandom (1.0),
vec3_origin, r_realtime + 0.3,
9 * 16 + 8 + (rand () & 3), 255);
}
}
void
R_RocketTrail (int type, entity_t *ent)
{
if (!r_particles->int_val)
return;
switch (type) {
case 0: // rocket trail
R_RocketParticles (ent);
break;
case 1: // grenade trail
R_GrenadeParticles (ent);
break;
case 2: // blood
R_BloodParticles (ent);
break;
case 4: // slight blood
R_SlightBloodParticles (ent);
break;
case 3: // green tracer
R_GreenParticles (ent);
break;
case 5: // flame tracer
R_FlameParticles (ent);
break;
case 6: // voor trail
R_VoorParticles (ent);
break;
}
}
void void
R_DrawParticles (void) R_DrawParticles (void)
{ {