diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index 25705fe6a..9f8fb3d29 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -231,10 +231,30 @@ static void PClassic_ShutdownParticles(void) particles = NULL; } +// a classic trailstate is really just a float stored in a pointer variable... +// assuming float alignment/size is more strict than pointer +static float Classic_GetLeftover(trailstate_t **tsk) +{ + float *f = (float *)tsk; + + if (!f) + return 0; + + return *f; +} + +static void Classic_SetLeftover(trailstate_t **tsk, float leftover) +{ + float *f = (float *)tsk; + + if (f) + *f = leftover; +} + //called when an entity is removed from the world, taking its trailstate with it. static void PClassic_DelinkTrailstate(trailstate_t **tsk) { - //classic has no concept of trail states. + *tsk = NULL; } //wipes all the particles ready for the next map. @@ -599,10 +619,10 @@ static void Classic_TeleportSplash (vec3_t org) } } -static void Classic_ParticleTrail (vec3_t start, vec3_t end, vec3_t *trail_origin, effect_type_t type) +static float Classic_ParticleTrail (vec3_t start, vec3_t end, float leftover, effect_type_t type) { vec3_t point, delta, dir; - float len; + float len, rlen, scale; int i, j, num_particles; cparticle_t *p; static int tracercount; @@ -613,16 +633,22 @@ static void Classic_ParticleTrail (vec3_t start, vec3_t end, vec3_t *trail_origi goto done; VectorScale(delta, 1 / len, dir); //unit vector in direction of trail + len += leftover; + rlen = len; + switch (type) { case ALT_ROCKET_TRAIL: - len /= 1.5; break; + scale = 1.5; break; case BLOOD_TRAIL: - len /= 6; break; + scale = 6; break; default: - len /= 3; break; + scale = 3; break; } + len /= scale; + leftover = rlen - ((int)(len) * scale); + if (!(num_particles = (int) len)) goto done; @@ -708,8 +734,7 @@ static void Classic_ParticleTrail (vec3_t start, vec3_t end, vec3_t *trail_origi VectorAdd (point, delta, point); } done: - if (trail_origin) - VectorCopy(point, *trail_origin); + return leftover; } @@ -717,10 +742,13 @@ done: //builds a trail from here to there. The trail state can be used to remember how far you got last frame. static int PClassic_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailstate_t **tsk) { + float leftover; + if (type == P_INVALID) return 1; - Classic_ParticleTrail(startpos, end, NULL, type); + leftover = Classic_ParticleTrail(startpos, end, Classic_GetLeftover(tsk), type); + Classic_SetLeftover(tsk, leftover); return 0; } diff --git a/engine/client/p_null.c b/engine/client/p_null.c index 79fcd8260..c657f219f 100644 --- a/engine/client/p_null.c +++ b/engine/client/p_null.c @@ -40,7 +40,10 @@ static void PNULL_ShutdownParticles(void) { } -static void PNULL_DelinkTrailstate(trailstate_t **tsk){} +static void PNULL_DelinkTrailstate(trailstate_t **tsk) +{ + *tsk = NULL; +} static void PNULL_ClearParticles (void){} static void PNULL_DrawParticles(void) { diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 387a6f7ce..d66235ebc 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -2328,7 +2328,7 @@ static int PScript_RunParticleEffectState (vec3_t org, vec3_t dir, float count, trailstate_t *ts; if (typenum >= FALLBACKBIAS && fallback) - return fallback->RunParticleEffectState(org, dir, count, typenum-FALLBACKBIAS, tsk); + return fallback->RunParticleEffectState(org, dir, count, typenum-FALLBACKBIAS, NULL); if (typenum < 0 || typenum >= numparticletypes) return 1; @@ -3613,8 +3613,10 @@ static int PScript_ParticleTrail (vec3_t startpos, vec3_t end, int type, trailst { part_type_t *ptype = &part_type[type]; + // TODO: fallback particle system won't have a decent trailstate which will mess up + // high fps trails if (type >= FALLBACKBIAS && fallback) - return fallback->ParticleTrail(startpos, end, type-FALLBACKBIAS, tsk); + return fallback->ParticleTrail(startpos, end, type-FALLBACKBIAS, NULL); if (type < 0 || type >= numparticletypes) return 1; //bad value diff --git a/engine/client/r_part.c b/engine/client/r_part.c index b2842262b..70bbd5a51 100644 --- a/engine/client/r_part.c +++ b/engine/client/r_part.c @@ -346,7 +346,7 @@ void P_SelectableTrail(model_t *model, cvar_t *selection, int mdleffect, int mdl model->traildefaultindex = 154; break; case 9: // rail trail - model->particletrail = P_FindParticleType("TR_RAILTRAIL"); + model->particletrail = P_FindParticleType("TE_RAILTRAIL"); model->traildefaultindex = 15; break; } @@ -393,57 +393,57 @@ void P_DefaultTrail (model_t *model) } else if (model->flags & EFH2_BLOODSHOT) //these are the hexen2 ones. { - model->particletrail = P_FindParticleType("t_bloodshot"); + model->particletrail = P_FindParticleType("tr_bloodshot"); model->traildefaultindex = 136; } else if (model->flags & EFH2_FIREBALL) { - model->particletrail = P_FindParticleType("t_fireball"); + model->particletrail = P_FindParticleType("tr_fireball"); model->traildefaultindex = 424; } else if (model->flags & EFH2_ACIDBALL) { - model->particletrail = P_FindParticleType("t_acidball"); + model->particletrail = P_FindParticleType("tr_acidball"); model->traildefaultindex = 440; } else if (model->flags & EFH2_ICE) { - model->particletrail = P_FindParticleType("t_ice"); + model->particletrail = P_FindParticleType("tr_ice"); model->traildefaultindex = 408; } else if (model->flags & EFH2_SPIT) { - model->particletrail = P_FindParticleType("t_spit"); + model->particletrail = P_FindParticleType("tr_spit"); model->traildefaultindex = 260; } else if (model->flags & EFH2_SPELL) { - model->particletrail = P_FindParticleType("t_spell"); + model->particletrail = P_FindParticleType("tr_spell"); model->traildefaultindex = 260; } else if (model->flags & EFH2_VORP_MISSILE) { - model->particletrail = P_FindParticleType("t_vorpmissile"); + model->particletrail = P_FindParticleType("tr_vorpmissile"); model->traildefaultindex = 302; } else if (model->flags & EFH2_SET_STAFF) { - model->particletrail = P_FindParticleType("t_setstaff"); + model->particletrail = P_FindParticleType("tr_setstaff"); model->traildefaultindex = 424; } else if (model->flags & EFH2_MAGICMISSILE) { - model->particletrail = P_FindParticleType("t_magicmissile"); + model->particletrail = P_FindParticleType("tr_magicmissile"); model->traildefaultindex = 149; } else if (model->flags & EFH2_BONESHARD) { - model->particletrail = P_FindParticleType("t_boneshard"); + model->particletrail = P_FindParticleType("tr_boneshard"); model->traildefaultindex = 384; } else if (model->flags & EFH2_SCARAB) { - model->particletrail = P_FindParticleType("t_scarab"); + model->particletrail = P_FindParticleType("tr_scarab"); model->traildefaultindex = 254; } else diff --git a/engine/client/r_partset.c b/engine/client/r_partset.c index 9e25a2241..494ede8f6 100644 --- a/engine/client/r_partset.c +++ b/engine/client/r_partset.c @@ -47,7 +47,7 @@ char *particle_set_spikeset = "spawnvel 10\n" "}\n" -"r_part t_rocket\n" +"r_part tr_rocket\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 97 97 191 191 256\n" @@ -78,7 +78,7 @@ char *particle_set_spikeset = "cliptype rockettail\n" "}\n" -"r_part t_altrocket\n" +"r_part tr_altrocket\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 97 97 191 191 256\n" @@ -188,7 +188,7 @@ char *particle_set_spikeset = "rgb 150 150 150\n" "}\n" -"r_part t_grenade\n" +"r_part tr_grenade\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 97 97 191 191 256\n" @@ -207,7 +207,7 @@ char *particle_set_spikeset = "}\n" //cool's blood trails (cos they're cooler) -"r_part t_gib\n" +"r_part tr_gib\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 1 1 63 63 256 2 64\n" @@ -226,7 +226,7 @@ char *particle_set_spikeset = "stains 5\n" "}\n" -"r_part t_zomgib\n" +"r_part tr_slightblood\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 1 1 63 63 256 2 64\n" @@ -245,7 +245,7 @@ char *particle_set_spikeset = "stains 5\n" "}\n" -"r_part t_tracer\n" +"r_part tr_wizspike\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 1 97 95 191 256\n" @@ -260,7 +260,7 @@ char *particle_set_spikeset = "scalefactor 0.825\n" "}\n" -"r_part t_tracer2\n" +"r_part tr_knightspike\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 1 97 95 191 256\n" @@ -275,7 +275,7 @@ char *particle_set_spikeset = "scalefactor 0.825\n" "}\n" -"r_part t_tracer3\n" +"r_part tr_vorespike\n" "{\n" "texture \"particles/fteparticlefont.tga\"\n" "tcoords 1 97 95 191 256\n" @@ -727,7 +727,7 @@ char *particle_set_spikeset = char *particle_set_faithful = // faithful, by TimeServ -"r_part t_gib\n" +"r_part tr_gib\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -742,7 +742,7 @@ char *particle_set_faithful = "stains 1\n" "}\n" -"r_part t_zomgib\n" +"r_part tr_slightblood\n" "{\n" "texture \"particles/quake\"\n" "step 6\n" @@ -757,7 +757,7 @@ char *particle_set_faithful = "stains 1\n" "}\n" -"r_part t_tracer3\n" +"r_part tr_vorespike\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -768,7 +768,7 @@ char *particle_set_faithful = "spawnorg 8\n" "}\n" -"r_part t_tracer\n" +"r_part tr_wizspike\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -781,7 +781,7 @@ char *particle_set_faithful = "spawnmode tracer\n" "}\n" -"r_part t_tracer2\n" +"r_part tr_knightspike\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -794,7 +794,7 @@ char *particle_set_faithful = "spawnmode tracer\n" "}\n" -"r_part t_rocket\n" +"r_part tr_rocket\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -812,7 +812,7 @@ char *particle_set_faithful = "gravity -40\n" "}\n" -"r_part t_altrocket\n" +"r_part tr_altrocket\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -825,7 +825,7 @@ char *particle_set_faithful = "gravity -40\n" "}\n" -"r_part t_grenade\n" +"r_part tr_grenade\n" "{\n" "texture \"particles/quake\"\n" "step 3\n" @@ -1031,7 +1031,7 @@ char *particle_set_faithful = char *particle_set_highfps = // highfps, originally submitted by 'ShadowWalker' // rehashed by TimeServ -"r_part t_gib\n" +"r_part tr_gib\n" "{\n" "texture \"particles/bloodtrail\"\n" "step 12\n" @@ -1042,7 +1042,7 @@ char *particle_set_highfps = "rgb 64 0 0\n" "rgbdelta -128 0 0\n" "}\n" -"r_part t_zomgib\n" +"r_part tr_slightblood\n" "{\n" "texture \"particles/bloodtrail\"\n" "step 16\n" @@ -1054,7 +1054,7 @@ char *particle_set_highfps = "rgbdelta -128 0 0\n" "}\n" -"r_part t_tracer\n" +"r_part tr_wizspike\n" "{\n" "texture \"particles/tracer\"\n" "scale 23\n" @@ -1063,7 +1063,7 @@ char *particle_set_highfps = "die 0.5\n" "}\n" -"r_part t_tracer2\n" +"r_part tr_knightspike\n" "{\n" "texture \"particles/tracer\"\n" "scale 23\n" @@ -1072,7 +1072,7 @@ char *particle_set_highfps = "rgb 192 96 0\n" "}\n" -"r_part t_tracer3\n" +"r_part tr_vorespike\n" "{\n" "texture \"particles/tracer\"\n" "scale 23\n" @@ -1212,7 +1212,7 @@ char *particle_set_highfps = "spawnvel 25 4\n" "}\n" -"r_part t_grenade\n" +"r_part tr_grenade\n" "{\n" "texture \"particles/smoke\"\n" "step 20\n" @@ -1222,7 +1222,7 @@ char *particle_set_highfps = "rgb 128 128 128\n" "}\n" -"r_part t_rocket\n" +"r_part tr_rocket\n" "{\n" "texture \"particles/rocket\"\n" "step 15\n" @@ -1233,7 +1233,7 @@ char *particle_set_highfps = "assoc t_grenade\n" "}\n" -"r_part t_altrocket\n" +"r_part tr_altrocket\n" "{\n" "texture \"particles/rocket\"\n" "step 15\n"