[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