diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2018-12-01 19:06:44 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2018-12-01 19:09:09 +0300 |
commit | 9ed522db735b1d798a5d68c6bf547e8123d33a4b (patch) | |
tree | b8e08f92ea02f1a6e73c2883e5f55d296cd3cadf /source/blender/blenkernel | |
parent | dbb479b998a63bec22ebc3173b22420c955892dd (diff) |
Fix more cases of evaluated mesh being built for non-COW objects.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_convert.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/paint.c | 2 |
3 files changed, 11 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 55898381fde..b2586d513d6 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2004,6 +2004,10 @@ static void mesh_build_data( { BLI_assert(ob->type == OB_MESH); + /* Evaluated meshes aren't supposed to be created on original instances. If you do, + * they aren't cleaned up properly on mode switch, causing crashes, e.g T58150. */ + BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE); + BKE_object_free_derived_caches(ob); BKE_object_sculpt_modifiers_changed(ob); @@ -2153,9 +2157,6 @@ DerivedMesh *mesh_get_derived_final( Mesh *mesh_get_eval_final( struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask) { - /* Evaluation meshes on original instances aren't cleaned up properly, causing crashes. */ - BLI_assert(ob->id.tag & LIB_TAG_COPIED_ON_WRITE); - /* if there's no evaluated mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh */ @@ -2205,9 +2206,9 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob if (!ob->runtime.mesh_deform_eval || ((dataMask & ob->lastDataMask) != dataMask) || - (need_mapping != ob->lastNeedMapping)) + (need_mapping && !ob->lastNeedMapping)) { - mesh_build_data(depsgraph, scene, ob, dataMask, false, need_mapping); + mesh_build_data(depsgraph, scene, ob, dataMask | ob->lastDataMask, false, need_mapping || ob->lastNeedMapping); } return ob->runtime.mesh_deform_eval; diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index eed02dae824..de131b9be47 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -815,10 +815,12 @@ void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int ed } } -void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob) +void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *UNUSED(scene), Object *ob) { /* make new mesh data from the original copy */ - Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_MESH); + Scene *scene_eval = DEG_get_evaluated_scene(depsgraph); + Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob); + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene_eval, ob_eval, CD_MASK_MESH); ListBase nurblist = {NULL, NULL}; BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0); diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 8b44bbfa15f..0311d7f41be 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -1408,7 +1408,7 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob) } else if (ob->type == OB_MESH) { Mesh *me_eval_deform = mesh_get_eval_deform( - depsgraph, DEG_get_evaluated_scene(depsgraph), ob, CD_MASK_BAREMESH); + depsgraph, DEG_get_evaluated_scene(depsgraph), object_eval, CD_MASK_BAREMESH); pbvh = build_pbvh_from_regular_mesh(ob, me_eval_deform); } } |