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:
parent
a43a455fdd
commit
2074729308
Notes:
blender-bot
2023-02-14 08:29:54 +01:00
Referenced by commit25a255c32a
, Nodes: add boilerplate for image sockets Referenced by commit2ad3a1c318
, Nodes: fix material node copied over when socket is copied
|
@ -303,6 +303,16 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
|
|||
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
|
||||
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
|
||||
BKE_LIB_FOREACHID_PROCESS(data, default_value->value, IDWALK_CB_USER);
|
||||
break;
|
||||
}
|
||||
case SOCK_FLOAT:
|
||||
case SOCK_VECTOR:
|
||||
case SOCK_RGBA:
|
||||
|
@ -434,6 +444,12 @@ static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *so
|
|||
case SOCK_COLLECTION:
|
||||
BLO_write_struct(writer, bNodeSocketValueCollection, sock->default_value);
|
||||
break;
|
||||
case SOCK_TEXTURE:
|
||||
BLO_write_struct(writer, bNodeSocketValueTexture, sock->default_value);
|
||||
break;
|
||||
case SOCK_MATERIAL:
|
||||
BLO_write_struct(writer, bNodeSocketValueMaterial, sock->default_value);
|
||||
break;
|
||||
case __SOCK_MESH:
|
||||
case SOCK_CUSTOM:
|
||||
case SOCK_SHADER:
|
||||
|
@ -820,6 +836,16 @@ static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSock
|
|||
BLO_read_id_address(reader, lib, &default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
|
||||
BLO_read_id_address(reader, lib, &default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
|
||||
BLO_read_id_address(reader, lib, &default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_FLOAT:
|
||||
case SOCK_VECTOR:
|
||||
case SOCK_RGBA:
|
||||
|
@ -905,6 +931,16 @@ static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock)
|
|||
BLO_expand(expander, default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
|
||||
BLO_expand(expander, default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
|
||||
BLO_expand(expander, default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_FLOAT:
|
||||
case SOCK_VECTOR:
|
||||
case SOCK_RGBA:
|
||||
|
@ -1472,6 +1508,16 @@ static void socket_id_user_increment(bNodeSocket *sock)
|
|||
id_us_plus((ID *)default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
|
||||
id_us_plus((ID *)default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
|
||||
id_us_plus((ID *)default_value->value);
|
||||
break;
|
||||
}
|
||||
case SOCK_FLOAT:
|
||||
case SOCK_VECTOR:
|
||||
case SOCK_RGBA:
|
||||
|
@ -1511,6 +1557,20 @@ static void socket_id_user_decrement(bNodeSocket *sock)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
bNodeSocketValueTexture *default_value = (bNodeSocketValueTexture *)sock->default_value;
|
||||
if (default_value->value != nullptr) {
|
||||
id_us_min(&default_value->value->id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
bNodeSocketValueMaterial *default_value = (bNodeSocketValueMaterial *)sock->default_value;
|
||||
if (default_value->value != nullptr) {
|
||||
id_us_min(&default_value->value->id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SOCK_FLOAT:
|
||||
case SOCK_VECTOR:
|
||||
case SOCK_RGBA:
|
||||
|
@ -1654,6 +1714,10 @@ const char *nodeStaticSocketType(int type, int subtype)
|
|||
return "NodeSocketGeometry";
|
||||
case SOCK_COLLECTION:
|
||||
return "NodeSocketCollection";
|
||||
case SOCK_TEXTURE:
|
||||
return "NodeSocketTexture";
|
||||
case SOCK_MATERIAL:
|
||||
return "NodeSocketMaterial";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -1725,6 +1789,10 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
|
|||
return "NodeSocketInterfaceGeometry";
|
||||
case SOCK_COLLECTION:
|
||||
return "NodeSocketInterfaceCollection";
|
||||
case SOCK_TEXTURE:
|
||||
return "NodeSocketInterfaceTexture";
|
||||
case SOCK_MATERIAL:
|
||||
return "NodeSocketInterfaceMaterial";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -1557,6 +1557,12 @@ void DepsgraphNodeBuilder::build_nodetree_socket(bNodeSocket *socket)
|
|||
else if (socket->type == SOCK_COLLECTION) {
|
||||
build_id((ID *)((bNodeSocketValueCollection *)socket->default_value)->value);
|
||||
}
|
||||
else if (socket->type == SOCK_TEXTURE) {
|
||||
build_id((ID *)((bNodeSocketValueTexture *)socket->default_value)->value);
|
||||
}
|
||||
else if (socket->type == SOCK_MATERIAL) {
|
||||
build_id((ID *)((bNodeSocketValueMaterial *)socket->default_value)->value);
|
||||
}
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
|
||||
|
|
|
@ -2401,6 +2401,18 @@ void DepsgraphRelationBuilder::build_nodetree_socket(bNodeSocket *socket)
|
|||
build_collection(nullptr, nullptr, collection);
|
||||
}
|
||||
}
|
||||
else if (socket->type == SOCK_TEXTURE) {
|
||||
Tex *texture = ((bNodeSocketValueTexture *)socket->default_value)->value;
|
||||
if (texture != nullptr) {
|
||||
build_texture(texture);
|
||||
}
|
||||
}
|
||||
else if (socket->type == SOCK_MATERIAL) {
|
||||
Material *material = ((bNodeSocketValueMaterial *)socket->default_value)->value;
|
||||
if (material != nullptr) {
|
||||
build_material(material);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
|
||||
|
|
|
@ -3340,6 +3340,8 @@ static const float std_node_socket_colors[][4] = {
|
|||
{0.89, 0.76, 0.43, 1.0}, /* SOCK_IMAGE */
|
||||
{0.00, 0.84, 0.64, 1.0}, /* SOCK_GEOMETRY */
|
||||
{0.96, 0.96, 0.96, 1.0}, /* SOCK_COLLECTION */
|
||||
{0.50, 0.00, 0.00, 1.0}, /* SOCK_TEXTURE, TODO: Choose color. */
|
||||
{0.00, 0.50, 0.00, 1.0}, /* SOCK_MATERIAL, TODO: Choose color. */
|
||||
};
|
||||
|
||||
/* common color callbacks for standard types */
|
||||
|
@ -3480,6 +3482,14 @@ static void std_node_socket_draw(
|
|||
uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, text, 0);
|
||||
break;
|
||||
}
|
||||
case SOCK_TEXTURE: {
|
||||
uiTemplateID(layout, C, ptr, "default_value", "texture.new", NULL, NULL, 0, ICON_NONE, NULL);
|
||||
break;
|
||||
}
|
||||
case SOCK_MATERIAL: {
|
||||
uiItemR(layout, ptr, "default_value", DEFAULT_FLAGS, text, 0);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
node_socket_button_label(C, layout, ptr, node_ptr, text);
|
||||
break;
|
||||
|
|
|
@ -45,6 +45,8 @@ struct bNodePreview;
|
|||
struct bNodeTreeExec;
|
||||
struct bNodeType;
|
||||
struct uiBlock;
|
||||
struct Tex;
|
||||
struct Material;
|
||||
|
||||
#define NODE_MAXSTR 64
|
||||
|
||||
|
@ -165,6 +167,8 @@ typedef enum eNodeSocketDatatype {
|
|||
SOCK_IMAGE = 9,
|
||||
SOCK_GEOMETRY = 10,
|
||||
SOCK_COLLECTION = 11,
|
||||
SOCK_TEXTURE = 12,
|
||||
SOCK_MATERIAL = 13,
|
||||
} eNodeSocketDatatype;
|
||||
|
||||
/* socket shape */
|
||||
|
@ -593,6 +597,14 @@ typedef struct bNodeSocketValueCollection {
|
|||
struct Collection *value;
|
||||
} bNodeSocketValueCollection;
|
||||
|
||||
typedef struct bNodeSocketValueTexture {
|
||||
struct Tex *value;
|
||||
} bNodeSocketValueTexture;
|
||||
|
||||
typedef struct bNodeSocketValueMaterial {
|
||||
struct Material *value;
|
||||
} bNodeSocketValueMaterial;
|
||||
|
||||
/* data structs, for node->storage */
|
||||
enum {
|
||||
CMP_NODE_MASKTYPE_ADD = 0,
|
||||
|
|
|
@ -76,6 +76,8 @@ static const EnumPropertyItem node_socket_data_type_items[] = {
|
|||
{SOCK_IMAGE, "IMAGE", 0, "Image", ""},
|
||||
{SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
|
||||
{SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
|
||||
{SOCK_TEXTURE, "TEXTURE", 0, "Texture", ""},
|
||||
{SOCK_MATERIAL, "MATERIAL", 0, "Material", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -102,6 +104,8 @@ static const EnumPropertyItem node_socket_type_items[] = {
|
|||
{SOCK_IMAGE, "IMAGE", 0, "Image", ""},
|
||||
{SOCK_GEOMETRY, "GEOMETRY", 0, "Geometry", ""},
|
||||
{SOCK_COLLECTION, "COLLECTION", 0, "Collection", ""},
|
||||
{SOCK_TEXTURE, "TEXTURE", 0, "Texture", ""},
|
||||
{SOCK_MATERIAL, "MATERIAL", 0, "Material", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -10632,6 +10636,76 @@ static void rna_def_node_socket_collection(BlenderRNA *brna,
|
|||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
|
||||
}
|
||||
|
||||
static void rna_def_node_socket_texture(BlenderRNA *brna,
|
||||
const char *identifier,
|
||||
const char *interface_idname)
|
||||
{
|
||||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
|
||||
RNA_def_struct_ui_text(srna, "Texture Node Socket", "Texture socket of a node");
|
||||
RNA_def_struct_sdna(srna, "bNodeSocket");
|
||||
|
||||
RNA_def_struct_sdna_from(srna, "bNodeSocketValueTexture", "default_value");
|
||||
|
||||
prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_pointer_sdna(prop, NULL, "value");
|
||||
RNA_def_property_struct_type(prop, "Texture");
|
||||
RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
|
||||
RNA_def_property_update(
|
||||
prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
|
||||
|
||||
/* socket interface */
|
||||
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
|
||||
RNA_def_struct_ui_text(srna, "Texture Node Socket Interface", "Texture socket of a node");
|
||||
RNA_def_struct_sdna(srna, "bNodeSocket");
|
||||
|
||||
RNA_def_struct_sdna_from(srna, "bNodeSocketValueTexture", "default_value");
|
||||
|
||||
prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_pointer_sdna(prop, NULL, "value");
|
||||
RNA_def_property_struct_type(prop, "Texture");
|
||||
RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
|
||||
}
|
||||
|
||||
static void rna_def_node_socket_material(BlenderRNA *brna,
|
||||
const char *identifier,
|
||||
const char *interface_idname)
|
||||
{
|
||||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
|
||||
RNA_def_struct_ui_text(srna, "Material Node Socket", "Material socket of a node");
|
||||
RNA_def_struct_sdna(srna, "bNodeSocket");
|
||||
|
||||
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMaterial", "default_value");
|
||||
|
||||
prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_pointer_sdna(prop, NULL, "value");
|
||||
RNA_def_property_struct_type(prop, "Material");
|
||||
RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
|
||||
RNA_def_property_update(
|
||||
prop, NC_NODE | NA_EDITED, "rna_NodeSocketStandard_value_and_relation_update");
|
||||
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_REFCOUNT | PROP_CONTEXT_UPDATE);
|
||||
|
||||
/* socket interface */
|
||||
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
|
||||
RNA_def_struct_ui_text(srna, "Material Node Socket Interface", "Material socket of a node");
|
||||
RNA_def_struct_sdna(srna, "bNodeSocket");
|
||||
|
||||
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMaterial", "default_value");
|
||||
|
||||
prop = RNA_def_property(srna, "default_value", PROP_POINTER, PROP_NONE);
|
||||
RNA_def_property_pointer_sdna(prop, NULL, "value");
|
||||
RNA_def_property_struct_type(prop, "Material");
|
||||
RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
|
||||
}
|
||||
|
||||
static void rna_def_node_socket_standard_types(BlenderRNA *brna)
|
||||
{
|
||||
/* XXX Workaround: Registered functions are not exposed in python by bpy,
|
||||
|
@ -10776,6 +10850,10 @@ static void rna_def_node_socket_standard_types(BlenderRNA *brna)
|
|||
rna_def_node_socket_geometry(brna, "NodeSocketGeometry", "NodeSocketInterfaceGeometry");
|
||||
|
||||
rna_def_node_socket_collection(brna, "NodeSocketCollection", "NodeSocketInterfaceCollection");
|
||||
|
||||
rna_def_node_socket_texture(brna, "NodeSocketTexture", "NodeSocketInterfaceTexture");
|
||||
|
||||
rna_def_node_socket_material(brna, "NodeSocketMaterial", "NodeSocketInterfaceMaterial");
|
||||
}
|
||||
|
||||
static void rna_def_internal_node(BlenderRNA *brna)
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue