Fix #106760: Bool node socket default value isn't output for shader nodes #109576

Merged
Brecht Van Lommel merged 3 commits from Consta/blender:bool-socket-fix into blender-v4.0-release 2023-10-05 21:55:18 +02:00
5 changed files with 21 additions and 4 deletions

View File

@ -190,6 +190,7 @@ static SocketType::Type convert_socket_type(BL::NodeSocket &b_socket)
switch (b_socket.type()) {
case BL::NodeSocket::type_VALUE:
return SocketType::FLOAT;
case BL::NodeSocket::type_BOOLEAN:
case BL::NodeSocket::type_INT:
return SocketType::INT;
case BL::NodeSocket::type_VECTOR:

View File

@ -169,9 +169,10 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, const eGPUType
static const char *gpu_uniform_set_function_from_type(eNodeSocketDatatype type)
{
switch (type) {
/* For now INT is supported as float. */
/* For now INT & BOOL are supported as float. */
case SOCK_INT:
case SOCK_FLOAT:
case SOCK_BOOLEAN:
return "set_value";
case SOCK_VECTOR:
return "set_rgb";

View File

@ -23,8 +23,8 @@
static int node_exec_socket_use_stack(bNodeSocket *sock)
{
/* NOTE: INT supported as FLOAT. Only for EEVEE. */
return ELEM(sock->type, SOCK_INT, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_SHADER);
/* NOTE: INT and BOOL supported as FLOAT. Only for EEVEE. */
return ELEM(sock->type, SOCK_INT, SOCK_BOOLEAN, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_SHADER);
}
bNodeStack *node_get_socket_stack(bNodeStack *stack, bNodeSocket *sock)

View File

@ -276,6 +276,7 @@ static bool ntree_shader_expand_socket_default(bNodeTree *localtree,
bNodeSocketValueRGBA *src_rgba, *dst_rgba;
bNodeSocketValueFloat *src_float, *dst_float;
bNodeSocketValueInt *src_int;
bNodeSocketValueBoolean *src_bool;
switch (socket->type) {
case SOCK_VECTOR:
@ -295,6 +296,15 @@ static bool ntree_shader_expand_socket_default(bNodeTree *localtree,
dst_rgba = static_cast<bNodeSocketValueRGBA *>(value_socket->default_value);
copy_v4_v4(dst_rgba->value, src_rgba->value);
break;
case SOCK_BOOLEAN:
/* HACK: Support as float. */
value_node = nodeAddStaticNode(nullptr, localtree, SH_NODE_VALUE);
value_socket = ntree_shader_node_find_output(value_node, "Value");
BLI_assert(value_socket != nullptr);
src_bool = static_cast<bNodeSocketValueBoolean *>(socket->default_value);
dst_float = static_cast<bNodeSocketValueFloat *>(value_socket->default_value);
dst_float->value = float(src_bool->value);
break;
case SOCK_INT:
/* HACK: Support as float. */
value_node = nodeAddStaticNode(nullptr, localtree, SH_NODE_VALUE);

View File

@ -164,6 +164,9 @@ void node_gpu_stack_from_data(GPUNodeStack *gs, int type, bNodeStack *ns)
else if (type == SOCK_INT) {
gs->type = GPU_FLOAT; /* HACK: Support as float. */
}
else if (type == SOCK_BOOLEAN) {
gs->type = GPU_FLOAT; /* HACK: Support as float. */
}
else if (type == SOCK_VECTOR) {
gs->type = GPU_VEC3;
}
@ -208,7 +211,9 @@ static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNode
{
int i = 0;
LISTBASE_FOREACH (bNodeSocket *, socket, sockets) {
if (ELEM(socket->type, SOCK_FLOAT, SOCK_INT, SOCK_VECTOR, SOCK_RGBA, SOCK_SHADER)) {
if (ELEM(
socket->type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_SHADER))
{
node_data_from_gpu_stack(ns[i], &gs[i]);
i++;
}