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:
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/mesh_convert.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c
index fce80272738..f99dee7197f 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -1169,17 +1169,28 @@ Mesh *BKE_mesh_new_from_object(Depsgraph *depsgraph, Object *object, bool preser
return new_mesh;
}
-static int foreach_libblock_make_original_and_usercount_callback(void *user_data_v,
- ID *id_self,
- ID **id_p,
- int cb_flag)
+static int foreach_libblock_make_original_callback(void *UNUSED(user_data_v),
+ ID *UNUSED(id_self),
+ ID **id_p,
+ int UNUSED(cb_flag))
{
- UNUSED_VARS(user_data_v, id_self, cb_flag);
if (*id_p == NULL) {
return IDWALK_RET_NOP;
}
*id_p = DEG_get_original_id(*id_p);
+ return IDWALK_RET_NOP;
+}
+
+static int foreach_libblock_make_usercounts_callback(void *UNUSED(user_data_v),
+ ID *UNUSED(id_self),
+ ID **id_p,
+ int cb_flag)
+{
+ if (*id_p == NULL) {
+ return IDWALK_RET_NOP;
+ }
+
if (cb_flag & IDWALK_CB_USER) {
id_us_plus(*id_p);
}
@@ -1204,10 +1215,10 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain,
* Going to original data-blocks is required to have bmain in a consistent state, where
* everything is only allowed to reference original data-blocks.
*
- * user-count is required is because so far mesh was in a limbo, where library management does
- * not perform any user management (i.e. copy of a mesh will not increase users of materials). */
+ * Note that user-count updates has to be done *after* mesh has been transferred to Main database
+ * (since doing refcounting on non-Main IDs is forbidden). */
BKE_library_foreach_ID_link(
- NULL, &mesh->id, foreach_libblock_make_original_and_usercount_callback, NULL, IDWALK_NOP);
+ NULL, &mesh->id, foreach_libblock_make_original_callback, NULL, IDWALK_NOP);
/* Append the mesh to bmain.
* We do it a bit longer way since there is no simple and clear way of adding existing datablock
@@ -1216,7 +1227,7 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain,
Mesh *mesh_in_bmain = BKE_mesh_add(bmain, mesh->id.name + 2);
/* NOTE: BKE_mesh_nomain_to_mesh() does not copy materials and instead it preserves them in the
- * destinaion mesh .So we "steal" all related fields before calling it.
+ * destinaion mesh. So we "steal" all related fields before calling it.
*
* TODO(sergey): We really better have a function which gets and ID and accepts it for the bmain.
*/
@@ -1228,6 +1239,11 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain,
BKE_mesh_nomain_to_mesh(mesh, mesh_in_bmain, NULL, &CD_MASK_MESH, true);
+ /* User-count is required because so far mesh was in a limbo, where library management does
+ * not perform any user management (i.e. copy of a mesh will not increase users of materials). */
+ BKE_library_foreach_ID_link(
+ NULL, &mesh_in_bmain->id, foreach_libblock_make_usercounts_callback, NULL, IDWALK_NOP);
+
/* Make sure user count from BKE_mesh_add() is the one we expect here and bring it down to 0. */
BLI_assert(mesh_in_bmain->id.us == 1);
id_us_min(&mesh_in_bmain->id);