[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16590] trunk/blender/source/blender/ blenkernel: Hopefully fixes crash in particle system with effector enabled
Daniel Genrich
daniel.genrich at gmx.net
Thu Sep 18 03:55:44 CEST 2008
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){
More information about the Bf-blender-cvs
mailing list