[Bf-blender-cvs] [5fb18b1] gooseberry: Avoid clearing the record of cached frames when doing particle trails.

Lukas Tönne noreply at git.blender.org
Fri Mar 27 14:57:04 CET 2015


Commit: 5fb18b1e00f091f74923e8f2de9a88a7887c4b49
Author: Lukas Tönne
Date:   Fri Mar 27 14:55:25 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB5fb18b1e00f091f74923e8f2de9a88a7887c4b49

Avoid clearing the record of cached frames when doing particle trails.

This is implemented badly: when using disk caches i reads the *entire*
cache from the disk to create the trail. In the process it also clears
the cached_frames array, which makes it look like the cache was deleted.

===================================================================

M	source/blender/blenkernel/BKE_pointcache.h
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/blenkernel/intern/pointcache.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index e18e9d4..36a0fe5 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -314,10 +314,10 @@ void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
 void BKE_ptcache_bake(struct PTCacheBaker *baker);
 
 /* Convert disk cache to memory cache. */
-void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
+void BKE_ptcache_disk_to_mem(struct PTCacheID *pid, bool clear);
 
 /* Convert memory cache to disk cache. */
-void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
+void BKE_ptcache_mem_to_disk(struct PTCacheID *pid, bool clear);
 
 /* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
 void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 240ece0..b32498b 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -1178,7 +1178,7 @@ void psys_make_temp_pointcache(Object *ob, ParticleSystem *psys)
 		PTCacheID pid;
 		BKE_ptcache_id_from_particles(&pid, ob, psys);
 		cache->flag &= ~PTCACHE_DISK_CACHE;
-		BKE_ptcache_disk_to_mem(&pid);
+		BKE_ptcache_disk_to_mem(&pid, false);
 		cache->flag |= PTCACHE_DISK_CACHE;
 	}
 }
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index c477aab..f714bbf 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -3412,21 +3412,24 @@ void BKE_ptcache_bake(PTCacheBaker *baker)
 	/* TODO: call redraw all windows somehow */
 }
 /* Helpers */
-void BKE_ptcache_disk_to_mem(PTCacheID *pid)
+void BKE_ptcache_disk_to_mem(PTCacheID *pid, bool clear)
 {
 	PointCache *cache = pid->cache;
 	PTCacheMem *pm = NULL;
-	int baked = cache->flag & PTCACHE_BAKED;
 	int cfra, sfra = cache->startframe, efra = cache->endframe;
 
-	/* Remove possible bake flag to allow clear */
-	cache->flag &= ~PTCACHE_BAKED;
-
-	/* PTCACHE_DISK_CACHE flag was cleared already */
-	BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
-
-	/* restore possible bake flag */
-	cache->flag |= baked;
+	if (clear) {
+		int baked = cache->flag & PTCACHE_BAKED;
+		
+		/* Remove possible bake flag to allow clear */
+		cache->flag &= ~PTCACHE_BAKED;
+		
+		/* PTCACHE_DISK_CACHE flag was cleared already */
+		BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+		
+		/* restore possible bake flag */
+		cache->flag |= baked;
+	}
 
 	for (cfra=sfra; cfra <= efra; cfra++) {
 		pm = ptcache_disk_frame_to_mem(pid, cfra);
@@ -3435,20 +3438,23 @@ void BKE_ptcache_disk_to_mem(PTCacheID *pid)
 			BLI_addtail(&pid->cache->mem_cache, pm);
 	}
 }
-void BKE_ptcache_mem_to_disk(PTCacheID *pid)
+void BKE_ptcache_mem_to_disk(PTCacheID *pid, bool clear)
 {
 	PointCache *cache = pid->cache;
 	PTCacheMem *pm = cache->mem_cache.first;
-	int baked = cache->flag & PTCACHE_BAKED;
 
-	/* Remove possible bake flag to allow clear */
-	cache->flag &= ~PTCACHE_BAKED;
-
-	/* PTCACHE_DISK_CACHE flag was set already */
-	BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
-
-	/* restore possible bake flag */
-	cache->flag |= baked;
+	if (clear) {
+		int baked = cache->flag & PTCACHE_BAKED;
+		
+		/* Remove possible bake flag to allow clear */
+		cache->flag &= ~PTCACHE_BAKED;
+		
+		/* PTCACHE_DISK_CACHE flag was set already */
+		BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+		
+		/* restore possible bake flag */
+		cache->flag |= baked;
+	}
 
 	for (; pm; pm=pm->next) {
 		if (ptcache_mem_frame_to_disk(pid, pm)==0) {
@@ -3479,9 +3485,9 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
 	}
 
 	if (cache->flag & PTCACHE_DISK_CACHE)
-		BKE_ptcache_mem_to_disk(pid);
+		BKE_ptcache_mem_to_disk(pid, true);
 	else
-		BKE_ptcache_disk_to_mem(pid);
+		BKE_ptcache_disk_to_mem(pid, true);
 
 	cache->flag ^= PTCACHE_DISK_CACHE;
 	BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);




More information about the Bf-blender-cvs mailing list