[Bf-blender-cvs] [04780894eda] builtin-simulation-nodes: store pointer to image in image socket

Jacques Lucke noreply at git.blender.org
Fri Mar 13 15:40:36 CET 2020


Commit: 04780894eda118bec213687ccfeb56eaabb8cdd4
Author: Jacques Lucke
Date:   Fri Mar 13 15:40:26 2020 +0100
Branches: builtin-simulation-nodes
https://developer.blender.org/rB04780894eda118bec213687ccfeb56eaabb8cdd4

store pointer to image in image 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 9f8c6514add..bfedf480065 100644
--- a/source/blender/blenkernel/intern/lib_query.c
+++ b/source/blender/blenkernel/intern/lib_query.c
@@ -207,8 +207,12 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
   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;
   }
+  else if (sock->type == SOCK_IMAGE) {
+    bNodeSocketValueImage *default_value = sock->default_value;
+    FOREACH_CALLBACK_INVOKE_ID_PP(data, (ID **)&default_value->image, IDWALK_CB_USER);
+  }
+  FOREACH_FINALIZE_VOID;
 }
 
 static void library_foreach_rigidbodyworldSceneLooper(struct RigidBodyWorld *UNUSED(rbw),
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 927d9950449..56cda21e994 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -763,6 +763,10 @@ void nodeModifySocketType(
       bNodeSocketValueObject *default_value = sock->default_value;
       id_us_min(&default_value->object->id);
     }
+    else if (sock->type == SOCK_IMAGE) {
+      bNodeSocketValueImage *default_value = sock->default_value;
+      id_us_min(&default_value->image->id);
+    }
     MEM_freeN(sock->default_value);
     sock->default_value = NULL;
   }
@@ -1013,9 +1017,15 @@ 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);
+    if (do_id_user) {
+      if (sock->type == SOCK_OBJECT) {
+        bNodeSocketValueObject *default_value = sock->default_value;
+        id_us_min(&default_value->object->id);
+      }
+      else if (sock->type == SOCK_IMAGE) {
+        bNodeSocketValueImage *default_value = sock->default_value;
+        id_us_min(&default_value->image->id);
+      }
     }
     MEM_freeN(sock->default_value);
   }
@@ -1304,11 +1314,15 @@ 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) {
+    if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
+      if (sock_dst->type == SOCK_OBJECT) {
         bNodeSocketValueObject *default_value = sock_dst->default_value;
         id_us_plus(&default_value->object->id);
       }
+      else if (sock_dst->type == SOCK_IMAGE) {
+        bNodeSocketValueImage *default_value = sock_dst->default_value;
+        id_us_plus(&default_value->image->id);
+      }
     }
   }
 
@@ -2132,16 +2146,24 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
     }
 
     LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
-      if (sock->default_value && sock->type == SOCK_OBJECT) {
+      if (sock->type == SOCK_OBJECT) {
         bNodeSocketValueObject *default_value = sock->default_value;
         id_us_min(&default_value->object->id);
       }
+      else if (sock->type == SOCK_IMAGE) {
+        bNodeSocketValueImage *default_value = sock->default_value;
+        id_us_min(&default_value->image->id);
+      }
     }
     LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
-      if (sock->default_value && sock->type == SOCK_OBJECT) {
+      if (sock->type == SOCK_OBJECT) {
         bNodeSocketValueObject *default_value = sock->default_value;
         id_us_min(&default_value->object->id);
       }
+      else if (sock->type == SOCK_IMAGE) {
+        bNodeSocketValueImage *default_value = sock->default_value;
+        id_us_min(&default_value->image->id);
+      }
     }
   }
 
@@ -2173,6 +2195,10 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree), bNodeSocket *so
       bNodeSocketValueObject *default_value = sock->default_value;
       id_us_min(&default_value->object->id);
     }
