delink particle states on r_particlesystem change, correctly use default trails on models

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3822 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
TimeServ 2011-06-18 12:25:36 +00:00
parent 027c09bd6a
commit 9d4586b532
5 changed files with 35 additions and 7 deletions

View File

@ -1590,6 +1590,16 @@ static void CL_UpdateNetFrameLerpState(qboolean force, unsigned int curframe, le
}
}
void CL_ClearLerpEntsParticleState(void)
{
int i;
for (i = 0; i < cl.maxlerpents; i++)
{
pe->DelinkTrailstate(&(cl.lerpents[i].trailstate));
pe->DelinkTrailstate(&(cl.lerpents[i].emitstate));
}
}
void CL_LinkStaticEntities(void *pvs)
{
int i;
@ -2198,11 +2208,9 @@ void CL_LinkPacketEntities (void)
}
}
if (model->particletrail >= 0)
{
if (pe->ParticleTrail (old_origin, ent->origin, model->particletrail, &(le->trailstate)))
if (model->particletrail == P_INVALID || pe->ParticleTrail (old_origin, ent->origin, model->particletrail, &(le->trailstate)))
if (model->traildefaultindex >= 0)
pe->ParticleTrailIndex(old_origin, ent->origin, model->traildefaultindex, 0, &(le->trailstate));
}
{
extern cvar_t gl_part_flame;

View File

@ -346,6 +346,17 @@ void CL_ShutdownTEnts (void)
BZ_Free(ae);
}
}
void CL_ClearTEntParticleState (void)
{
int i;
for (i = 0; i < beams_running; i++)
{
pe->DelinkTrailstate(&(cl_beams[i].trailstate));
pe->DelinkTrailstate(&(cl_beams[i].emitstate));
}
}
void P_LoadedModel(model_t *mod)
{
struct associatedeffect *ae;

View File

@ -973,6 +973,7 @@ void DropPunchAngle (int pnum);
void CL_RegisterParticles(void);
void CL_InitTEnts (void);
void CL_ClearTEnts (void);
void CL_ClearTEntParticleState (void);
void CL_ClearCustomTEnts(void);
void CL_ParseCustomTEnt(void);
void CL_ParseEffect (qboolean effect2);
@ -1005,6 +1006,7 @@ void CL_LinkViewModel(void);
void CL_LinkPlayers (void);
void CL_LinkPacketEntities (void);
void CL_LinkProjectiles (void);
void CL_ClearLerpEntsParticleState (void);
qboolean CL_MayLerp(void);
//

View File

@ -4048,10 +4048,11 @@ void CSQC_EntStateToCSQC(unsigned int flags, float lerptime, entity_state_t *src
if (!(flags & RSES_NOTRAILS))
{
//use entnum as a test to see if its new (if the old origin isn't usable)
if (ent->xv->entnum && model->particletrail >= 0)
if (ent->xv->entnum)
{
if (pe->ParticleTrail (ent->v->origin, src->origin, model->particletrail, &(le->trailstate)))
pe->ParticleTrailIndex(ent->v->origin, src->origin, model->traildefaultindex, 0, &(le->trailstate));
if (model->particletrail == P_INVALID || pe->ParticleTrail (ent->v->origin, src->origin, model->particletrail, &(le->trailstate)))
if (model->traildefaultindex >= 0)
pe->ParticleTrailIndex(ent->v->origin, src->origin, model->traildefaultindex, 0, &(le->trailstate));
}
}

View File

@ -82,6 +82,9 @@ void R_ParticleSystem_Callback(struct cvar_s *var, char *oldvalue)
int i;
if (pe)
{
CL_ClearTEntParticleState();
CL_ClearLerpEntsParticleState();
pe->ShutdownParticles();
}
@ -444,5 +447,8 @@ void P_DefaultTrail (model_t *model)
model->traildefaultindex = 254;
}
else
{
model->particletrail = P_INVALID;
model->traildefaultindex = -1;
}
}