diff options
author | Charlie Jolly <charlie> | 2021-10-14 16:18:24 +0300 |
---|---|---|
committer | Charlie Jolly <mistajolly@gmail.com> | 2021-10-14 16:19:32 +0300 |
commit | 25a255c32a73b9d964d9f8a4733c4a42dfdc2f4f (patch) | |
tree | 4259bd7d57353c2664d1c095d1800d3bcacfaa32 | |
parent | 138aa209592ef3c2232007a9723659116d986d16 (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.cc | 3 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 24 | ||||
-rw-r--r-- | source/blender/nodes/NOD_socket_declarations.hh | 11 | ||||
-rw-r--r-- | source/blender/nodes/geometry/node_geometry_tree.cc | 1 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_socket.cc | 17 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_util.c | 8 |
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: |