[Bf-blender-cvs] [a84c823b891] blender2.8: Fix T58652: Crash editing shape keys weirdness with instances

Sergey Sharybin noreply at git.blender.org
Mon Dec 17 12:33:49 CET 2018


Commit: a84c823b891fcf440e134eb284024ea06aa1a9ff
Author: Sergey Sharybin
Date:   Mon Dec 17 12:28:16 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBa84c823b891fcf440e134eb284024ea06aa1a9ff

Fix T58652: Crash editing shape keys weirdness with instances

This is a second attempt to get the crash fixed. The original fix
worked, but it was reverted by d3e0d7f0825.

Now the logic goes as:

- All pointers which we can not have shared (the ones which are
  owned by the runtime) are cleared.
- The rest of runtime stays untouched.

This seems to be enough to keep particles happy.

===================================================================

M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/BKE_mesh_runtime.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/mesh_runtime.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/particle_distribute.c
M	source/blender/modifiers/intern/MOD_util.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 946cd23843d..a4eb40cbb38 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -81,7 +81,6 @@ enum {
 	LIB_ID_COPY_CACHES             = 1 << 18,  /* Copy runtime data caches. */
 	LIB_ID_COPY_NO_ANIMDATA        = 1 << 19,  /* Don't copy id->adt, used by ID datablock localization routines. */
 	LIB_ID_COPY_CD_REFERENCE       = 1 << 20,  /* Mesh: Reference CD data layers instead of doing real copy. */
-	LIB_ID_COPY_RUNTIME            = 1 << 21,  /* Copy ID's runtime field (for example. object->runtime). */
 
 	/* XXX Hackish/not-so-nice specific behaviors needed for some corner cases.
 	 *     Ideally we should not have those, but we need them for now... */
diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h
index 8f9de85a302..49e452edc36 100644
--- a/source/blender/blenkernel/BKE_mesh_runtime.h
+++ b/source/blender/blenkernel/BKE_mesh_runtime.h
@@ -54,6 +54,7 @@ struct DerivedMesh;
 #endif
 
 void BKE_mesh_runtime_reset(struct Mesh *mesh);
+void BKE_mesh_runtime_reset_on_copy(struct Mesh *mesh);
 int BKE_mesh_runtime_looptri_len(const struct Mesh *mesh);
 void BKE_mesh_runtime_looptri_recalc(struct Mesh *mesh);
 const struct MLoopTri *BKE_mesh_runtime_looptri_ensure(struct Mesh *mesh);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 7a595511892..fbef5b6485c 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -319,6 +319,7 @@ void BKE_object_data_relink(struct Object *ob);
 struct MovieClip *BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default);
 
 void BKE_object_runtime_reset(struct Object *object);
+void BKE_object_runtime_reset_on_copy(struct Object *object);
 
 void BKE_object_batch_cache_dirty_tag(struct Object *ob);
 
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 84585d3bd64..4ddfb0d55f6 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -518,25 +518,25 @@ static int id_copy_libmanagement_cb(void *user_data, ID *UNUSED(id_self), ID **i
 	return IDWALK_RET_NOP;
 }
 
