Nodes: avoid processing same node group multiple times to find textures

This removes a lot of overhead when there are node groups that are
reused a lot and only need to be processed once.
This commit is contained in:
Jacques Lucke 2023-01-06 15:20:04 +01:00
parent d05909a70c
commit e0d70e6a9d
1 changed files with 13 additions and 7 deletions

View File

@ -154,18 +154,23 @@ static void buttons_texture_users_find_nodetree(ListBase *users,
}
}
static void buttons_texture_modifier_geonodes_users_add(Object *ob,
NodesModifierData *nmd,
bNodeTree *node_tree,
ListBase *users)
static void buttons_texture_modifier_geonodes_users_add(
Object *ob,
NodesModifierData *nmd,
bNodeTree *node_tree,
ListBase *users,
blender::Set<const bNodeTree *> &handled_groups)
{
PointerRNA ptr;
PropertyRNA *prop;
for (bNode *node : node_tree->all_nodes()) {
if (node->type == NODE_GROUP && node->id) {
/* Recurse into the node group */
buttons_texture_modifier_geonodes_users_add(ob, nmd, (bNodeTree *)node->id, users);
if (handled_groups.add(reinterpret_cast<bNodeTree *>(node->id))) {
/* Recurse into the node group */
buttons_texture_modifier_geonodes_users_add(
ob, nmd, (bNodeTree *)node->id, users, handled_groups);
}
}
LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
if (socket->flag & SOCK_UNAVAIL) {
@ -205,7 +210,8 @@ static void buttons_texture_modifier_foreach(void *userData,
if (md->type == eModifierType_Nodes) {
NodesModifierData *nmd = (NodesModifierData *)md;
if (nmd->node_group != nullptr) {
buttons_texture_modifier_geonodes_users_add(ob, nmd, nmd->node_group, users);
blender::Set<const bNodeTree *> handled_groups;
buttons_texture_modifier_geonodes_users_add(ob, nmd, nmd->node_group, users, handled_groups);
}
}
else {