+    else if (sock->type == SOCK_IMAGE) {
+      bNodeSocketValueImage *default_value = sock->default_value;
+      id_us_min(&default_value->image->id);
+    }
 
     MEM_freeN(sock->default_value);
   }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 241e0797828..6a4620596ef 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3419,6 +3419,10 @@ static void lib_link_node_socket(FileData *fd, Library *lib, bNodeSocket *sock)
     bNodeSocketValueObject *default_value = sock->default_value;
     default_value->object = newlibadr(fd, lib, default_value->object);
   }
+  else if (sock->type == SOCK_IMAGE) {
+    bNodeSocketValueImage *default_value = sock->default_value;
+    default_value->image = newlibadr(fd, lib, default_value->image);
+  }
 }
 
 /* Single node tree (also used for material/scene trees), ntree is not NULL */
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a3e5046c905..471681d1e44 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -991,6 +991,9 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
     case SOCK_OBJECT:
       writestruct(wd, DATA, bNodeSocketValueObject, 1, sock->default_value);
       break;
+    case SOCK_IMAGE:
+      writestruct(wd, DATA, bNodeSocketValueImage, 1, sock->default_value);
+      break;
     case __SOCK_MESH:
     case SOCK_CUSTOM:
     case SOCK_SHADER:
@@ -998,7 +1001,6 @@ static void write_node_socket_default_value(WriteData *wd, bNodeSocket *sock)
     case SOCK_EVENTS:
     case SOCK_FORCES:
     case SOCK_CONTROL_FLOW:
-    case SOCK_IMAGE:
     case SOCK_SURFACE_HOOK:
       BLI_assert(false);
       break;
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 92107e61a3c..f657a04b28f 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3417,6 +3417,10 @@ static void std_node_socket_draw(
       uiItemR(layout, ptr, "default_value", 0, text, 0);
       break;
     }
+    case SOCK_IMAGE: {
+      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 1a57684f17d..6ea7145e231 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -577,6 +577,10 @@ typedef struct bNodeSocketValueObject {
   struct Object *object;
 } bNodeSocketValueObject;
 
+typedef struct bNodeSocketValueImage {
+  struct Image *image;
+} bNodeSocketValueImage;
+
 /* 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 5d80da32306..4296fee9ab3 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -8652,15 +8652,33 @@ static void rna_def_node_socket_image(BlenderRNA *brna,
                                       const char *interface_idname)
 {
   StructRNA *srna;
+  PropertyRNA *prop;
 
   srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
   RNA_def_struct_ui_text(srna, "Image Node Socket", "Image socket of a node");
   RNA_def_struct_sdna(srna, "bNodeSocket");
 
+  RNA_def_struct_sdna_from(srna, "bNodeSocketValueImage", "default_value");
+
+  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_sdna(prop, NULL, "image");
+  RNA_def_property_struct_type(prop, "Image");
+  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, "Image Node Socket Interface", "Image socket of a node");
   RNA_def_struct_sdna(srna, "bNodeSocket");
+
+  RNA_def_struct_sdna_from(srna, "bNodeSocketValueImage", "default_value");
+
+  prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_sdna(prop, NULL, "image");
+  RNA_def_property_struct_type(prop, "Image");
+  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_surface_hook(BlenderRNA *brna,
diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c
index b04d0356f73..d79126ad54b 100644
--- a/source/blender/nodes/intern/node_socket.c
+++ b/source/blender/nodes/intern/node_socket.c
@@ -264,6 +264,14 @@ void node_socket_init_default_value(bNodeSocket *sock)
                                                  "node socket value object");
       dval->object = NULL;
 
+      sock->default_value = dval;
+      break;
+    }
+    case SOCK_IMAGE: {
+      bNodeSocketValueImage *dval = MEM_callocN(sizeof(bNodeSocketValueImage),
+                                                "node socket value image");
+      dval->image = NULL;
+
       sock->default_value = dval;
       break;
     }
@@ -331,6 +339,12 @@ void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from)
       toval->object = NULL;
       break;
     }
+    case SOCK_IMAGE: {
+      /* Not sure how to handle user count here yet. For now just don't copy the pointer. */
+      bNodeSocketValueImage *toval = to->default_value;
+      toval->image = NULL;
+      break;
+    }
   }
 
   to->fl

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list