-static void id_copy_clear_runtime_if_needed(ID *id, int flag)
+static void id_copy_clear_runtime_pointers(ID *id, int UNUSED(flag))
 {
 	if (id == NULL) {
 		return;
 	}
-	if (flag & LIB_ID_COPY_RUNTIME) {
-		return;
-	}
+	/* TODO(sergey): We might want to do a deep-copy of all the pointers inside.
+	 * This isn't currently needed, and is quite involved change (to cover all
+	 * things like batch cache and such). */
 	switch ((ID_Type)GS(id->name)) {
 		case ID_OB:
 		{
 			Object *object = (Object *)id;
-			BKE_object_runtime_reset(object);
+			BKE_object_runtime_reset_on_copy(object);
 			break;
 		}
 		case ID_ME:
 		{
 			Mesh *mesh = (Mesh *)id;
-			BKE_mesh_runtime_reset(mesh);
+			BKE_mesh_runtime_reset_on_copy(mesh);
 			break;
 		}
 		default:
@@ -709,7 +709,7 @@ bool BKE_id_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int flag, con
 		(*r_newid)->lib = id->lib;
 	}
 
-	id_copy_clear_runtime_if_needed(*r_newid, flag);
+	id_copy_clear_runtime_pointers(*r_newid, flag);
 
 	return true;
 }
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 9e4a7372010..fcd0bfa9ceb 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -700,8 +700,7 @@ Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference)
 	int flags = (LIB_ID_CREATE_NO_MAIN |
 	             LIB_ID_CREATE_NO_USER_REFCOUNT |
 	             LIB_ID_CREATE_NO_DEG_TAG |
-	             LIB_ID_COPY_NO_PREVIEW |
-	             LIB_ID_COPY_RUNTIME);
+	             LIB_ID_COPY_NO_PREVIEW);
 
 	if (reference) {
 		flags |= LIB_ID_COPY_CD_REFERENCE;
diff --git a/source/blender/blenkernel/intern/mesh_runtime.c b/source/blender/blenkernel/intern/mesh_runtime.c
index 14d77b5288b..9e71f5f5156 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.c
+++ b/source/blender/blenkernel/intern/mesh_runtime.c
@@ -60,6 +60,20 @@ void BKE_mesh_runtime_reset(Mesh *mesh)
 	memset(&mesh->runtime, 0, sizeof(mesh->runtime));
 }
 
+/* Clear all pointers which we don't want to be shared on copying the datablock.
+ * However, keep all the flags which defines what the mesh is (for example, that
+ * it's deformed only, or that its custom data layers are out of date.) */
+void BKE_mesh_runtime_reset_on_copy(Mesh *mesh)
+{
+	Mesh_Runtime *runtime = &mesh->runtime;
+	runtime->edit_data = NULL;
+	runtime->batch_cache = NULL;
+	runtime->subdiv_ccg = NULL;
+	memset(&runtime->looptris, 0, sizeof(runtime->looptris));
+	runtime->bvh_cache = NULL;
+	runtime->shrinkwrap_data = NULL;
+}
+
 void BKE_mesh_runtime_clear_cache(Mesh *mesh)
 {
 	BKE_mesh_runtime_clear_geometry(mesh);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 498658765b6..921a3602c08 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3582,6 +3582,17 @@ void BKE_object_runtime_reset(Object *object)
 	memset(&object->runtime, 0, sizeof(object->runtime));
 }
 
+/* Reset all pointers which we don't want to be shared when copying the object. */
+void BKE_object_runtime_reset_on_copy(Object *object)
+{
+	Object_Runtime *runtime = &object->runtime;
+	runtime->mesh_eval = NULL;
+	runtime->mesh_deform_eval = NULL;
+	runtime->curve_cache = NULL;
+	runtime->gpencil_cache = NULL;
+	runtime->cached_bbone_deformation = NULL;
+}
+
 /*
  * Find an associated Armature object
  */
diff --git a/source/blender/blenkernel/intern/particle_distribute.c b/source/blender/blenkernel/intern/particle_distribute.c
index 90d3caa2639..bbb8a96dd4d 100644
--- a/source/blender/blenkernel/intern/particle_distribute.c
+++ b/source/blender/blenkernel/intern/particle_distribute.c
@@ -925,8 +925,7 @@ static int psys_thread_context_init_distribute(ParticleThreadContext *ctx, Parti
 			            LIB_ID_CREATE_NO_MAIN |
 			            LIB_ID_CREATE_NO_USER_REFCOUNT |
 			            LIB_ID_CREATE_NO_DEG_TAG |
-			            LIB_ID_COPY_NO_PREVIEW |
-			            LIB_ID_COPY_RUNTIME,
+			            LIB_ID_COPY_NO_PREVIEW,
 			            false);
 
 		BKE_mesh_tessface_ensure(mesh);
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index 63dfacf391f..dca2d536a5d 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -198,8 +198,7 @@ Mesh *MOD_deform_mesh_eval_get(
 			         LIB_ID_CREATE_NO_USER_REFCOUNT |
 			         LIB_ID_CREATE_NO_DEG_TAG |
 			         LIB_ID_COPY_NO_PREVIEW |
-			         LIB_ID_COPY_CD_REFERENCE |
-			         LIB_ID_COPY_RUNTIME),
+			         LIB_ID_COPY_CD_REFERENCE),
 			        false);
 			mesh->runtime.deformed_only = 1;
 		}



More information about the Bf-blender-cvs mailing list