Fix: Adding node group asset doesn't respect import method #109706
|
@ -10,11 +10,19 @@
|
|||
|
||||
#include "DNA_ID_enums.h"
|
||||
|
||||
struct ID;
|
||||
struct Main;
|
||||
|
||||
namespace blender::asset_system {
|
||||
class AssetRepresentation;
|
||||
}
|
||||
|
||||
struct ID *ED_asset_get_local_id_from_asset_or_append_and_reuse(
|
||||
Main *bmain, const blender::asset_system::AssetRepresentation &asset, ID_Type idtype);
|
||||
namespace blender::ed::asset {
|
||||
|
||||
/**
|
||||
* If the asset already has a corresponding local #ID, return it. Otherwise, link or append the
|
||||
* asset's data-block, using "Append & Reuse" if the method is unspecified.
|
||||
*/
|
||||
ID *asset_local_id_ensure_imported(Main &bmain, const asset_system::AssetRepresentation &asset);
|
||||
HooglyBoogly marked this conversation as resolved
Outdated
|
||||
|
||||
} // namespace blender::ed::asset
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
#include "AS_asset_representation.hh"
|
||||
|
||||
#include "DNA_space_types.h"
|
||||
|
||||
#include "BLO_readfile.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
|
@ -16,8 +18,9 @@
|
|||
|
||||
using namespace blender;
|
||||
|
||||
ID *ED_asset_get_local_id_from_asset_or_append_and_reuse(
|
||||
Main *bmain, const asset_system::AssetRepresentation &asset, ID_Type idtype)
|
||||
namespace blender::ed::asset {
|
||||
|
||||
ID *asset_local_id_ensure_imported(Main &bmain, const asset_system::AssetRepresentation &asset)
|
||||
{
|
||||
if (ID *local_id = asset.local_id()) {
|
||||
return local_id;
|
||||
|
@ -28,14 +31,42 @@ ID *ED_asset_get_local_id_from_asset_or_append_and_reuse(
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
return WM_file_append_datablock(bmain,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
blend_path.c_str(),
|
||||
idtype,
|
||||
asset.get_name().c_str(),
|
||||
BLO_LIBLINK_APPEND_RECURSIVE |
|
||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE);
|
||||
switch (asset.get_import_method().value_or(ASSET_IMPORT_APPEND_REUSE)) {
|
||||
case ASSET_IMPORT_LINK:
|
||||
return WM_file_link_datablock(&bmain,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
blend_path.c_str(),
|
||||
asset.get_id_type(),
|
||||
asset.get_name().c_str(),
|
||||
(asset.get_use_relative_path() ? FILE_RELPATH : 0));
|
||||
case ASSET_IMPORT_APPEND:
|
||||
return WM_file_append_datablock(&bmain,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
blend_path.c_str(),
|
||||
asset.get_id_type(),
|
||||
asset.get_name().c_str(),
|
||||
BLO_LIBLINK_APPEND_RECURSIVE |
|
||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||
(asset.get_use_relative_path() ? FILE_RELPATH : 0));
|
||||
case ASSET_IMPORT_APPEND_REUSE:
|
||||
return WM_file_append_datablock(&bmain,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
blend_path.c_str(),
|
||||
asset.get_id_type(),
|
||||
asset.get_name().c_str(),
|
||||
BLO_LIBLINK_APPEND_RECURSIVE |
|
||||
BLO_LIBLINK_APPEND_ASSET_DATA_CLEAR |
|
||||
BLO_LIBLINK_APPEND_LOCAL_ID_REUSE |
|
||||
(asset.get_use_relative_path() ? FILE_RELPATH : 0));
|
||||
}
|
||||
BLI_assert_unreachable();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
} // namespace blender::ed::asset
|
||||
|
|
|
@ -75,8 +75,9 @@ static const bNodeTree *get_node_group(const bContext &C)
|
|||
if (!asset) {
|
||||
return nullptr;
|
||||
}
|
||||
Main &bmain = *CTX_data_main(&C);
|
||||
bNodeTree *node_group = reinterpret_cast<bNodeTree *>(
|
||||
ED_asset_get_local_id_from_asset_or_append_and_reuse(CTX_data_main(&C), *asset, ID_NT));
|
||||
asset::asset_local_id_ensure_imported(bmain, *asset));
|
||||
if (!node_group) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -72,17 +72,17 @@ static void search_items_for_asset_metadata(const bNodeTree &node_tree,
|
|||
return;
|
||||
}
|
||||
|
||||
params.add_single_node_item(
|
||||
IFACE_(asset.get_name().c_str()),
|
||||
asset_data.description == nullptr ? "" : IFACE_(asset_data.description),
|
||||
[&asset](const bContext &C, bNodeTree &node_tree, bNode &node) {
|
||||
Main &bmain = *CTX_data_main(&C);
|
||||
node.flag &= ~NODE_OPTIONS;
|
||||
node.id = ED_asset_get_local_id_from_asset_or_append_and_reuse(&bmain, asset, ID_NT);
|
||||
id_us_plus(node.id);
|
||||
BKE_ntree_update_tag_node_property(&node_tree, &node);
|
||||
DEG_relations_tag_update(&bmain);
|
||||
});
|
||||
params.add_single_node_item(IFACE_(asset.get_name().c_str()),
|
||||
asset_data.description == nullptr ? "" :
|
||||
IFACE_(asset_data.description),
|
||||
[&asset](const bContext &C, bNodeTree &node_tree, bNode &node) {
|
||||
Main &bmain = *CTX_data_main(&C);
|
||||
node.flag &= ~NODE_OPTIONS;
|
||||
node.id = asset::asset_local_id_ensure_imported(bmain, asset);
|
||||
id_us_plus(node.id);
|
||||
BKE_ntree_update_tag_node_property(&node_tree, &node);
|
||||
DEG_relations_tag_update(&bmain);
|
||||
});
|
||||
}
|
||||
|
||||
static void gather_search_items_for_all_assets(const bContext &C,
|
||||
|
|
|
@ -200,7 +200,7 @@ static void search_link_ops_for_asset_metadata(const bNodeTree &node_tree,
|
|||
bNode &node = params.add_node(params.node_tree.typeinfo->group_idname);
|
||||
node.flag &= ~NODE_OPTIONS;
|
||||
|
||||
node.id = ED_asset_get_local_id_from_asset_or_append_and_reuse(&bmain, asset, ID_NT);
|
||||
node.id = asset::asset_local_id_ensure_imported(bmain, asset);
|
||||
id_us_plus(node.id);
|
||||
BKE_ntree_update_tag_node_property(¶ms.node_tree, &node);
|
||||
DEG_relations_tag_update(&bmain);
|
||||
|
|
|
@ -387,7 +387,7 @@ static bool add_node_group_asset(const bContext &C,
|
|||
bNodeTree &edit_tree = *snode.edittree;
|
||||
|
||||
bNodeTree *node_group = reinterpret_cast<bNodeTree *>(
|
||||
ED_asset_get_local_id_from_asset_or_append_and_reuse(&bmain, asset, ID_NT));
|
||||
asset::asset_local_id_ensure_imported(bmain, asset));
|
||||
if (!node_group) {
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
I think the name should communicate that this may do the actual import, this is an important and potentially costly operation.
How about
ensure_asset_id_imported()
,get_asset_local_id_or_import()
or something like that?