Nodes: add boilerplate for texture and material sockets

The sockets are not exposed in any nodes yet.
They work similar to the Object/Collection sockets, which also
just reference a data block.

This is part of D11222.
This commit is contained in:
2021-05-12 12:41:21 +02:00
parent a43a455fdd
commit 2074729308
8 changed files with 251 additions and 0 deletions

View File

@@ -291,6 +291,22 @@ void node_socket_init_default_value(bNodeSocket *sock)
sizeof(bNodeSocketValueCollection), "node socket value object");
dval->value = nullptr;
sock->default_value = dval;
break;
}
case SOCK_TEXTURE: {
bNodeSocketValueTexture *dval = (bNodeSocketValueTexture *)MEM_callocN(
sizeof(bNodeSocketValueTexture), "node socket value texture");
dval->value = nullptr;
sock->default_value = dval;
break;
}
case SOCK_MATERIAL: {
bNodeSocketValueMaterial *dval = (bNodeSocketValueMaterial *)MEM_callocN(
sizeof(bNodeSocketValueMaterial), "node socket value material");
dval->value = nullptr;
sock->default_value = dval;
break;
}
@@ -373,6 +389,13 @@ void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from)
id_us_plus(&toval->value->id);
break;
}
case SOCK_TEXTURE: {
bNodeSocketValueTexture *toval = (bNodeSocketValueTexture *)to->default_value;
bNodeSocketValueTexture *fromval = (bNodeSocketValueTexture *)from->default_value;
*toval = *fromval;
id_us_plus(&toval->value->id);
break;
}
}
to->flag |= (from->flag & SOCK_HIDE_VALUE);
@@ -633,6 +656,8 @@ static bNodeSocketType *make_socket_type_string()
MAKE_CPP_TYPE(Object, Object *)
MAKE_CPP_TYPE(Collection, Collection *)
MAKE_CPP_TYPE(Texture, Tex *)
MAKE_CPP_TYPE(Material, Material *)
static bNodeSocketType *make_socket_type_object()
{
@@ -664,6 +689,26 @@ static bNodeSocketType *make_socket_type_collection()
return socktype;
}
static bNodeSocketType *make_socket_type_texture()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_TEXTURE, PROP_NONE);
socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Tex *>(); };
socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
*(Tex **)r_value = ((bNodeSocketValueTexture *)socket.default_value)->value;
};
return socktype;
}
static bNodeSocketType *make_socket_type_material()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATERIAL, PROP_NONE);
socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Material *>(); };
socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
*(Material **)r_value = ((bNodeSocketValueMaterial *)socket.default_value)->value;
};
return socktype;
}
void register_standard_node_socket_types(void)
{
/* draw callbacks are set in drawnode.c to avoid bad-level calls */
@@ -705,5 +750,9 @@ void register_standard_node_socket_types(void)
nodeRegisterSocketType(make_socket_type_collection());
nodeRegisterSocketType(make_socket_type_texture());
nodeRegisterSocketType(make_socket_type_material());
nodeRegisterSocketType(make_socket_type_virtual());
}

View File

@@ -459,6 +459,22 @@ static int node_datatype_priority(eNodeSocketDatatype from, eNodeSocketDatatype
return -1;
}
}
case SOCK_TEXTURE: {
switch (from) {
case SOCK_TEXTURE:
return 1;
default:
return -1;
}
}
case SOCK_MATERIAL: {
switch (from) {
case SOCK_MATERIAL:
return 1;
default:
return -1;
}
}
default:
return -1;
}