[Bf-blender-cvs] [66d255d8eda] temp-modifiers-instancing: improve support for object socket

Jacques Lucke noreply at git.blender.org
Tue Nov 10 18:09:36 CET 2020


Commit: 66d255d8edac239d37381d4f299fc68bfb71df4e
Author: Jacques Lucke
Date:   Tue Nov 10 17:31:00 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB66d255d8edac239d37381d4f299fc68bfb71df4e

improve support for object socket

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

M	source/blender/editors/space_node/drawnode.c
M	source/blender/modifiers/intern/MOD_nodes.cc
M	source/blender/nodes/NOD_derived_node_tree.hh
M	source/blender/nodes/intern/derived_node_tree.cc

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

diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 165e88242d1..4aaa6eeae35 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3352,7 +3352,7 @@ static const float std_node_socket_colors[][4] = {
     {0.0, 0.0, 0.0, 1.0},    /*__SOCK_MESH (deprecated) */
     {0.06, 0.52, 0.15, 1.0}, /* SOCK_INT */
     {0.39, 0.39, 0.39, 1.0}, /* SOCK_STRING */
-    {0.40, 0.10, 0.10, 1.0}, /* SOCK_OBJECT */
+    {0.85, 0.34, 0.11, 1.0}, /* SOCK_OBJECT */
     {0.10, 0.40, 0.10, 1.0}, /* SOCK_IMAGE */
     {0.00, 0.83, 0.64, 1.0}, /* SOCK_GEOMETRY */
 };
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 3f622dee782..5c62e29bf05 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -29,6 +29,7 @@
 
 #include "BLI_float3.hh"
 #include "BLI_listbase.h"
+#include "BLI_set.hh"
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
 
@@ -74,6 +75,12 @@
 
 using blender::float3;
 
+/* To be replaced soon. */
+using namespace blender;
+using namespace blender::nodes;
+using namespace blender::fn;
+using namespace blender::bke;
+
 static void initData(ModifierData *md)
 {
   NodesModifierData *nmd = (NodesModifierData *)md;
@@ -83,11 +90,49 @@ static void initData(ModifierData *md)
   MEMCPY_STRUCT_AFTER(nmd, DNA_struct_default_get(NodesModifierData), modifier);
 }
 
+static void addIdsUsedBySocket(const ListBase *sockets, Set<ID *> &ids)
+{
+  LISTBASE_FOREACH (const bNodeSocket *, socket, sockets) {
+    if (socket->type == SOCK_OBJECT) {
+      Object *object = ((bNodeSocketValueObject *)socket->default_value)->value;
+      if (object != nullptr) {
+        ids.add(&object->id);
+      }
+    }
+  }
+}
+
+static void findUsedIds(const bNodeTree &tree, Set<ID *> &ids)
+{
+  Set<const bNodeTree *> handled_groups;
+
+  LISTBASE_FOREACH (const bNode *, node, &tree.nodes) {
+    addIdsUsedBySocket(&node->inputs, ids);
+    addIdsUsedBySocket(&node->outputs, ids);
+
+    if (node->type == NODE_GROUP) {
+      const bNodeTree *group = (bNodeTree *)node->id;
+      if (group != nullptr && handled_groups.add(group)) {
+        findUsedIds(*group, ids);
+      }
+    }
+  }
+}
+
 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
   if (nmd->node_group != nullptr) {
     DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
+
+    Set<ID *> used_ids;
+    findUsedIds(*nmd->node_group, used_ids);
+    for (ID *id : used_ids) {
+      if (GS(id->name) == ID_OB) {
+        DEG_add_object_relation(ctx->node, (Object *)id, DEG_OB_COMP_TRANSFORM, "Nodes Modifier");
+        DEG_add_object_relation(ctx->node, (Object *)id, DEG_OB_COMP_GEOMETRY, "Nodes Modifier");
+      }
+    }
   }
 
   /* TODO: Add relations for IDs in settings. */
