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

Reply via email to