[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25559] trunk/blender/source/blender: Fix for [#20458] Segmentation fault when trying to enable Hair dynamics

Janne Karhu jhkarh at utu.fi
Sat Dec 26 00:51:29 CET 2009


Revision: 25559
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25559
Author:   jhk
Date:     2009-12-26 00:51:29 +0100 (Sat, 26 Dec 2009)

Log Message:
-----------
Fix for [#20458] Segmentation fault when trying to enable Hair dynamics
* The hair mesh vertex index was stored as a short, but vertex counts can easily go higher than what fits in a short so changed this to an int.
* Also removed particle life looping, which didn't work correctly anyways. Similar functionality will become available when I get to recoding reactor particles into a better system.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/makesrna/intern/rna_particle.c

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2009-12-25 23:50:35 UTC (rev 25558)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2009-12-25 23:51:29 UTC (rev 25559)
@@ -4069,7 +4069,7 @@
 	else{
 		if(cpa){
 			ParticleKey *key1;
-			float t = (cfra - pa->time + pa->loop * pa->lifetime) / pa->lifetime;
+			float t = (cfra - pa->time) / pa->lifetime;
 
 			key1=&pa->state;
 			offset_child(cpa, key1, state, part->childflat, part->childrad);

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2009-12-25 23:50:35 UTC (rev 25558)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2009-12-25 23:51:29 UTC (rev 25559)
@@ -389,7 +389,7 @@
 				pa->fuv[1]=min[1]+(float)j*d;
 				pa->fuv[2]=min[2]+(float)k*d;
 				pa->flag |= PARS_UNEXIST;
-				pa->loop=0; /* abused in volume calculation */
+				pa->hair_index=0; /* abused in volume calculation */
 			}
 		}
 	}
@@ -451,7 +451,7 @@
 							if(from==PART_FROM_FACE)
 								(pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
 							else /* store number of intersections */
-								(pa+(int)(lambda*size[a])*a0mul)->loop++;
+								(pa+(int)(lambda*size[a])*a0mul)->hair_index++;
 						}
 						
 						if(mface->v4){
@@ -461,20 +461,20 @@
 								if(from==PART_FROM_FACE)
 									(pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
 								else
-									(pa+(int)(lambda*size[a])*a0mul)->loop++;
+									(pa+(int)(lambda*size[a])*a0mul)->hair_index++;
 							}
 						}
 					}
 
 					if(from==PART_FROM_VOLUME){
-						int in=pa->loop%2;
-						if(in) pa->loop++;
+						int in=pa->hair_index%2;
+						if(in) pa->hair_index++;
 						for(i=0; i<size[0]; i++){
-							if(in || (pa+i*a0mul)->loop%2)
+							if(in || (pa+i*a0mul)->hair_index%2)
 								(pa+i*a0mul)->flag &= ~PARS_UNEXIST;
 							/* odd intersections == in->out / out->in */
 							/* even intersections -> in stays same */
-							in=(in + (pa+i*a0mul)->loop) % 2;
+							in=(in + (pa+i*a0mul)->hair_index) % 2;
 						}
 					}
 				}
@@ -1584,7 +1584,7 @@
 			pa->flag &= ~PARS_UNEXIST;
 	}
 
-	pa->loop=0;
+	pa->hair_index=0;
 	/* we can't reset to -1 anymore since we've figured out correct index in distribute_particles */
 	/* usage other than straight after distribute has to handle this index by itself - jahka*/
 	//pa->num_dmcache = DMCACHE_NOTFOUND; /* assume we dont have a derived mesh face */
@@ -3215,14 +3215,6 @@
 				pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
 
 			reset_particle(sim, pa, dtime, cfra);
-
-			if(cfra > pa->time && part->flag & PART_LOOP && part->type!=PART_HAIR){
-				pa->loop = (short)((cfra-pa->time)/pa->lifetime);
-				pa->alive = PARS_UNBORN;
-			}
-			else{
-				pa->loop = 0;
-			}
 		}
 
 		if(vg_size)