@@ -124,12 +169,6 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
   return false;
 }
 
-/* To be replaced soon. */
-using namespace blender;
-using namespace blender::nodes;
-using namespace blender::fn;
-using namespace blender::bke;
-
 class GeometryNodesEvaluator {
  private:
   LinearAllocator<> allocator_;
@@ -181,8 +220,6 @@ class GeometryNodesEvaluator {
     const int total_inputs = from_sockets.size() + from_group_inputs.size();
     BLI_assert(total_inputs <= 1);
 
-    const CPPType &type = *socket_cpp_type_get(*socket_to_compute.typeinfo());
-
     if (total_inputs == 0) {
       /* The input is not connected, use the value from the socket itself. */
       return get_unlinked_input_value(socket_to_compute);
@@ -660,18 +697,13 @@ static void initialize_group_input(NodesModifierData &nmd,
 
 static void fill_data_handle_map(const DerivedNodeTree &tree, PersistentDataHandleMap &handle_map)
 {
+  Set<ID *> used_ids;
+  findUsedIds(*tree.btree(), used_ids);
+
   int current_handle = 0;
-  for (const NodeTreeRef *tree_ref : tree.used_node_tree_refs()) {
-    for (const SocketRef *socket_ref : tree_ref->sockets()) {
-      const bNodeSocket *bsocket = socket_ref->bsocket();
-      if (bsocket->type == SOCK_OBJECT) {
-        Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
-        if (object != nullptr) {
-          handle_map.add(current_handle, object->id);
-          current_handle++;
-        }
-      }
-    }
+  for (ID *id : used_ids) {
+    handle_map.add(current_handle, *id);
+    current_handle++;
   }
 }
 
diff --git a/source/blender/nodes/NOD_derived_node_tree.hh b/source/blender/nodes/NOD_derived_node_tree.hh
index 6166df6dc61..e7ff5d6b9f8 100644
--- a/source/blender/nodes/NOD_derived_node_tree.hh
+++ b/source/blender/nodes/NOD_derived_node_tree.hh
@@ -187,11 +187,14 @@ class DerivedNodeTree : NonCopyable, NonMovable {
 
   MultiValueMap<const bNodeType *, DNode *> nodes_by_type_;
   VectorSet<const NodeTreeRef *> used_node_tree_refs_;
+  bNodeTree *btree_;
 
  public:
   DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs);
   ~DerivedNodeTree();
 
+  bNodeTree *btree() const;
+
   Span<const DNode *> nodes() const;
   Span<const DNode *> nodes_by_type(StringRefNull idname) const;
   Span<const DNode *> nodes_by_type(const bNodeType *nodetype) const;
@@ -497,6 +500,11 @@ inline int DParentNode::id() const
  * DerivedNodeTree inline methods.
  */
 
+inline bNodeTree *DerivedNodeTree::btree() const
+{
+  return btree_;
+}
+
 inline Span<const DNode *> DerivedNodeTree::nodes() const
 {
   return nodes_by_id_;
diff --git a/source/blender/nodes/intern/derived_node_tree.cc b/source/blender/nodes/intern/derived_node_tree.cc
index 6b4c447d393..69e417868fb 100644
--- a/source/blender/nodes/intern/derived_node_tree.cc
+++ b/source/blender/nodes/intern/derived_node_tree.cc
@@ -28,8 +28,10 @@ static const NodeTreeRef &get_tree_ref(NodeTreeRefMap &node_tree_refs, bNodeTree
                                           [&]() { return std::make_unique<NodeTreeRef>(btree); });
 }
 
-DerivedNodeTree::DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs)
+DerivedNodeTree::DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs) : btree_(btree)
 {
+  BLI_assert(btree != nullptr);
+
   const NodeTreeRef &main_tree_ref = get_tree_ref(node_tree_refs, btree);
   used_node_tree_refs_.add_new(&main_tree_ref);



More information about the Bf-blender-cvs mailing list