diff options
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 3 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_utildefines.h | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 7a91c01664a..74907fd0662 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -615,7 +615,8 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask) MEM_freeN(me->mselect); } - *me = tmp; + /* skip the listbase */ + MEMCPY_STRUCT_OFS(me, &tmp, id.prev); } void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb) diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 4333ef1ce3f..c464bcdd0a9 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -384,6 +384,21 @@ # define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr))) #endif +/* Like offsetof(typeof(), member), for non-gcc compilers */ +#define OFFSETOF_STRUCT(_struct, _member) \ + ((((char *)&((_struct)->_member)) - ((char *)(_struct))) + sizeof((_struct)->_member)) + +/* memcpy, skipping the first part of a struct, + * ensures 'struct_dst' isn't const and that the offset can be computed at compile time */ +#define MEMCPY_STRUCT_OFS(struct_dst, struct_src, member) { \ + void *_not_const = struct_dst; \ + (void)_not_const; \ + ((void)(struct_dst == struct_src), \ + memcpy((char *)(struct_dst) + OFFSETOF_STRUCT(struct_dst, member), \ + (char *)(struct_src) + OFFSETOF_STRUCT(struct_dst, member), \ + sizeof(*(struct_dst)) - OFFSETOF_STRUCT(struct_dst, member))); \ +} (void)0 + /* Warning-free macros for storing ints in pointers. Use these _only_ * for storing an int in a pointer, not a pointer in an int (64bit)! */ #define SET_INT_IN_POINTER(i) ((void *)(intptr_t)(i)) |