[Bf-blender-cvs] [50b8e605d4c] builtin-simulation-nodes: Store pointer to object data block in object socket

Jacques Lucke noreply at git.blender.org
Thu Mar 12 13:20:43 CET 2020


Commit: 50b8e605d4c2ad5f4167b7630119855493eff63c
Author: Jacques Lucke
Date:   Thu Mar 12 13:20:21 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rB50b8e605d4c2ad5f4167b7630119855493eff63c

Store pointer to object data block in object socket

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

M	source/blender/blenkernel/intern/lib_query.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/space_node/drawnode.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/intern/node_socket.c

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

diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c
index 41d938e897d..9f8c6514add 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -200,6 +200,17 @@ static void library_foreach_idproperty_ID_link(LibraryForeachIDData *data,
   FOREACH_FINALIZE_VOID;
 }
 
+static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket *sock)
+{
+  library_foreach_idproperty_ID_link(data, sock->prop, IDWALK_CB_USER);
+
+  if (sock->type == SOCK_OBJECT) {
+    bNodeSocketValueObject *default_value = sock->default_value;
+    FOREACH_CALLBACK_INVOKE_ID_PP(data, (ID **)&default_value->object, IDWALK_CB_USER);
+    FOREACH_FINALIZE_VOID;
+  }
+}
+
 static void library_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSED(rbw),
                                                       ID **id_pointer,
                                                       void *user_data,
@@ -1023,18 +1034,18 @@ static void library_foreach_ID_link(Main *bmain,
 
           library_foreach_idproperty_ID_link(&data, node->prop, IDWALK_CB_USER);
           for (sock = node->inputs.first; sock; sock = sock->next) {
-            library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+            library_foreach_node_socket(&data, sock);
           }
           for (sock = node->outputs.first; sock; sock = sock->next) {
-            library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+            library_foreach_node_socket(&data, sock);
           }
         }
 
         for (sock = ntree->inputs.first; sock; sock = sock->next) {
-          library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+          library_foreach_node_socket(&data, sock);
         }
         for (sock = ntree->outputs.first; sock; sock = sock->next) {
-          library_foreach_idproperty_ID_link(&data, sock->prop, IDWALK_CB_USER);
+          library_foreach_node_socket(&data, sock);
         }
         break;
       }
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 6dccad16ff0..e90062e3611 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -759,6 +759,10 @@ void nodeModifySocketType(
   }
 
   if (sock->default_value) {
+    if (sock->type == SOCK_OBJECT) {
+      bNodeSocketValueObject *default_value = sock->default_value;
+      id_us_min(&default_value->object->id);
+    }
     MEM_freeN(sock->default_value);
     sock->default_value = NULL;
   }
@@ -1009,6 +1013,10 @@ static void node_socket_free(bNodeTree *UNUSED(ntree),
   }
 
   if (sock->default_value) {
+    if (sock->type == SOCK_OBJECT && do_id_user) {
+      bNodeSocketValueObject *default_value = sock->default_value;
+      id_us_min(&default_value->object->id);
+    }
     MEM_freeN(sock->default_value);
   }
 }
@@ -1295,6 +1303,13 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
 
   if (sock_src->default_value) {
     sock_dst->default_value = MEM_dupallocN(sock_src->default_value);
+
+    if (sock_dst->type == SOCK_OBJECT) {
+      if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
+        bNodeSocketValueObject *default_value = sock_dst->default_value;
+        id_us_plus(&default_value->object->id);
+      }
+    }
   }
 
   sock_dst->stack_index = 0;
@@ -2130,6 +2145,19 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
     if (node->id) {
       id_us_min(node->id);
     }
+
+    LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+      if (sock->default_value && sock->type == SOCK_OBJECT) {
+        bNodeSocketValueObject *default_value = sock->default_value;
+        id_us_min(&default_value->object->id);
+      }
+    }
+    LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+      if (sock->default_value && sock->type == SOCK_OBJECT) {
+        bNodeSocketValueObject *default_value = sock->default_value;
+        id_us_min(&default_value->object->id);
+      }
+    }
   }
 
   /* Remove animation data. */
@@ -2156,6 +2184,11 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *so
   }
 
   if (sock->default_value) {
+    if (sock->type == SOCK_OBJECT) {
+      bNodeSocketValueObject *default_value = sock->default_value;
+      id_us_min(&default_value->object->id);
+    }
+
     MEM_freeN(sock->default_value);
   }
 }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ee7cfe4f599..dab03976943 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3411,6 +3411,16 @@ static void lib_link_workspace_instance_hook(FileData *fd, WorkSpaceInstanceHook
 /** \name Read ID: Node Tree
  * \{ */
 
+static void lib_link_node_socket(FileData *fd, Library *lib, bNodeSocket *sock)
+{
+  IDP_LibLinkProperty(sock->prop, fd);
+
+  if (sock->type == SOCK_OBJECT) {
+    bNodeSocketValueObject *default_value = sock->default_value;
+    default_value->object = newlibadr(fd, lib, default_value->object);
+  }
+}
+
 /* Single node tree (also used for material/scene trees), ntree is not NULL */
 static void lib_link_ntree(FileData *fd, Library *lib, bNodeTree *ntree)
 {
@@ -3426,18 +3436,18 @@ static void lib_link_ntree(FileData *fd, Library *lib, bNodeTree *ntree)
     node->id = newlibadr(fd, lib, node->id);
 
     for (bNodeSocket *sock = node->inputs.first; sock; sock = sock->next) {
-      IDP_LibLinkProperty(sock->prop, fd);
+      lib_link_node_socket(fd, lib, sock);
     }
     for (bNodeSocket *sock = node->outputs.first; sock; sock = sock->next) {
-      IDP_LibLinkProperty(sock->prop, fd);
+      lib_link_node_socket(fd, lib, sock);
     }
   }
 
   for (bNodeSocket *sock = ntree->inputs.first; sock; sock = sock->next) {
-    IDP_LibLinkProperty(sock->prop, fd);
+    lib_link_node_socket(fd, lib, sock);
   }
   for (bNodeSocket *sock = ntree->outputs.first; sock; sock = sock->next) {
-    IDP_LibLinkProperty(sock->prop, fd);
+    lib_link_node_socket(fd, lib, sock);
   }
 
   /* Set node->typeinfo pointers. This is done in lib linking, after the
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index d6ad28adb1b..8d68ec6bc0e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -988,6 +988,9 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
     case SOCK_STRING:
       writestruct(wd, DATA, bNodeSocketValueString, 1, sock->default_value);
       break;
+    case SOCK_OBJECT:
+      writestruct(wd, DATA, bNodeSocketValueObject, 1, sock->default_value);
+      break;
     case __SOCK_MESH:
     case SOCK_CUSTOM:
     case SOCK_SHADER:
@@ -995,7 +998,6 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
     case SOCK_EVENTS:
     case SOCK_FORCES:
     case SOCK_CONTROL_FLOW:
-    case SOCK_OBJECT:
     case SOCK_IMAGE:
     case SOCK_SURFACE_HOOK:
       BLI_assert(false);
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 14d8ffa35fc..92107e61a3c 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3413,6 +3413,10 @@ static void std_node_socket_draw(
       uiItemR(row, ptr, "default_value", 0, "", 0);
       break;
     }
+    case SOCK_OBJECT: {
+      uiItemR(layout, ptr, "default_value", 0, text, 0);
+      break;
+    }
     default:
       node_socket_button_label(C, layout, ptr, node_ptr, text);
       break;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 15daaf93fb7..1a57684f17d 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -573,6 +573,10 @@ typedef struct bNodeSocketValueString {
   char value[1024];
 } bNodeSocketValueString;
 
+typedef struct bNodeSocketValueObject {
+  struct Object *object;
+} bNodeSocketValueObject;
+
 /* data structs, for node->storage */
 enum {
   CMP_NODE_MASKTYPE_ADD = 0,
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 9b34b726ea0..5d80da32306 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -8618,15 +8618,33 @@ static void rna_def_node_socket_object(BlenderRNA *brna,
                                        const char *interface_idname)
 {
   StructRNA *srna;
+  PropertyRNA *prop;
 
   srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
   RNA_def_struct_ui_text(srna, "Object Node Socket", "Object socket of a node");
   RNA_def_struct_sdna(srna, "bNodeSocket");
 
+  RNA_def_struct_sdna_from(srna, "bNodeSocketValueObject", "default_value");
+
+  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_sdna(prop, NULL, "object");
+  RNA_def_property_struct_type(prop, "Object");
+  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_update");
+  RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
+
   /* socket interface */
   srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
   RNA_def_struct_ui_text(srna, "Object Node Socket Interface", "Object socket of a node");
   RNA_def_struct_sdna(srna, "bNodeSocket");
+
+  RNA_def_struct_sdna_from(srna, "bNodeSocketValueObject", "default_value");
+
+  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_sdna(prop, NULL, "object");
+  RNA_def_property_struct_type(prop, "Object");
+  RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
 }
 
 static void rna_def_node_socket_image(BlenderRNA *brna,
diff --git a/source/blender/nodes/intern/

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list