Fix T35328: Disk caches of multiple particle systems on a single object overwrite...
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 5 Feb 2014 17:46:10 +0000 (23:46 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 5 Feb 2014 17:46:10 +0000 (23:46 +0600)
It was intended to work actually using particle cache's stack index
but this index might have been calculated incorrect in special case:

* With default cube scene, add particle system to the cube
* Add disk cache to the particle system
* Save file and reload it
* Add another particle system and enable disk cache

This would lead to two point caches with the same stack index of zero.
This happened because point cache indices list wasn't stored in the
.blend file so once you've reload your file blender doesn't know anything
about number or point caches used.

And what was even more confusing is that point cache indices list was
trying to be load from the file, but this failed because it wasn't in the
file.

This commit solves the root of the issue which is ability of producing
.blend file with two point caches using the same disk cache. This is
done by making it sure that point cache indices list is stored in the
.blend file. And also made it so disabling disk cache will tag it to
recalculate stack index.

Old broken files wouldn't magically start working, but fixing them is
rather simple manually by toggling Disk Cache option.

Reviewers: lukastoenne, brecht

CC: sergof
Differential Revision: https://developer.blender.org/D286

source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/pointcache.c
source/blender/blenloader/intern/writefile.c

index f9a3f19df96ae876f98ec9b25f5e8037b47ccb9b..72c4c21d587d4a2515a3b12413ecc3b104dfae0c 100644 (file)
@@ -173,7 +173,7 @@ void BKE_object_sculpt_modifiers_changed(struct Object *ob);
 int BKE_object_obdata_texspace_get(struct Object *ob, short **r_texflag, float **r_loc, float **r_size, float **r_rot);
 
 int BKE_object_insert_ptcache(struct Object *ob);
 int BKE_object_obdata_texspace_get(struct Object *ob, short **r_texflag, float **r_loc, float **r_size, float **r_rot);
 
 int BKE_object_insert_ptcache(struct Object *ob);
-// void object_delete_ptcache(struct Object *ob, int index);
+void BKE_object_delete_ptcache(struct Object *ob, int index);
 struct KeyBlock *BKE_object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, const bool from_mix);
 
 bool BKE_object_is_child_recursive(struct Object *ob_parent, struct Object *ob_child);
 struct KeyBlock *BKE_object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, const bool from_mix);
 
 bool BKE_object_is_child_recursive(struct Object *ob_parent, struct Object *ob_child);
index 3d08ec22acb4c38185d10a31b4c48ea2704689e4..05365a86828790979d0656820ce38766423b5b38 100644 (file)
@@ -3188,7 +3188,6 @@ int BKE_object_insert_ptcache(Object *ob)
        return i;
 }
 
        return i;
 }
 
-#if 0
 static int pc_findindex(ListBase *listbase, int index)
 {
        LinkData *link = NULL;
 static int pc_findindex(ListBase *listbase, int index)
 {
        LinkData *link = NULL;
@@ -3198,7 +3197,7 @@ static int pc_findindex(ListBase *listbase, int index)
        
        link = listbase->first;
        while (link) {
        
        link = listbase->first;
        while (link) {
-               if ((int)link->data == index)
+               if (GET_INT_FROM_POINTER(link->data) == index)
                        return number;
                
                number++;
                        return number;
                
                number++;
@@ -3208,13 +3207,12 @@ static int pc_findindex(ListBase *listbase, int index)
        return -1;
 }
 
        return -1;
 }
 
-void object_delete_ptcache(Object *ob, int index) 
+void BKE_object_delete_ptcache(Object *ob, int index)
 {
        int list_index = pc_findindex(&ob->pc_ids, index);
        LinkData *link = BLI_findlink(&ob->pc_ids, list_index);
        BLI_freelinkN(&ob->pc_ids, link);
 }
 {
        int list_index = pc_findindex(&ob->pc_ids, index);
        LinkData *link = BLI_findlink(&ob->pc_ids, list_index);
        BLI_freelinkN(&ob->pc_ids, link);
 }
-#endif
 
 /* shape key utility function */
 
 
 /* shape key utility function */
 
index 7b3539db287323446967e4fb23aa79034403243f..271160a54f09c24724c56cf973fb2f2ea34aa474 100644 (file)
@@ -3483,6 +3483,13 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
        BKE_ptcache_id_time(pid, NULL, 0.0f, NULL, NULL, NULL);
 
        BKE_ptcache_update_info(pid);
        BKE_ptcache_id_time(pid, NULL, 0.0f, NULL, NULL, NULL);
 
        BKE_ptcache_update_info(pid);
+
+       if ((cache->flag & PTCACHE_DISK_CACHE) == 0) {
+               if (cache->index) {
+                       BKE_object_delete_ptcache(pid->ob, cache->index);
+                       cache->index = -1;
+               }
+       }
 }
 
 void BKE_ptcache_disk_cache_rename(PTCacheID *pid, const char *name_src, const char *name_dst)
 }
 
 void BKE_ptcache_disk_cache_rename(PTCacheID *pid, const char *name_src, const char *name_dst)
index 0b582dacc5c31da87916e65638c373539bd6b47f..129e9800ee417f18e3d417d052b9ac40b48ffc28 100644 (file)
@@ -1542,6 +1542,7 @@ static void write_objects(WriteData *wd, ListBase *idbase)
                        write_particlesystems(wd, &ob->particlesystem);
                        write_modifiers(wd, &ob->modifiers);
 
                        write_particlesystems(wd, &ob->particlesystem);
                        write_modifiers(wd, &ob->modifiers);
 
+                       writelist(wd, DATA, "LinkData", &ob->pc_ids);
                        writelist(wd, DATA, "LodLevel", &ob->lodlevels);
                }
                ob= ob->id.next;
                        writelist(wd, DATA, "LodLevel", &ob->lodlevels);
                }
                ob= ob->id.next;