Fix T87169: support attribute search on group nodes
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user