diff options
author | Janne Karhu <jhkarh@gmail.com> | 2008-04-01 04:40:28 +0400 |
---|---|---|
committer | Janne Karhu <jhkarh@gmail.com> | 2008-04-01 04:40:28 +0400 |
commit | 3932c747d62217689c126c9b1a6a50bb208b182a (patch) | |
tree | 71f4dadd8c5462762bce6bbca21ccd23b52265f6 /source/blender/blenkernel | |
parent | c10ba357ca68ff264b69ba6fa5a9b322fb31c66a (diff) |
Fix for bug: [#8810] Sticky button in particle effector menu creates unexpected effect
-Particle dietime was calculated wrong when a collision killed particles before their natural death
-Collision code still had some issues with object vs. global space
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 0a1f66f75ad..ec740dcd8a0 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3117,7 +3117,6 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part ParticleKey cstate; float imat[4][4]; float co1[3],co2[3],def_loc[3],def_nor[3],unit_nor[3],def_tan[3],dvec[3],def_vel[3],dave[3],dvel[3]; - float t_co1[3]={0.0,0.0,0.0},t_co2[3]={0.0,0.0,0.0}; float pa_minmax[6]; float min_w[4], zerovec[3]={0.0,0.0,0.0}, ipoint[3]; float min_d,dotprod,damp,frict,o_len,d_len,radius=-1.0f; @@ -3156,9 +3155,6 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part if(ec->vert_cos==0){ /* convert particle coordinates to object coordinates */ Mat4Invert(imat,ob->obmat); - - VECCOPY(t_co1,co1); - VECCOPY(t_co2,co2); Mat4MulVecfl(imat,co1); Mat4MulVecfl(imat,co2); } @@ -3177,20 +3173,17 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part radius=pa->size; } - if(ec->face_minmax==0 || AabbIntersectAabb(pa_minmax,pa_minmax+3,ec->ob_minmax,ec->ob_minmax+3)) + if(ec->face_minmax==0 || AabbIntersectAabb(pa_minmax,pa_minmax+3,ec->ob_minmax,ec->ob_minmax+3)) { if(psys_intersect_dm(ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w, ec->face_minmax,pa_minmax,radius,ipoint)){ + min_ob=ob; + if(ec->vert_cos) global=1; else global=0; } - - if(global==1){ - /* get global coordinates back */ - VECCOPY(co1,t_co1); - VECCOPY(co2,t_co2); } } } @@ -3215,7 +3208,6 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part mface+=min_face; mvert=dm->getVertDataArray(dm,CD_MVERT); - /* permeability check */ if(BLI_frand()<ob->pd->pdef_perm) through=1; @@ -3224,10 +3216,7 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part if(through==0 && (part->flag & PART_DIE_ON_COL || ob->pd->flag & PDEFLE_KILL_PART)){ pa->dietime = cfra-(1.0f-min_d)*dfra; - VecLerpf(def_loc,co1,co2,min_d); - - if(global==0) - Mat4MulVecfl(ob->obmat,def_loc); + VecLerpf(def_loc,def_loc,state->co,min_d); VECCOPY(state->co,def_loc); VecLerpf(state->vel,pa->state.vel,state->vel,min_d); @@ -3245,10 +3234,19 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part if(part->flag & PART_STICKY){ pa->stick_ob=ob; pa->flag |= PARS_STICKY; - //stick_particle_to_object(ob,pa,state); } } else{ + VECCOPY(co1,def_loc); + VECCOPY(co2,state->co); + + if(global==0){ + /* convert particle coordinates to object coordinates */ + Mat4Invert(imat,ob->obmat); + Mat4MulVecfl(imat,co1); + Mat4MulVecfl(imat,co2); + } + VecLerpf(def_loc,co1,co2,min_d); if(radius>0.0f){ @@ -4380,7 +4378,7 @@ static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSy pa->loop = 0; birthtime = pa->time + pa->loop * pa->lifetime; - dietime = birthtime + pa->lifetime; + dietime = birthtime + (1 + pa->loop) * (pa->dietime - pa->time); /* update alive status and push events */ if(pa->time > cfra) |