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.
This commit is contained in:
Ton Roosendaal
2010-12-01 15:58:45 +00:00
parent 6090b1c5a7
commit f4205498a9
2 changed files with 21 additions and 2 deletions

View 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]);
}
}
}
}

View 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;