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:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-05-27 12:45:33 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-05-29 11:44:11 +0300
commit2f7711962a69de8192d048514e5927e49a1a63a2 (patch)
tree7a91196fc710ec8e47bda75cd763d09386e43d8d /source/blender/blenkernel/intern/object.c
parentda7e5e861f54ae0ca9b7ec1c71432fb08f7a53fa (diff)
Fix T58251: Cycles ignores linked meshes when rendering
The idea is to share a mesh data-block as a result across all objects which are sharing same original mesh and have no effective modifiers. This mesh is owned by an original copy-on-written version of object data. Tricky part is to make sure it is only initialized once, and currently a silly mutex lock is used. In practice it only locks if the mesh is not already there. As an extra bonus, even viewport memory is also lower after this change. Reviewers: brecht, mont29 Reviewed By: brecht, mont29 Differential Revision: https://developer.blender.org/D4954
Diffstat (limited to 'source/blender/blenkernel/intern/object.c')
-rw-r--r--source/blender/blenkernel/intern/object.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a4dbbb5d238..675239244a8 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -361,6 +361,13 @@ static void object_update_from_subsurf_ccg(Object *object)
if (object->type != OB_MESH) {
return;
}
+ /* If object does not own evaluated mesh we can not access it since it might be freed already
+ * (happens on dependency graph free where order of CoW-ed IDs free is undefined).
+ *
+ * Good news is: such mesh does not have modifiers applied, so no need to worry about CCG. */
+ if (!object->runtime.is_mesh_eval_owned) {
+ return;
+ }
/* Object was never evaluated, so can not have CCG subdivision surface. */
Mesh *mesh_eval = object->runtime.mesh_eval;
if (mesh_eval == NULL) {
@@ -448,12 +455,13 @@ void BKE_object_free_derived_caches(Object *ob)
object_update_from_subsurf_ccg(ob);
BKE_object_free_derived_mesh_caches(ob);
- if (ob->runtime.mesh_eval != NULL) {
+ /* Restore initial pointer. */
+ if (ob->runtime.mesh_orig != NULL) {
+ ob->data = ob->runtime.mesh_orig;
+ }
+
+ if ((ob->runtime.mesh_eval != NULL && ob->runtime.is_mesh_eval_owned)) {
Mesh *mesh_eval = ob->runtime.mesh_eval;
- /* Restore initial pointer. */
- 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_mesh = NULL;
BKE_mesh_free(mesh_eval);