Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2018-12-01 19:06:44 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2018-12-01 19:09:09 +0300
commit9ed522db735b1d798a5d68c6bf547e8123d33a4b (patch)
treeb8e08f92ea02f1a6e73c2883e5f55d296cd3cadf /source/blender/blenkernel/intern/DerivedMesh.c
parentdbb479b998a63bec22ebc3173b22420c955892dd (diff)
Fix more cases of evaluated mesh being built for non-COW objects.
Diffstat (limited to 'source/blender/blenkernel/intern/DerivedMesh.c')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c11
1 files changed, 6 insertions, 5 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;