Fix for [#26197] High resolution smoke cache not available due to pointcache update...
authorJanne Karhu <jhkarh@gmail.com>
Thu, 24 Feb 2011 13:37:53 +0000 (13:37 +0000)
committerJanne Karhu <jhkarh@gmail.com>
Thu, 24 Feb 2011 13:37:53 +0000 (13:37 +0000)
* Backwards compatibility code wasn't forwards compatible :)

source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/writefile.c
source/blender/makesdna/DNA_object_force.h

index 5737dfd..4c5a281 100644 (file)
@@ -3963,7 +3963,14 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 
                                /* Smoke uses only one cache from now on, so store pointer convert */
                                if(smd->domain->ptcaches[1].first || smd->domain->point_cache[1]) {
-                                       printf("High resolution smoke cache not available due to pointcache update. Please reset the simulation.\n");
+                                       if(smd->domain->point_cache[1]) {
+                                               PointCache *cache = newdataadr(fd, smd->domain->point_cache[1]);
+                                               if(cache->flag & PTCACHE_FAKE_SMOKE)
+                                                       ; /* Smoke was already saved in "new format" and this cache is a fake one. */
+                                               else
+                                                       printf("High resolution smoke cache not available due to pointcache update. Please reset the simulation.\n");
+                                               BKE_ptcache_free(cache);
+                                       }
                                        smd->domain->ptcaches[1].first = NULL;
                                        smd->domain->ptcaches[1].last = NULL;
                                        smd->domain->point_cache[1] = NULL;
index 8d0656e..d2d6c24 100644 (file)
@@ -1220,7 +1220,7 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
 
                                        /* create fake pointcache so that old blender versions can read it */
                                        smd->domain->point_cache[1] = BKE_ptcache_add(&smd->domain->ptcaches[1]);
-                                       smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE;
+                                       smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE|PTCACHE_FAKE_SMOKE;
                                        smd->domain->point_cache[1]->step = 1;
 
                                        write_pointcaches(wd, &(smd->domain->ptcaches[1]));
index 51076dd..37568a2 100644 (file)
@@ -397,6 +397,8 @@ typedef struct SoftBody {
 #define PTCACHE_READ_INFO                      1024
 /* dont use the filename of the blendfile the data is linked from (write a local cache) */
 #define PTCACHE_IGNORE_LIBPATH         2048
+/* high resolution cache is saved for smoke for backwards compatibility, so set this flag to know it's a "fake" cache */
+#define PTCACHE_FAKE_SMOKE                     (1<<12)
 
 /* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
 #define PTCACHE_REDO_NEEDED                    258