Revision: 16590 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16590 Author: genscher Date: 2008-09-18 03:55:43 +0200 (Thu, 18 Sep 2008)
Log Message: ----------- Hopefully fixes crash in particle system with effector enabled Modified Paths: -------------- trunk/blender/source/blender/blenkernel/BKE_particle.h trunk/blender/source/blender/blenkernel/intern/particle_system.c Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h =================================================================== --- trunk/blender/source/blender/blenkernel/BKE_particle.h 2008-09-18 01:46:28 UTC (rev 16589) +++ trunk/blender/source/blender/blenkernel/BKE_particle.h 2008-09-18 01:55:43 UTC (rev 16590) @@ -73,6 +73,7 @@ short type, psys_nbr; struct Object obcopy; /* for restoring transformation data */ + struct RNG *rng; /* random noise generator for e.g. wind */ } ParticleEffectorCache; typedef struct ParticleReactEvent { Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/particle_system.c 2008-09-18 01:46:28 UTC (rev 16589) +++ trunk/blender/source/blender/blenkernel/intern/particle_system.c 2008-09-18 01:55:43 UTC (rev 16590) @@ -2317,12 +2317,6 @@ else if(pd->forcefield) { type |= PSYS_EC_EFFECTOR; - - if(pd->forcefield == PFIELD_WIND) - { - pd->rng = rng_new(1); - rng_srandom(pd->rng, (unsigned int)(ceil(PIL_check_seconds_timer()))); // use better seed - } } } @@ -2335,6 +2329,14 @@ ec->type=type; ec->distances=0; ec->locations=0; + ec->rng = NULL; + + if(pd && pd->forcefield == PFIELD_WIND) + { + ec->rng = rng_new(1); + rng_srandom(ec->rng, (unsigned int)(ceil(PIL_check_seconds_timer()))); // use better seed + } + BLI_addtail(lb, ec); } @@ -2353,7 +2355,9 @@ if((epsys->part->pd && epsys->part->pd->forcefield) || (epsys->part->pd2 && epsys->part->pd2->forcefield)) + { type=PSYS_EC_PARTICLE; + } if(epart->type==PART_REACTOR) { tob=epsys->target_ob; @@ -2368,6 +2372,14 @@ ec->ob= ob; ec->type=type; ec->psys_nbr=i; + ec->rng = NULL; + + if(pd && pd->forcefield == PFIELD_WIND) + { + ec->rng = rng_new(1); + rng_srandom(ec->rng, (unsigned int)(ceil(PIL_check_seconds_timer()))); // use better seed + } + BLI_addtail(lb, ec); } } @@ -2417,6 +2429,9 @@ void psys_end_effectors(ParticleSystem *psys) { + /* NOTE: + ec->ob is not valid in here anymore! - dg + */ ListBase *lb=&psys->effectors; if(lb->first) { ParticleEffectorCache *ec; @@ -2436,8 +2451,9 @@ if(ec->tree) BLI_kdtree_free(ec->tree); - if(ec->ob->pd && (ec->ob->pd->forcefield == PFIELD_WIND)) - rng_free(ec->ob->pd->rng); + if(ec->rng) + rng_free(ec->rng); + } BLI_freelistN(lb); @@ -2572,7 +2588,7 @@ } else { do_physical_effector(eob, state->co, pd->forcefield,pd->f_strength,distance, falloff,0.0,pd->f_damp,eob->obmat[2],vec_to_part, - pa->state.vel,force_field,pd->flag&PFIELD_PLANAR,pd->rng,pd->f_noise,charge,pa->size); + pa->state.vel,force_field,pd->flag&PFIELD_PLANAR,ec->rng,pd->f_noise,charge,pa->size); } } if(ec->type & PSYS_EC_PARTICLE){ @@ -2616,7 +2632,7 @@ else do_physical_effector(eob, state->co, pd->forcefield,pd->f_strength,distance, falloff,epart->size,pd->f_damp,estate.vel,vec_to_part, - state->vel,force_field,0, pd->rng, pd->f_noise,charge,pa->size); + state->vel,force_field,0, ec->rng, pd->f_noise,charge,pa->size); } } else if(pd && pd->forcefield==PFIELD_HARMONIC && cfra-framestep <= epa->dietime && cfra>epa->dietime){ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs