[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