diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-06 20:22:41 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-06 20:22:41 +0400 |
commit | bffeab99aef22181ea6284381b77fcc85833967c (patch) | |
tree | 690801d4a59419b72b026c241c4961b522ac3157 /source/blender | |
parent | 5ba020da4f3316c631d7c982a82e52d494930f20 (diff) |
Fix for fracture object crash
Issue was caused by incorrect resetting of tesselated fave data in copy_mesh:
- CustomData_free will free data from original mesh because layers in new mesh
are pointing to the same memory just after copy. So it's needed only to
set some pointers to NULL.
- It was incorrect filling fdata with zeroes because of incorrect structure size used.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 708f85e0311..d5d96bcd79b 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -452,6 +452,19 @@ void free_dverts(MDeformVert *dvert, int totvert) MEM_freeN (dvert); } +static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata) +{ + if (free_customdata) + CustomData_free(&mesh->fdata, mesh->totface); + + mesh->mface = NULL; + mesh->mtface = NULL; + mesh->mcol = NULL; + mesh->totface = 0; + + memset(&mesh->fdata, 0, sizeof(mesh->fdata)); +} + Mesh *add_mesh(const char *name) { Mesh *me; @@ -492,7 +505,7 @@ Mesh *copy_mesh(Mesh *me) CustomData_copy(&me->fdata, &men->fdata, CD_MASK_MESH, CD_DUPLICATE, men->totface); } else { - BKE_mesh_tessface_clear(men); + mesh_tessface_clear_intern(men, FALSE); } mesh_update_customdata_pointers(men, do_tessface); @@ -2971,12 +2984,5 @@ void BKE_mesh_tessface_ensure(Mesh *mesh) void BKE_mesh_tessface_clear(Mesh *mesh) { - CustomData_free(&mesh->fdata, mesh->totface); - - mesh->mface = NULL; - mesh->mtface = NULL; - mesh->mcol = NULL; - mesh->totface = 0; - - memset(&mesh->fdata, 0, sizeof(&mesh->fdata)); + mesh_tessface_clear_intern(mesh, TRUE); } |