Bugfix #24890
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:
@@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user