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:
authorJacques Lucke <jacques@blender.org>2021-04-16 12:56:04 +0300
committerJacques Lucke <jacques@blender.org>2021-04-16 12:56:04 +0300
commit4bef49e32b6d4d9df496b2b54a78b66b11df7334 (patch)
treec22698cc25669ea0c55628b03e69749b5c306648
parentca37d8485c73ebc050e49c6bce2f73756c7578e3 (diff)
Fix T87169: support attribute search on group nodes
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc71
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,