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:
authorCharlie Jolly <charlie>2021-10-14 16:18:24 +0300
committerCharlie Jolly <mistajolly@gmail.com>2021-10-14 16:19:32 +0300
commit25a255c32a73b9d964d9f8a4733c4a42dfdc2f4f (patch)
tree4259bd7d57353c2664d1c095d1800d3bcacfaa32
parent138aa209592ef3c2232007a9723659116d986d16 (diff)
Nodes: add boilerplate for image sockets
The sockets are not exposed in any nodes yet. They work similar to the Object/Collection/Texture sockets, which also just reference a data block. Based on rB207472930834 Reviewed By: JacquesLucke Differential Revision: https://developer.blender.org/D12861
-rw-r--r--source/blender/editors/space_node/node_draw.cc3
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc24
-rw-r--r--source/blender/nodes/NOD_socket_declarations.hh11
-rw-r--r--source/blender/nodes/geometry/node_geometry_tree.cc1
-rw-r--r--source/blender/nodes/intern/node_socket.cc17
-rw-r--r--source/blender/nodes/intern/node_util.c8
6 files changed, 62 insertions, 2 deletions
diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index 97e5bdd93c1..4e879d6c2f7 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -916,6 +916,9 @@ static void create_inspection_string_for_generic_value(const geo_log::GenericVal
else if (type.is<Tex *>()) {
id_to_inspection_string((ID *)*value.get<Tex *>(), ID_TE);
}
+ else if (type.is<Image *>()) {
+ id_to_inspection_string((ID *)*value.get<Image *>(), ID_IM);
+ }
else if (type.is<Collection *>()) {
id_to_inspection_string((ID *)*value.get<Collection *>(), ID_GR);
}
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index d294491d51c..ebccbb3d2cd 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -151,6 +151,12 @@ static void addIdsUsedBySocket(const ListBase *sockets, Set<ID *> &ids)
ids.add(&texture->id);
}
}
+ else if (socket->type == SOCK_IMAGE) {
+ Image *image = ((bNodeSocketValueImage *)socket->default_value)->value;
+ if (image != nullptr) {
+ ids.add(&image->id);
+ }
+ }
}
}
@@ -236,6 +242,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
add_collection_relation(ctx, *collection);
break;
}
+ case ID_IM:
case ID_TE: {
DEG_add_generic_id_relation(ctx->node, id, "Nodes Modifier");
}
@@ -420,6 +427,12 @@ static IDProperty *id_property_create_from_socket(const bNodeSocket &socket)
idprop.id = (ID *)value->value;
return IDP_New(IDP_ID, &idprop, socket.identifier);
}
+ case SOCK_IMAGE: {
+ bNodeSocketValueImage *value = (bNodeSocketValueImage *)socket.default_value;
+ IDPropertyTemplate idprop = {0};
+ idprop.id = (ID *)value->value;
+ return IDP_New(IDP_ID, &idprop, socket.identifier);
+ }
case SOCK_MATERIAL: {
bNodeSocketValueMaterial *value = (bNodeSocketValueMaterial *)socket.default_value;
IDPropertyTemplate idprop = {0};
@@ -448,6 +461,7 @@ static bool id_property_type_matches_socket(const bNodeSocket &socket, const IDP
case SOCK_OBJECT:
case SOCK_COLLECTION:
case SOCK_TEXTURE:
+ case SOCK_IMAGE:
case SOCK_MATERIAL:
return property.type == IDP_ID;
}
@@ -517,6 +531,12 @@ static void init_socket_cpp_value_from_property(const IDProperty &property,
*(Tex **)r_value = texture;
break;
}
+ case SOCK_IMAGE: {
+ ID *id = IDP_Id(&property);
+ Image *image = (id && GS(id->name) == ID_IM) ? (Image *)id : nullptr;
+ *(Image **)r_value = image;
+ break;
+ }
case SOCK_MATERIAL: {
ID *id = IDP_Id(&property);
Material *material = (id && GS(id->name) == ID_MA) ? (Material *)id : nullptr;
@@ -1145,6 +1165,10 @@ static void draw_property_for_socket(uiLayout *layout,
uiItemPointerR(layout, md_ptr, rna_path, bmain_ptr, "textures", socket.name, ICON_TEXTURE);
break;
}
+ case SOCK_IMAGE: {
+ uiItemPointerR(layout, md_ptr, rna_path, bmain_ptr, "images", socket.name, ICON_IMAGE);
+ break;
+ }
default: {
if (input_has_attribute_toggle(*nmd->node_group, socket_index)) {
const std::string rna_path_use_attribute = "[\"" + std::string(socket_id_esc) +
diff --git a/source/blender/nodes/NOD_socket_declarations.hh b/source/blender/nodes/NOD_socket_declarations.hh
index 00874cad766..e22b96cd1ff 100644
--- a/source/blender/nodes/NOD_socket_declarations.hh
+++ b/source/blender/nodes/NOD_socket_declarations.hh
@@ -193,6 +193,13 @@ class Texture : public IDSocketDeclaration {
Texture();
};
+class Image : public IDSocketDeclaration {
+ public:
+ using Builder = SocketDeclarationBuilder<Image>;
+
+ Image();
+};
+
class Geometry : public SocketDeclaration {
public:
using Builder = SocketDeclarationBuilder<Geometry>;
@@ -339,6 +346,10 @@ inline Texture::Texture() : IDSocketDeclaration("NodeSocketTexture")
{
}
+inline Image::Image() : IDSocketDeclaration("NodeSocketImage")
+{
+}
+
/** \} */
} // namespace blender::nodes::decl
diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc b/source/blender/nodes/geometry/node_geometry_tree.cc
index 20b610a4db9..9747bb63773 100644
--- a/source/blender/nodes/geometry/node_geometry_tree.cc
+++ b/source/blender/nodes/geometry/node_geometry_tree.cc
@@ -109,6 +109,7 @@ static bool geometry_node_tree_socket_type_valid(bNodeTreeType *UNUSED(ntreetype
SOCK_GEOMETRY,
SOCK_COLLECTION,
SOCK_TEXTURE,
+ SOCK_IMAGE,
SOCK_MATERIAL);
}
diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc
index 4334f1b5030..11356178d87 100644
--- a/source/blender/nodes/intern/node_socket.cc
+++ b/source/blender/nodes/intern/node_socket.cc
@@ -808,6 +808,7 @@ static bNodeSocketType *make_socket_type_string()
MAKE_CPP_TYPE(Object, Object *, CPPTypeFlags::BasicType)
MAKE_CPP_TYPE(Collection, Collection *, CPPTypeFlags::BasicType)
MAKE_CPP_TYPE(Texture, Tex *, CPPTypeFlags::BasicType)
+MAKE_CPP_TYPE(Image, Image *, CPPTypeFlags::BasicType)
MAKE_CPP_TYPE(Material, Material *, CPPTypeFlags::BasicType)
static bNodeSocketType *make_socket_type_object()
@@ -858,6 +859,18 @@ static bNodeSocketType *make_socket_type_texture()
return socktype;
}
+static bNodeSocketType *make_socket_type_image()
+{
+ bNodeSocketType *socktype = make_standard_socket_type(SOCK_IMAGE, PROP_NONE);
+ socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<Image *>(); };
+ socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) {
+ *(Image **)r_value = ((bNodeSocketValueImage *)socket.default_value)->value;
+ };
+ socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type;
+ socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value;
+ return socktype;
+}
+
static bNodeSocketType *make_socket_type_material()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATERIAL, PROP_NONE);
@@ -906,14 +919,14 @@ void register_standard_node_socket_types(void)
nodeRegisterSocketType(make_socket_type_object());
- nodeRegisterSocketType(make_standard_socket_type(SOCK_IMAGE, PROP_NONE));
-
nodeRegisterSocketType(make_socket_type_geometry());
nodeRegisterSocketType(make_socket_type_collection());
nodeRegisterSocketType(make_socket_type_texture());
+ nodeRegisterSocketType(make_socket_type_image());
+
nodeRegisterSocketType(make_socket_type_material());
nodeRegisterSocketType(make_socket_type_virtual());
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 1aec280fd2b..ba0cfeacb83 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -467,6 +467,14 @@ static int node_datatype_priority(eNodeSocketDatatype from, eNodeSocketDatatype
return -1;
}
}
+ case SOCK_IMAGE: {
+ switch (from) {
+ case SOCK_IMAGE:
+ return 1;
+ default:
+ return -1;
+ }
+ }
case SOCK_MATERIAL: {
switch (from) {
case SOCK_MATERIAL: