diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-06-04 16:11:09 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-06-04 16:17:16 +0300 |
commit | 07f004620397fd818d2684d08ff67422d76a92cf (patch) | |
tree | 5a0db889de90d702a3b6814ede41f497faddfdda /source/blender/blenkernel/intern | |
parent | 1dc31f5b982559bbe875d469950ee7404e9a4a3c (diff) |
Fix crash when making objects to share same mesh
Make it more reliable and predictable way of getting pointer to
an original mesh which came from copy-on-write engine.
Related change: made it (hopefully) more clear name for flags.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 4 |
3 files changed, 9 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index c554d5e7b6c..1698946b506 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2790,7 +2790,7 @@ static void editbmesh_calc_modifiers( } else { struct Mesh *mesh = ob->data; - if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) { + if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) { BKE_mesh_runtime_ensure_edit_data(mesh); mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts); } @@ -2832,7 +2832,7 @@ static void editbmesh_calc_modifiers( else { /* this is just a copy of the editmesh, no need to calc normals */ struct Mesh *mesh = ob->data; - if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) { + if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) { BKE_mesh_runtime_ensure_edit_data(mesh); if (mesh->runtime.edit_data->vertexCos != NULL) MEM_freeN((void *)mesh->runtime.edit_data->vertexCos); @@ -2943,18 +2943,14 @@ static void mesh_finalize_eval(Object *object) if (mesh_eval->mat != NULL) { MEM_freeN(mesh_eval->mat); } + /* Set flag which makes it easier to see what's going on in a debugger. */ + mesh_eval->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT; mesh_eval->mat = MEM_dupallocN(mesh->mat); mesh_eval->totcol = mesh->totcol; /* Make evaluated mesh to share same edit mesh pointer as original * and copied meshes. */ mesh_eval->edit_btmesh = mesh->edit_btmesh; - /* Special flags to help debugging and also to allow copy-on-write core - * to understand that on re-evaluation this mesh is to be preserved and - * to be remapped back to copied original mesh when used as object data. - */ - mesh_eval->id.tag |= LIB_TAG_COPY_ON_WRITE_EVAL; - mesh_eval->id.orig_id = &mesh->id; /* Copy autosmooth settings from original mesh. * This is not done by BKE_mesh_new_nomain_from_template(), so need to take * extra care here. @@ -2970,7 +2966,7 @@ static void mesh_finalize_eval(Object *object) /* Object is sometimes not evaluated! * TODO(sergey): BAD TEMPORARY HACK FOR UNTIL WE ARE SMARTER */ - if (object->id.tag & LIB_TAG_COPY_ON_WRITE) { + if (object->id.tag & LIB_TAG_COPIED_ON_WRITE) { object->data = mesh_eval; } else { diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 0fa20f00823..b5b62de57ec 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -1057,7 +1057,7 @@ void BKE_lattice_modifiers_calc(struct Depsgraph *depsgraph, Scene *scene, Objec modifier_deformVerts_DM_deprecated(md, &mectx, NULL, vertexCos, numVerts); } - if (ob->id.tag & LIB_TAG_COPY_ON_WRITE) { + if (ob->id.tag & LIB_TAG_COPIED_ON_WRITE) { if (vertexCos) { BKE_lattice_vertexcos_apply(ob, vertexCos); MEM_freeN(vertexCos); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 2eb35908d63..9c42cc686ea 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -344,7 +344,9 @@ void BKE_object_free_derived_caches(Object *ob) if (ob->runtime.mesh_eval != NULL) { Mesh *mesh_eval = ob->runtime.mesh_eval; /* Restore initial pointer. */ - ob->data = mesh_eval->id.orig_id; + if (ob->data == mesh_eval) { + ob->data = ob->runtime.mesh_orig; + } /* Evaluated mesh points to edit mesh, but does not own it. */ mesh_eval->edit_btmesh = NULL; BKE_mesh_free(mesh_eval); |