From 68e37552099231ff2b1beb6c7135dfa7fcc418e9 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 2 Dec 2021 09:41:36 +0100 Subject: Fix T93555: crash when muting nodes with multiple internal links The crash happened because I was incorrectly and inconsistently assuming that a socket is part of at most one internal link. However, this is not the case. In geometry nodes, an input socket can be internally linked to multiple output sockets. In the general case, an output could also be linked to multiple input sockets, even though we don't have that in Blender yet. Dalai gave green light to cherry pick this fix for 3.0. --- source/blender/nodes/intern/derived_node_tree.cc | 1 - source/blender/nodes/intern/node_tree_ref.cc | 1 - 2 files changed, 2 deletions(-) (limited to 'source') diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc index 8a9386c1137..e2f4ebf17c3 100644 --- a/source/blender/nodes/intern/derived_node_tree.cc +++ b/source/blender/nodes/intern/derived_node_tree.cc @@ -281,7 +281,6 @@ void DOutputSocket::foreach_target_socket(ForeachTargetSocketFn target_fn, mute_output.foreach_target_socket(target_fn, path_info); path_info.sockets.pop_last(); path_info.sockets.pop_last(); - break; } } else if (linked_node->is_group_output_node()) { diff --git a/source/blender/nodes/intern/node_tree_ref.cc b/source/blender/nodes/intern/node_tree_ref.cc index 5481465aef6..d58521e7b72 100644 --- a/source/blender/nodes/intern/node_tree_ref.cc +++ b/source/blender/nodes/intern/node_tree_ref.cc @@ -262,7 +262,6 @@ void InputSocketRef::foreach_logical_origin( skipped_fn.call_safe(origin); skipped_fn.call_safe(mute_input); mute_input.foreach_logical_origin(origin_fn, skipped_fn, true, seen_sockets_stack); - break; } } } -- cgit v1.2.3 From 67c490daafd9642f91c2ca7a93482e3176e4c70c Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 2 Dec 2021 11:16:22 +0100 Subject: Fix T93548: Appended (material) assets don't have a fake user Since our design is to always keep data-blocks marked as assets on exit, and our technical design for this is to do this via fake users, ensure the fake user is set for an appended asset. Reviewed by: Bastien Montagne Differential Revision: https://developer.blender.org/D13443 --- source/blender/blenkernel/intern/lib_id.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index cd5b266eb75..cfc3502e2cd 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -179,8 +179,14 @@ void BKE_lib_id_clear_library_data(Main *bmain, ID *id, const int flags) BKE_lib_libblock_session_uuid_renew(id); } - if ((flags & LIB_ID_MAKELOCAL_ASSET_DATA_CLEAR) != 0 && id->asset_data != NULL) { - BKE_asset_metadata_free(&id->asset_data); + if (ID_IS_ASSET(id)) { + if ((flags & LIB_ID_MAKELOCAL_ASSET_DATA_CLEAR) != 0) { + BKE_asset_metadata_free(&id->asset_data); + } + else { + /* Assets should always have a fake user. Ensure this is the case after "Make Local". */ + id_fake_user_set(id); + } } /* We need to tag this IDs and all of its users, conceptually new local ID and original linked -- cgit v1.2.3