Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanne Karhu <jhkarh@gmail.com>2008-04-01 04:40:28 +0400
committerJanne Karhu <jhkarh@gmail.com>2008-04-01 04:40:28 +0400
commit3932c747d62217689c126c9b1a6a50bb208b182a (patch)
tree71f4dadd8c5462762bce6bbca21ccd23b52265f6 /source/blender/blenkernel
parentc10ba357ca68ff264b69ba6fa5a9b322fb31c66a (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.c32
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)