Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/intern/node.c32
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc6
-rw-r--r--source/blender/editors/space_node/drawnode.c5
-rw-r--r--source/blender/makesdna/DNA_node_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c39
-rw-r--r--source/blender/nodes/intern/node_socket.cc24
-rw-r--r--source/blender/nodes/intern/node_util.c8
8 files changed, 123 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 61bfc09cc42..a90d2ea36c9 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -274,6 +274,11 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *default_value = sock->default_value;
+ BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
+ break;
+ }
case SOCK_FLOAT:
case SOCK_VECTOR:
case SOCK_RGBA:
@@ -373,6 +378,9 @@ static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *so
case SOCK_IMAGE:
BLO_write_struct(writer, bNodeSocketValueImage, sock->default_value);
break;
+ case SOCK_COLLECTION:
+ BLO_write_struct(writer, bNodeSocketValueCollection, sock->default_value);
+ break;
case __SOCK_MESH:
case SOCK_CUSTOM:
case SOCK_SHADER:
@@ -709,6 +717,11 @@ static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSock
BLO_read_id_address(reader, lib, &default_value->value);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueImage *default_value = sock->default_value;
+ BLO_read_id_address(reader, lib, &default_value->value);
+ break;
+ }
case SOCK_FLOAT:
case SOCK_VECTOR:
case SOCK_RGBA:
@@ -788,6 +801,11 @@ static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock)
BLO_expand(expander, default_value->value);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *default_value = sock->default_value;
+ BLO_expand(expander, default_value->value);
+ break;
+ }
case SOCK_FLOAT:
case SOCK_VECTOR:
case SOCK_RGBA:
@@ -1345,6 +1363,11 @@ static void socket_id_user_increment(bNodeSocket *sock)
id_us_plus((ID *)default_value->value);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *default_value = sock->default_value;
+ id_us_plus((ID *)default_value->value);
+ break;
+ }
case SOCK_FLOAT:
case SOCK_VECTOR:
case SOCK_RGBA:
@@ -1372,6 +1395,11 @@ static void socket_id_user_decrement(bNodeSocket *sock)
id_us_min(&default_value->value->id);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *default_value = sock->default_value;
+ id_us_min(&default_value->value->id);
+ break;
+ }
case SOCK_FLOAT:
case SOCK_VECTOR:
case SOCK_RGBA:
@@ -1511,6 +1539,8 @@ const char *nodeStaticSocketType(int type, int subtype)
return "NodeSocketImage";
case SOCK_GEOMETRY:
return "NodeSocketGeometry";
+ case SOCK_COLLECTION:
+ return "NodeSocketCollection";
}
return NULL;
}
@@ -1578,6 +1608,8 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
return "NodeSocketInterfaceImage";
case SOCK_GEOMETRY:
return "NodeSocketInterfaceGeometry";
+ case SOCK_COLLECTION:
+ return "NodeSocketInterfaceCollection";
}
return NULL;
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 5af70305e13..e5301532ddc 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1483,6 +1483,9 @@ void DepsgraphNodeBuilder::build_nodetree_socket(bNodeSocket *socket)
else if (socket->type == SOCK_IMAGE) {
build_id((ID *)((bNodeSocketValueImage *)socket->default_value)->value);
}
+ else if (socket->type == SOCK_COLLECTION) {
+ build_id((ID *)((bNodeSocketValueCollection *)socket->default_value)->value);
+ }
}
void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 11d34782569..04686823d62 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -2316,6 +2316,12 @@ void DepsgraphRelationBuilder::build_nodetree_socket(bNodeSocket *socket)
build_image(image);
}
}
+ else if (socket->type == SOCK_COLLECTION) {
+ Collection *collection = ((bNodeSocketValueCollection *)socket->default_value)->value;
+ if (collection != nullptr) {
+ build_collection(nullptr, nullptr, collection);
+ }
+ }
}
void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 0d371915316..f1ab433c639 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3414,6 +3414,7 @@ static const float std_node_socket_colors[][4] = {
{0.93, 0.62, 0.36, 1.0}, /* SOCK_OBJECT */
{0.89, 0.76, 0.43, 1.0}, /* SOCK_IMAGE */
{0.00, 0.84, 0.64, 1.0}, /* SOCK_GEOMETRY */
+ {0.96, 0.96, 0.96, 1.0}, /* SOCK_COLLECTION */
};
/* common color callbacks for standard types */
@@ -3537,6 +3538,10 @@ static void std_node_socket_draw(
uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, text, 0);
break;
}
+ case SOCK_COLLECTION: {
+ uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, 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 b8aeaa2bd89..e04867438f1 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -44,6 +44,7 @@ struct bNodePreview;
struct bNodeTreeExec;
struct bNodeType;
struct uiBlock;
+struct Collection;
#define NODE_MAXSTR 64
@@ -160,6 +161,7 @@ typedef enum eNodeSocketDatatype {
SOCK_OBJECT = 8,
SOCK_IMAGE = 9,
SOCK_GEOMETRY = 10,
+ SOCK_COLLECTION = 11,
} eNodeSocketDatatype;
/* socket shape */
@@ -580,6 +582,10 @@ typedef struct bNodeSocketValueImage {
struct Image *value;
} bNodeSocketValueImage;
+typedef struct bNodeSocketValueCollection {
+ struct Collection *value;
+} bNodeSocketValueCollection;
+
/* 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 6830c1a38c2..461b6af506a 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -85,6 +85,7 @@ static const EnumPropertyItem node_socket_type_items[] = {
{SOCK_OBJECT, "OBJECT", 0, "Object", ""},
{SOCK_IMAGE, "IMAGE", 0, "Image", ""},
{SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
+ {SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
{0, NULL, 0, NULL, NULL},
};
@@ -98,6 +99,7 @@ static const EnumPropertyItem node_socket_data_type_items[] = {
{SOCK_OBJECT, "OBJECT", 0, "Object", ""},
{SOCK_IMAGE, "IMAGE", 0, "Image", ""},
{SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
+ {SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
{0, NULL, 0, NULL, NULL},
};
@@ -9147,6 +9149,41 @@ static void rna_def_node_socket_geometry(BlenderRNA *brna,
RNA_def_struct_sdna(srna, "bNodeSocket");
}
+static void rna_def_node_socket_collection(BlenderRNA *brna,
+ const char *identifier,
+ const char *interface_idname)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
+ RNA_def_struct_ui_text(srna, "Collection Node Socket", "Collection socket of a node");
+ RNA_def_struct_sdna(srna, "bNodeSocket");
+
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueCollection", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "value");
+ RNA_def_property_struct_type(prop, "Collection");
+ 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_and_relation_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, "Collection Node Socket Interface", "Collection socket of a node");
+ RNA_def_struct_sdna(srna, "bNodeSocket");
+
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueCollection", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "value");
+ RNA_def_property_struct_type(prop, "Collection");
+ 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_standard_types(BlenderRNA *brna)
{
/* XXX Workaround: Registered functions are not exposed in python by bpy,
@@ -9287,6 +9324,8 @@ static void rna_def_node_socket_standard_types(BlenderRNA *brna)
rna_def_node_socket_image(brna, "NodeSocketImage", "NodeSocketInterfaceImage");
rna_def_node_socket_geometry(brna, "NodeSocketGeometry", "NodeSocketInterfaceGeometry");
+
+ rna_def_node_socket_collection(brna, "NodeSocketCollection", "NodeSocketInterfaceCollection");
}
static void rna_def_internal_node(BlenderRNA *brna)
diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc
index ebc70956147..fda44b3d4f2 100644
--- a/source/blender/nodes/intern/node_socket.cc
+++ b/source/blender/nodes/intern/node_socket.cc
@@ -280,6 +280,15 @@ void node_socket_init_default_value(bNodeSocket *sock)
sock->default_value = dval;
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *dval = (bNodeSocketValueCollection *)MEM_callocN(
+ sizeof(bNodeSocketValueCollection), "node socket value object");
+ dval->value = nullptr;
+
+ sock->default_value = dval;
+ break;
+ break;
+ }
}
}
@@ -352,6 +361,13 @@ void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from)
id_us_plus(&toval->value->id);
break;
}
+ case SOCK_COLLECTION: {
+ bNodeSocketValueCollection *toval = (bNodeSocketValueCollection *)to->default_value;
+ bNodeSocketValueCollection *fromval = (bNodeSocketValueCollection *)from->default_value;
+ *toval = *fromval;
+ id_us_plus(&toval->value->id);
+ break;
+ }
}
to->flag |= (from->flag & SOCK_HIDE_VALUE);
@@ -673,6 +689,12 @@ static bNodeSocketType *make_socket_type_geometry()
return socktype;
}
+static bNodeSocketType *make_socket_type_collection()
+{
+ bNodeSocketType *socktype = make_standard_socket_type(SOCK_COLLECTION, PROP_NONE);
+ return socktype;
+}
+
void register_standard_node_socket_types(void)
{
/* draw callbacks are set in drawnode.c to avoid bad-level calls */
@@ -711,5 +733,7 @@ void register_standard_node_socket_types(void)
nodeRegisterSocketType(make_socket_type_geometry());
+ nodeRegisterSocketType(make_socket_type_collection());
+
nodeRegisterSocketType(make_socket_type_virtual());
}
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 123347afc19..9669dc6496b 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -451,6 +451,14 @@ static int node_datatype_priority(eNodeSocketDatatype from, eNodeSocketDatatype
return -1;
}
}
+ case SOCK_COLLECTION: {
+ switch (from) {
+ case SOCK_COLLECTION:
+ return 1;
+ default:
+ return -1;
+ }
+ }
default:
return -1;
}