Simplified base color for socket types #109288

Closed
Lukas Tönne wants to merge 1 commits from LukasTonne/blender:static-node-socket-type-color into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
4 changed files with 51 additions and 67 deletions

View File

@ -171,6 +171,7 @@ typedef struct bNodeSocketType {
struct PointerRNA *ptr,
struct PointerRNA *node_ptr,
float *r_color);
float base_color[4];
Review

Add comment saying that this is only used when draw_color is null, or when the context is not available, or when there is no socket instance.

Why base btw?

Add comment saying that this is only used when `draw_color` is null, or when the context is not available, or when there is no socket instance. Why `base` btw?
Review

I was thinking of how base_cpp_type and geometry_nodes_cpp_type works. It's implied that the complex type/color is a variation of the base type/color, even though they can be totally separate.

No strong feelings about the name, could be simple_color or just color. Will add more comments.

I was thinking of how `base_cpp_type` and `geometry_nodes_cpp_type` works. It's implied that the complex type/color is a variation of the base type/color, even though they can be totally separate. No strong feelings about the name, could be `simple_color` or just `color`. Will add more comments.
Review

Would use just color for now.

Would use just `color` for now.
void (*interface_draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr);
void (*interface_draw_color)(struct bContext *C, struct PointerRNA *ptr, float *r_color);

View File

@ -1113,17 +1113,6 @@ static void node_socket_undefined_draw(bContext * /*C*/,
uiItemL(layout, IFACE_("Undefined Socket Type"), ICON_ERROR);
}
static void node_socket_undefined_draw_color(bContext * /*C*/,
PointerRNA * /*ptr*/,
PointerRNA * /*node_ptr*/,
float *r_color)
{
r_color[0] = 1.0f;
r_color[1] = 0.0f;
r_color[2] = 0.0f;
r_color[3] = 1.0f;
}
static void node_socket_undefined_interface_draw(bContext * /*C*/,
uiLayout *layout,
PointerRNA * /*ptr*/)
@ -1131,16 +1120,6 @@ static void node_socket_undefined_interface_draw(bContext * /*C*/,
uiItemL(layout, IFACE_("Undefined Socket Type"), ICON_ERROR);
}
static void node_socket_undefined_interface_draw_color(bContext * /*C*/,
PointerRNA * /*ptr*/,
float *r_color)
{
r_color[0] = 1.0f;
r_color[1] = 0.0f;
r_color[2] = 0.0f;
r_color[3] = 1.0f;
}
/** \} */
} // namespace blender::ed::space_node
@ -1156,13 +1135,14 @@ void ED_node_init_butfuncs()
using blender::bke::NodeSocketTypeUndefined;
using blender::bke::NodeTypeUndefined;
static const float default_color[] = {1.0f, 0.0f, 0.0f, 1.0f};
NodeTypeUndefined.draw_buttons = nullptr;
NodeTypeUndefined.draw_buttons_ex = nullptr;
NodeSocketTypeUndefined.draw = node_socket_undefined_draw;
NodeSocketTypeUndefined.draw_color = node_socket_undefined_draw_color;
copy_v4_v4(NodeSocketTypeUndefined.base_color, default_color);
NodeSocketTypeUndefined.interface_draw = node_socket_undefined_interface_draw;
NodeSocketTypeUndefined.interface_draw_color = node_socket_undefined_interface_draw_color;
/* node type ui functions */
NODE_TYPES_BEGIN (ntype) {
@ -1208,23 +1188,6 @@ static const float std_node_socket_colors[][4] = {
{0.92, 0.46, 0.7, 1.0}, /* SOCK_ROTATION */
};
/* common color callbacks for standard types */
static void std_node_socket_draw_color(bContext * /*C*/,
PointerRNA *ptr,
PointerRNA * /*node_ptr*/,
float *r_color)
{
bNodeSocket *sock = (bNodeSocket *)ptr->data;
int type = sock->typeinfo->type;
copy_v4_v4(r_color, std_node_socket_colors[type]);
}
static void std_node_socket_interface_draw_color(bContext * /*C*/, PointerRNA *ptr, float *r_color)
{
bNodeSocket *sock = (bNodeSocket *)ptr->data;
int type = sock->typeinfo->type;
copy_v4_v4(r_color, std_node_socket_colors[type]);
}
/* draw function for file output node sockets,
* displays only sub-path and format, no value button */
static void node_file_output_socket_draw(bContext *C,
@ -1493,30 +1456,21 @@ static void std_node_socket_interface_draw(bContext * /*C*/, uiLayout *layout, P
}
}
static void node_socket_virtual_draw_color(bContext * /*C*/,
PointerRNA * /*ptr*/,
PointerRNA * /*node_ptr*/,
float *r_color)
{
copy_v4_v4(r_color, virtual_node_socket_color);
}
} // namespace blender::ed::space_node
void ED_init_standard_node_socket_type(bNodeSocketType *stype)
{
using namespace blender::ed::space_node;
stype->draw = std_node_socket_draw;
stype->draw_color = std_node_socket_draw_color;
copy_v4_v4(stype->base_color, std_node_socket_colors[stype->type]);
stype->interface_draw = std_node_socket_interface_draw;
stype->interface_draw_color = std_node_socket_interface_draw_color;
}
void ED_init_node_socket_type_virtual(bNodeSocketType *stype)
{
using namespace blender::ed::space_node;
stype->draw = node_socket_button_label;
stype->draw_color = node_socket_virtual_draw_color;
copy_v4_v4(stype->base_color, virtual_node_socket_color);
}
void ED_node_type_draw_color(const char *idname, float *r_color)
@ -1524,7 +1478,7 @@ void ED_node_type_draw_color(const char *idname, float *r_color)
using namespace blender::ed::space_node;
const bNodeSocketType *typeinfo = nodeSocketTypeFind(idname);
if (!typeinfo || typeinfo->type == SOCK_CUSTOM) {
if (!typeinfo) {
r_color[0] = 0.0f;
r_color[1] = 0.0f;
r_color[2] = 0.0f;
@ -1532,8 +1486,7 @@ void ED_node_type_draw_color(const char *idname, float *r_color)
return;
}
BLI_assert(typeinfo->type < ARRAY_SIZE(std_node_socket_colors));
copy_v4_v4(r_color, std_node_socket_colors[typeinfo->type]);
copy_v4_v4(r_color, typeinfo->base_color);
}
namespace blender::ed::space_node {

View File

@ -816,12 +816,16 @@ void node_socket_color_get(const bContext &C,
const bNodeSocket &sock,
float r_color[4])
{
PointerRNA ptr;
BLI_assert(RNA_struct_is_a(node_ptr.type, &RNA_Node));
RNA_pointer_create(
&const_cast<ID &>(ntree.id), &RNA_NodeSocket, &const_cast<bNodeSocket &>(sock), &ptr);
sock.typeinfo->draw_color((bContext *)&C, &ptr, &node_ptr, r_color);
if (sock.typeinfo->draw_color) {
PointerRNA ptr;
BLI_assert(RNA_struct_is_a(node_ptr.type, &RNA_Node));
RNA_pointer_create(
&const_cast<ID &>(ntree.id), &RNA_NodeSocket, &const_cast<bNodeSocket &>(sock), &ptr);
sock.typeinfo->draw_color((bContext *)&C, &ptr, &node_ptr, r_color);
}
else {
copy_v4_v4(r_color, sock.typeinfo->base_color);
}
}
static void create_inspection_string_for_generic_value(const bNodeSocket &socket,

View File

@ -3217,9 +3217,14 @@ static void rna_NodeSocketStandard_draw(ID *id,
static void rna_NodeSocketStandard_draw_color(
ID *id, bNodeSocket *sock, struct bContext *C, PointerRNA *nodeptr, float r_color[4])
{
PointerRNA ptr;
RNA_pointer_create(id, &RNA_NodeSocket, sock, &ptr);
sock->typeinfo->draw_color(C, &ptr, nodeptr, r_color);
if (sock->typeinfo->draw_color) {
PointerRNA ptr;
RNA_pointer_create(id, &RNA_NodeSocket, sock, &ptr);
sock->typeinfo->draw_color(C, &ptr, nodeptr, r_color);
}
else {
copy_v4_v4(r_color, sock->typeinfo->base_color);
}
}
static void rna_NodeSocketInterfaceStandard_draw(ID *id,
@ -3237,9 +3242,14 @@ static void rna_NodeSocketInterfaceStandard_draw_color(ID *id,
struct bContext *C,
float r_color[4])
{
PointerRNA ptr;
RNA_pointer_create(id, &RNA_NodeSocketInterface, sock, &ptr);
sock->typeinfo->interface_draw_color(C, &ptr, r_color);
if (sock->typeinfo->interface_draw_color) {
PointerRNA ptr;
RNA_pointer_create(id, &RNA_NodeSocketInterface, sock, &ptr);
sock->typeinfo->interface_draw_color(C, &ptr, r_color);
}
else {
copy_v4_v4(r_color, sock->typeinfo->base_color);
}
}
static void rna_NodeSocketStandard_float_range(
@ -11688,10 +11698,18 @@ static void rna_def_node_socket(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Subtype Label", "Label to display for the socket subtype in the UI");
prop = RNA_def_property(srna, "bl_base_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_float_sdna(prop, nullptr, "typeinfo->base_color");
RNA_def_property_array(prop, 4);
RNA_def_property_float_array_default(prop, default_draw_color);
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
RNA_def_property_ui_text(prop, "Base Color", "Color of the socket type");
/* draw socket */
func = RNA_def_function(srna, "draw", nullptr);
RNA_def_function_ui_description(func, "Draw socket");
RNA_def_function_flag(func, FUNC_REGISTER);
RNA_def_function_flag(func, PROP_REGISTER_OPTIONAL);
parm = RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE);
@ -11822,6 +11840,14 @@ static void rna_def_node_socket_interface(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Subtype Label", "Label to display for the socket subtype in the UI");
prop = RNA_def_property(srna, "bl_base_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_float_sdna(prop, nullptr, "typeinfo->base_color");
RNA_def_property_array(prop, 4);
RNA_def_property_float_array_default(prop, default_draw_color);
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
RNA_def_property_ui_text(prop, "Base Color", "Color of the socket type");
func = RNA_def_function(srna, "draw", nullptr);
RNA_def_function_ui_description(func, "Draw template settings");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);