[Bf-blender-cvs] [e0d70e6a9d3] master: Nodes: avoid processing same node group multiple times to find textures

Jacques Lucke noreply at git.blender.org
Fri Jan 6 15:20:36 CET 2023


Commit: e0d70e6a9d38812301d5c64f3586f8ca6ecc6ee9
Author: Jacques Lucke
Date:   Fri Jan 6 15:20:04 2023 +0100
Branches: master
https://developer.blender.org/rBe0d70e6a9d38812301d5c64f3586f8ca6ecc6ee9

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.

===================================================================

M	source/blender/editors/space_buttons/buttons_texture.cc

===================================================================

diff --git a/source/blender/editors/space_buttons/buttons_texture.cc b/source/blender/editors/space_buttons/buttons_texture.cc
index 277402f1572..b4424474ebc 100644
--- a/source/blender/editors/space_buttons/buttons_texture.cc
+++ b/source/blender/editors/space_buttons/buttons_texture.cc
@@ -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 {



More information about the Bf-blender-cvs mailing list