Bugfix #24890
authorTon Roosendaal <ton@blender.org>
Wed, 1 Dec 2010 15:58:45 +0000 (15:58 +0000)
committerTon Roosendaal <ton@blender.org>
Wed, 1 Dec 2010 15:58:45 +0000 (15:58 +0000)
Particle cache reading: crash when loading .blend on a different
endian system, code was dumping arrays in .blend without DNA.

General warning for devs: avoid generic write_data and dynamic
arrays in DNA.

source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_boid_types.h

index bcb09ca52c80d0c7f18f49031809d15001a8d37c..7861e771f8b9b86db62269dac290aa1a7982f347 100644 (file)
@@ -2931,9 +2931,24 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
                        if(pm->index_array)
                                pm->index_array = newdataadr(fd, pm->index_array);
                        
+                       /* writedata saved array of ints */
+                       if(pm->index_array && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
+                               for(i=0; i<pm->totpoint; i++)
+                                       SWITCH_INT(pm->index_array[i]);
+                       }
+                       
                        for(i=0; i<BPHYS_TOT_DATA; i++) {
-                               if(pm->data[i] && pm->data_types & (1<<i))
-                                       pm->data[i] = newdataadr(fd, pm->data[i]);
+                               pm->data[i] = newdataadr(fd, pm->data[i]);
+                               
+                               /* XXX the cache saves structs and data without DNA */
+                               if(pm->data[i] && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
+                                       int j, tot= (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */
+                                       int *poin= pm->data[i];
+                                       
+                                       /* XXX fails for boid struct, it has 2 shorts */
+                                       for(j= 0; j<tot; j++)
+                                               SWITCH_INT(poin[j]);
+                               }
                        }
                }
        }
index c4324612affb1a5fa8209387b783a6cd9cc929bb..cabdb748a60e980482616b5738153ee16ebbf62b 100644 (file)
@@ -104,6 +104,10 @@ typedef enum BoidMode {
        eBoidMode_Liftoff,
        NUM_BOID_MODES
 } BoidMode;
+
+
+/* XXX WARNING!!! */
+/* BoidData is NOT in DNA, it gets saved via write_data. Do not change struct */
 typedef struct BoidData {
        float health, acc[3];
        short state_id, mode;