[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31723] trunk/blender/source/blender/ blenkernel: Fix for [#23298] Kill particle breaks when baking simulation

Janne Karhu jhkarh at gmail.com
Thu Sep 2 12:26:19 CEST 2010


Revision: 31723
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31723
Author:   jhk
Date:     2010-09-02 12:26:19 +0200 (Thu, 02 Sep 2010)

Log Message:
-----------
Fix for [#23298] Kill particle breaks when baking simulation
* Cached particle die times are now read from cached data

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/particle.c
    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	2010-09-02 09:11:40 UTC (rev 31722)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2010-09-02 10:26:19 UTC (rev 31723)
@@ -283,6 +283,8 @@
 void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
 void psys_mat_hair_to_orco(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
 
+float psys_get_dietime_from_cache(struct PointCache *cache, int index);
+
 void psys_free_pdd(struct ParticleSystem *psys);
 
 float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2010-09-02 09:11:40 UTC (rev 31722)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2010-09-02 10:26:19 UTC (rev 31723)
@@ -1121,6 +1121,24 @@
 
 	return ret == 2;
 }
+
+float psys_get_dietime_from_cache(PointCache *cache, int index) {
+	PTCacheMem *pm;
+	int dietime = 10000000; /* some max value so that we can default to pa->time+lifetime */
+
+	for(pm=cache->mem_cache.last; pm; pm=pm->prev) {
+		if(pm->index_array) {
+			if(pm->index_array[index])
+				return (float)pm->frame;
+		}
+		else {
+			return (float)pm->frame;
+		}
+	}
+
+	return (float)dietime;
+}
+
 static void init_particle_interpolation(Object *ob, ParticleSystem *psys, ParticleData *pa, ParticleInterpolationData *pind)
 {
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2010-09-02 09:11:40 UTC (rev 31722)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2010-09-02 10:26:19 UTC (rev 31723)
@@ -1983,6 +1983,12 @@
 
 	pa->dietime = pa->time + pa->lifetime;
 
+	if(sim->psys->pointcache && sim->psys->pointcache->flag & PTCACHE_BAKED &&
+		sim->psys->pointcache->mem_cache.first) {
+		float dietime = psys_get_dietime_from_cache(sim->psys->pointcache, p);
+		pa->dietime = MIN2(pa->dietime, dietime);
+	}
+
 	if(pa->time > cfra)
 		pa->alive = PARS_UNBORN;
 	else if(pa->dietime <= cfra)





More information about the Bf-blender-cvs mailing list