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:
parent
d05909a70c
commit
e0d70e6a9d
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue