From 7d399ba2425dd7b41518f6eeed726f3a33c437d4 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 31 Oct 2023 22:57:45 +0100 Subject: [PATCH 1/2] Fix #114102: Node tool data-block inputs broken Also add data-blocks from the redo panel inputs to the temporary dependency graph added by 2893dc8ab7bbf9b2079. Then make a temporary copy of the properties list to pass the updated "evaluated" pointers to the geometry nodes evaluator. Sharing code between the modifier and tools is starting to make things more complicated than they should be. But for now it's still probably worth it. The remaining issue with data-block inputs is #113383. I'll look into that next. --- .../editors/geometry/node_group_operator.cc | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/geometry/node_group_operator.cc b/source/blender/editors/geometry/node_group_operator.cc index 75312c8ccdb..45d3ce883b7 100644 --- a/source/blender/editors/geometry/node_group_operator.cc +++ b/source/blender/editors/geometry/node_group_operator.cc @@ -236,11 +236,22 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain, Scene &scene, ViewLayer &view_layer, const bNodeTree &node_tree_orig, - const Span objects) + const Span objects, + const IDProperty &properties) { Set ids_for_relations; bool needs_own_transform_relation = false; - nodes::find_node_tree_dependencies(node_tree_orig, ids_for_relations, needs_own_transform_relation); + nodes::find_node_tree_dependencies( + node_tree_orig, ids_for_relations, needs_own_transform_relation); + IDP_foreach_property( + &const_cast(properties), + IDP_TYPE_FILTER_ID, + [](IDProperty *property, void *user_data) { + if (ID *id = IDP_Id(property)) { + static_cast *>(user_data)->add(id); + } + }, + &ids_for_relations); Vector ids; ids.append(&node_tree_orig.id); @@ -252,6 +263,23 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain, return depsgraph; } +static IDProperty *replace_inputs_evaluated_data_blocks(const IDProperty &op_properties, + const Depsgraph &depsgraph) +{ + IDProperty *properties = IDP_CopyProperty(&op_properties); + IDP_foreach_property( + properties, + IDP_TYPE_FILTER_ID, + [](IDProperty *property, void *user_data) { + if (ID *id = IDP_Id(property)) { + Depsgraph *depsgraph = static_cast(user_data); + property->data.pointer = DEG_get_evaluated_id(depsgraph, id); + } + }, + &const_cast(depsgraph)); + return properties; +} + static int run_node_group_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); @@ -277,7 +305,7 @@ static int run_node_group_exec(bContext *C, wmOperator *op) BLI_SCOPED_DEFER([&]() { MEM_SAFE_FREE(objects); }); Depsgraph *depsgraph = build_depsgraph_from_indirect_ids( - *bmain, *scene, *view_layer, *node_tree_orig, {objects, objects_len}); + *bmain, *scene, *view_layer, *node_tree_orig, {objects, objects_len}, *op->properties); DEG_evaluate_on_refresh(depsgraph); BLI_SCOPED_DEFER([&]() { DEG_graph_free(depsgraph); }); @@ -296,6 +324,9 @@ static int run_node_group_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } + IDProperty *properties = replace_inputs_evaluated_data_blocks(*op->properties, *depsgraph); + BLI_SCOPED_DEFER([&]() { IDP_FreeProperty_ex(properties, false); }); + OperatorComputeContext compute_context(op->type->idname); for (Object *object : Span(objects, objects_len)) { @@ -311,7 +342,7 @@ static int run_node_group_exec(bContext *C, wmOperator *op) bke::GeometrySet new_geometry = nodes::execute_geometry_nodes_on_geometry( *node_tree, - op->properties, + properties, compute_context, std::move(geometry_orig), [&](nodes::GeoNodesLFUserData &user_data) { -- 2.30.2 From 2dc1ec16b5718c4189f6a374b30c54e92d1e84f9 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 1 Nov 2023 09:44:23 +0100 Subject: [PATCH 2/2] Fix user count --- source/blender/editors/geometry/node_group_operator.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/geometry/node_group_operator.cc b/source/blender/editors/geometry/node_group_operator.cc index 45d3ce883b7..5da6669ea0a 100644 --- a/source/blender/editors/geometry/node_group_operator.cc +++ b/source/blender/editors/geometry/node_group_operator.cc @@ -266,7 +266,8 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain, static IDProperty *replace_inputs_evaluated_data_blocks(const IDProperty &op_properties, const Depsgraph &depsgraph) { - IDProperty *properties = IDP_CopyProperty(&op_properties); + /* We just create a temporary copy, so don't adjust data-block user count. */ + IDProperty *properties = IDP_CopyProperty_ex(&op_properties, LIB_ID_CREATE_NO_USER_REFCOUNT); IDP_foreach_property( properties, IDP_TYPE_FILTER_ID, -- 2.30.2