@@ -3276,7 +3268,7 @@
 			//if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0)
 			//	react_to_events(psys,p);
 
-			birthtime = pa->time + pa->loop * pa->lifetime;
+			birthtime = pa->time;
 			dietime = birthtime + pa->lifetime;
 
 			pa_dfra = dfra;
@@ -3335,15 +3327,8 @@
 				if(pa->alive == PARS_DYING){
 					//push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state);
 
-					if(part->flag & PART_LOOP && part->type!=PART_HAIR){
-						pa->loop++;
-						reset_particle(sim, pa, 0.0, cfra);
-						pa->alive=PARS_ALIVE;
-					}
-					else{
-						pa->alive=PARS_DEAD;
-						pa->state.time=pa->dietime;
-					}
+					pa->alive=PARS_DEAD;
+					pa->state.time=pa->dietime;
 				}
 				else
 					pa->state.time=cfra;
@@ -3394,14 +3379,9 @@
 
 		psys->lattice= psys_get_lattice(sim);
 
-		if(part->flag & PART_LOOP && part->type!=PART_HAIR)
-			pa->loop = (short)((cfra - pa->time) / pa->lifetime);
-		else
-			pa->loop = 0;
+		birthtime = pa->time;
+		dietime = pa->dietime;
 
-		birthtime = pa->time + pa->loop * pa->lifetime;
-		dietime = birthtime + (1 + pa->loop) * (pa->dietime - pa->time);
-
 		/* update alive status and push events */
 		if(pa->time > cfra) {
 			pa->alive = PARS_UNBORN;

Modified: trunk/blender/source/blender/makesdna/DNA_particle_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_particle_types.h	2009-12-25 23:50:35 UTC (rev 25558)
+++ trunk/blender/source/blender/makesdna/DNA_particle_types.h	2009-12-25 23:51:29 UTC (rev 25559)
@@ -109,10 +109,9 @@
 
 	float size;				/* size and multiplier so that we can update size when ever */
 
+	int hair_index;
 	short flag;
 	short alive;			/* the life state of a particle */
-	short loop;				/* how many times particle life has looped */
-	short hair_index;
 } ParticleData;
 
 typedef struct ParticleSettings {
@@ -261,7 +260,7 @@
 #define PART_REACT_STA_END	1
 #define PART_REACT_MULTIPLE	2
 
-#define PART_LOOP			4
+//#define PART_LOOP			4	/* not used anymore */
 		/* for dopesheet */
 #define PART_DS_EXPAND		8
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_particle.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_particle.c	2009-12-25 23:50:35 UTC (rev 25558)
+++ trunk/blender/source/blender/makesrna/intern/rna_particle.c	2009-12-25 23:51:29 UTC (rev 25559)
@@ -814,11 +814,6 @@
 	RNA_def_property_enum_items(prop, alive_items);
 	RNA_def_property_ui_text(prop, "Alive State", "");
 
-	prop= RNA_def_property(srna, "loop", PROP_INT, PROP_NONE);
-	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-	//TODO: bounds
-	RNA_def_property_ui_text(prop, "Loop", "How may times the particle life has looped");
-
 //	short rt2;
 }
 
@@ -978,12 +973,6 @@
 	RNA_def_property_ui_text(prop, "Multi React", "React multiple times.");
 	RNA_def_property_update(prop, 0, "rna_Particle_reset");
 
-	prop= RNA_def_property(srna, "loop", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_LOOP);
-	RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE);
-	RNA_def_property_ui_text(prop, "Loop", "Loop particle lives.");
-	RNA_def_property_update(prop, 0, "rna_Particle_reset");
-
 	/* TODO: used somewhere? */
 	prop= RNA_def_property(srna, "hair_geometry", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_GEOMETRY);





More information about the Bf-blender-cvs mailing list