Fix #106760: Cycles OSL boolean socket not working

Pull Request: https://projects.blender.org/blender/blender/pulls/109576
This commit is contained in:
coyo_t 2023-10-05 21:55:10 +02:00 • committed by Philipp Oeser
parent 6aa562cf7a
commit a1bea1df6b
5 changed files with 18 additions and 3 deletions

View file

@ -189,6 +189,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

@ -168,9 +168,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

@ -22,8 +22,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

@ -270,6 +270,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:
@ -289,6 +290,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

@ -161,6 +161,9 @@ void node_gpu_stack_from_data(struct 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;
}