diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-05-18 14:24:34 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-05-18 14:24:34 +0400 |
commit | 11186184aa7af143e72c539be0ed06c3ef37a146 (patch) | |
tree | 9be7e1160f0bcf9484526068327e99f237907b41 /source/blender/blenkernel/intern/DerivedMesh.c | |
parent | 8da43c5aaf5a0628da8f1523cc902ab82bdd5e20 (diff) |
Fix #35404: crash in file save with python code that accesses mesh from panel.
On file save the mesh gets loads from the editmesh but the derived mesh caches
wer not cleared. This usually happens through the depsgraph but it needs to be
done manually here. Most changes are some refactoring to deduplicate derived
mesh freeing code.
Diffstat (limited to 'source/blender/blenkernel/intern/DerivedMesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 38 |
1 files changed, 4 insertions, 34 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 3dda6933eab..02de0ce1d40 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2163,38 +2163,6 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D MEM_freeN(deformedVerts); } -static void clear_mesh_caches(Object *ob) -{ - Mesh *me = ob->data; - - /* also serves as signal to remake texspace */ - if (ob->bb) { - MEM_freeN(ob->bb); - ob->bb = NULL; - } - if (me->bb) { - MEM_freeN(me->bb); - me->bb = NULL; - } - - BKE_displist_free(&ob->disp); - - if (ob->derivedFinal) { - ob->derivedFinal->needsFree = 1; - ob->derivedFinal->release(ob->derivedFinal); - ob->derivedFinal = NULL; - } - if (ob->derivedDeform) { - ob->derivedDeform->needsFree = 1; - ob->derivedDeform->release(ob->derivedDeform); - ob->derivedDeform = NULL; - } - - if (ob->sculpt) { - BKE_object_sculpt_modifiers_changed(ob); - } -} - static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask, int build_shapekey_layers) { @@ -2205,7 +2173,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask, BLI_assert(ob->type == OB_MESH); - clear_mesh_caches(ob); + BKE_object_free_derived_caches(ob); + BKE_object_sculpt_modifiers_changed(ob); mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1, @@ -2226,7 +2195,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask, static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask) { - clear_mesh_caches(obedit); + BKE_object_free_derived_caches(obedit); + BKE_object_sculpt_modifiers_changed(obedit); if (em->derivedFinal) { if (em->derivedFinal != em->derivedCage) { |