diff options
author | Jacques Lucke <jacques@blender.org> | 2021-04-16 12:56:04 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-04-16 12:56:04 +0300 |
commit | 4bef49e32b6d4d9df496b2b54a78b66b11df7334 (patch) | |
tree | c22698cc25669ea0c55628b03e69749b5c306648 /source/blender/modifiers/intern/MOD_nodes.cc | |
parent | ca37d8485c73ebc050e49c6bce2f73756c7578e3 (diff) |
Fix T87169: support attribute search on group nodes
Diffstat (limited to 'source/blender/modifiers/intern/MOD_nodes.cc')
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 71 |
1 files changed, 32 insertions, 39 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 02a1dc07c93..3481b1c75d9 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -462,10 +462,6 @@ class GeometryNodesEvaluator { { const bNode &bnode = params.node(); - if (DEG_is_active(depsgraph_)) { - this->store_ui_hints(node, params); - } - /* Use the geometry-node-execute callback if it exists. */ if (bnode.typeinfo->geometry_node_execute != nullptr) { bnode.typeinfo->geometry_node_execute(params); @@ -483,41 +479,6 @@ class GeometryNodesEvaluator { this->execute_unknown_node(node, params); } - void store_ui_hints(const DNode node, GeoNodeExecParams params) const - { - for (const InputSocketRef *socket_ref : node->inputs()) { - if (!socket_ref->is_available()) { - continue; - } - if (socket_ref->bsocket()->type != SOCK_GEOMETRY) { - continue; - } - if (socket_ref->is_multi_input_socket()) { - /* Not needed currently. */ - continue; - } - - bNodeTree *btree_cow = node->btree(); - bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); - const NodeTreeEvaluationContext context(*self_object_, *modifier_); - - const GeometrySet &geometry_set = params.get_input<GeometrySet>(socket_ref->identifier()); - - blender::bke::geometry_set_instances_attribute_foreach( - geometry_set, - [&](StringRefNull attribute_name, const AttributeMetaData &meta_data) { - BKE_nodetree_attribute_hint_add(*btree_original, - context, - *node->bnode(), - attribute_name, - meta_data.domain, - meta_data.data_type); - return true; - }, - 8); - } - } - void execute_multi_function_node(const DNode node, GeoNodeExecParams params, const MultiFunction &fn) @@ -1239,6 +1200,37 @@ static void log_preview_socket_value(const Span<GPointer> values, } } +static void log_ui_hints(const DSocket socket, + const Span<GPointer> values, + Object *self_object, + NodesModifierData *nmd) +{ + const DNode node = socket.node(); + if (node->is_reroute_node() || socket->typeinfo()->type != SOCK_GEOMETRY) { + return; + } + bNodeTree *btree_cow = node->btree(); + bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow); + const NodeTreeEvaluationContext context{*self_object, nmd->modifier}; + for (const GPointer data : values) { + if (data.type() == &CPPType::get<GeometrySet>()) { + const GeometrySet &geometry_set = *(const GeometrySet *)data.get(); + blender::bke::geometry_set_instances_attribute_foreach( + geometry_set, + [&](StringRefNull attribute_name, const AttributeMetaData &meta_data) { + BKE_nodetree_attribute_hint_add(*btree_original, + context, + *node->bnode(), + attribute_name, + meta_data.domain, + meta_data.data_type); + return true; + }, + 8); + } + } +} + /** * Evaluate a node group to compute the output geometry. * Currently, this uses a fairly basic and inefficient algorithm that might compute things more @@ -1305,6 +1297,7 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree, if (!keys.is_empty()) { log_preview_socket_value(values, ctx->object, keys); } + log_ui_hints(socket, values, ctx->object, nmd); }; GeometryNodesEvaluator evaluator{group_inputs, |