Matrix operations and sockets for geometry nodes #105408

Closed
Lukas Tönne wants to merge 37 commits from LukasTonne/blender:nodes-matrix-types into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
12 changed files with 370 additions and 131 deletions
Showing only changes of commit 8bfd84a3c9 - Show all commits

View File

@ -311,8 +311,9 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
break;
}
}
@ -452,10 +453,13 @@ static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *so
case SOCK_MATERIAL:
BLO_write_struct(writer, bNodeSocketValueMaterial, sock->default_value);
break;
case SOCK_MATRIX3x3:
case SOCK_MATRIX_2X2:
BLO_write_struct(writer, bNodeSocketValueMatrix2x2, sock->default_value);
break;
case SOCK_MATRIX_3X3:
BLO_write_struct(writer, bNodeSocketValueMatrix3x3, sock->default_value);
break;
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
BLO_write_struct(writer, bNodeSocketValueMatrix4x4, sock->default_value);
break;
case SOCK_CUSTOM:
@ -881,8 +885,8 @@ static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSock
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
break;
}
}
@ -978,8 +982,9 @@ static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
break;
}
}
@ -1595,8 +1600,9 @@ static void socket_id_user_increment(bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
break;
}
}
@ -1656,8 +1662,9 @@ static bool socket_id_user_decrement(bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
break;
}
return false;
@ -1802,9 +1809,11 @@ const char *nodeStaticSocketType(int type, int subtype)
return "NodeSocketTexture";
case SOCK_MATERIAL:
return "NodeSocketMaterial";
case SOCK_MATRIX3x3:
case SOCK_MATRIX_2X2:
return "NodeSocketMatrix2x2";
case SOCK_MATRIX_3X3:
return "NodeSocketMatrix3x3";
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
return "NodeSocketMatrix4x4";
}
return nullptr;
@ -1883,9 +1892,11 @@ const char *nodeStaticSocketInterfaceType(int type, int subtype)
return "NodeSocketInterfaceTexture";
case SOCK_MATERIAL:
return "NodeSocketInterfaceMaterial";
case SOCK_MATRIX3x3:
case SOCK_MATRIX_2X2:
return "NodeSocketInterfaceMatrix2x2";
case SOCK_MATRIX_3X3:
return "NodeSocketInterfaceMatrix3x3";
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
return "NodeSocketInterfaceMatrix4x4";
}
return nullptr;
@ -1920,10 +1931,12 @@ const char *nodeStaticSocketLabel(int type, int /*subtype*/)
return "Texture";
case SOCK_MATERIAL:
return "Material";
case SOCK_MATRIX3x3:
return "Matrix3x3";
case SOCK_MATRIX4x4:
return "Matrix4x4";
case SOCK_MATRIX_2X2:
return "2x2 Matrix";
case SOCK_MATRIX_3X3:
return "3x3 Matrix";
case SOCK_MATRIX_4X4:
return "4x4 Matrix";
}
return nullptr;
}

View File

@ -72,7 +72,7 @@ namespace node_field_inferencing {
static bool is_field_socket_type(eNodeSocketDatatype type)
{
return ELEM(type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_MATRIX3x3, SOCK_MATRIX4x4);
return ELEM(type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA, SOCK_MATRIX_2X2, SOCK_MATRIX_3X3, SOCK_MATRIX_4X4);
}
static bool is_field_socket_type(const bNodeSocket &socket)

View File

@ -1200,8 +1200,9 @@ static const float std_node_socket_colors[][4] = {
{0.96, 0.96, 0.96, 1.0}, /* SOCK_COLLECTION */
{0.62, 0.31, 0.64, 1.0}, /* SOCK_TEXTURE */
{0.92, 0.46, 0.51, 1.0}, /* SOCK_MATERIAL */
{0.01, 0.61, 0.66, 1.0}, /* SOCK_MATRIX3x3 */
{0.01, 0.36, 0.62, 1.0}, /* SOCK_MATRIX4x4 */
{0.01, 0.61, 0.66, 1.0}, /* SOCK_MATRIX_2X2 */
{0.01, 0.61, 0.66, 1.0}, /* SOCK_MATRIX_3X3 */
{0.01, 0.61, 0.66, 1.0}, /* SOCK_MATRIX_4X4 */
};
/* common color callbacks for standard types */
@ -1322,16 +1323,9 @@ static void std_node_socket_draw(
}
}
break;
case SOCK_MATRIX3x3:
if (sock->flag & SOCK_COMPACT) {
uiTemplateComponentMenu(layout, ptr, "default_value", text);
}
else {
uiLayout *column = uiLayoutColumn(layout, true);
uiItemR(column, ptr, "default_value", DEFAULT_FLAGS, text, ICON_NONE);
}
break;
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
if (sock->flag & SOCK_COMPACT) {
uiTemplateComponentMenu(layout, ptr, "default_value", text);
}
@ -1470,14 +1464,9 @@ static void std_node_socket_interface_draw(bContext * /*C*/, uiLayout *layout, P
uiItemR(sub, ptr, "max_value", DEFAULT_FLAGS, IFACE_("Max"), ICON_NONE);
break;
}
case SOCK_MATRIX3x3: {
uiItemR(col, ptr, "default_value", DEFAULT_FLAGS, IFACE_("Default"), ICON_NONE);
uiLayout *sub = uiLayoutColumn(col, true);
uiItemR(sub, ptr, "min_value", DEFAULT_FLAGS, IFACE_("Min"), ICON_NONE);
uiItemR(sub, ptr, "max_value", DEFAULT_FLAGS, IFACE_("Max"), ICON_NONE);
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4: {
uiItemR(col, ptr, "default_value", DEFAULT_FLAGS, IFACE_("Default"), ICON_NONE);
uiLayout *sub = uiLayoutColumn(col, true);
uiItemR(sub, ptr, "min_value", DEFAULT_FLAGS, IFACE_("Min"), ICON_NONE);

View File

@ -451,9 +451,11 @@ static eCustomDataType socket_type_to_custom_data_type(const eNodeSocketDatatype
return CD_PROP_INT32;
case SOCK_VECTOR:
return CD_PROP_FLOAT3;
case SOCK_MATRIX3x3:
case SOCK_MATRIX_2X2:
return CD_PROP_FLOAT2x2;
case SOCK_MATRIX_3X3:
return CD_PROP_FLOAT3x3;
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
return CD_PROP_FLOAT4x4;
case SOCK_BOOLEAN:
return CD_PROP_BOOL;
@ -2074,12 +2076,8 @@ static int get_main_socket_priority(const bNodeSocket *socket)
return 3;
case SOCK_VECTOR:
return 4;
case SOCK_MATRIX3x3:
return 5;
case SOCK_MATRIX4x4:
return 6;
case SOCK_RGBA:
return 7;
return 5;
case SOCK_STRING:
case SOCK_SHADER:
case SOCK_OBJECT:
@ -2088,7 +2086,10 @@ static int get_main_socket_priority(const bNodeSocket *socket)
case SOCK_COLLECTION:
case SOCK_TEXTURE:
case SOCK_MATERIAL:
return 8;
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
return 6;
}
return -1;
}

View File

@ -383,10 +383,10 @@ static Vector<NodeLinkItem> ui_node_link_items(NodeLinkArg *arg,
item.socket_type = SOCK_VECTOR;
}
else if (dynamic_cast<const decl::Matrix3x3 *>(&socket_decl)) {
item.socket_type = SOCK_MATRIX3x3;
item.socket_type = SOCK_MATRIX_3X3;
}
else if (dynamic_cast<const decl::Matrix4x4 *>(&socket_decl)) {
item.socket_type = SOCK_MATRIX4x4;
item.socket_type = SOCK_MATRIX_4X4;
}
else if (dynamic_cast<const decl::Color *>(&socket_decl)) {
item.socket_type = SOCK_RGBA;
@ -868,8 +868,9 @@ static void ui_node_draw_input(
else {
switch (input.type) {
case SOCK_VECTOR:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
case SOCK_MATRIX_2X2:
case SOCK_MATRIX_3X3:
case SOCK_MATRIX_4X4:
uiItemS(sub);
sub = uiLayoutColumn(sub, true);
ATTR_FALLTHROUGH;

View File

@ -232,8 +232,9 @@ typedef enum eNodeSocketDatatype {
SOCK_COLLECTION = 11,
SOCK_TEXTURE = 12,
SOCK_MATERIAL = 13,
SOCK_MATRIX3x3 = 14,
SOCK_MATRIX4x4 = 15,
SOCK_MATRIX_2X2 = 14,
SOCK_MATRIX_3X3 = 15,
SOCK_MATRIX_4X4 = 16,
} eNodeSocketDatatype;
/** Socket shape. */
@ -676,6 +677,21 @@ typedef struct bNodeSocketValueVector {
float min, max;
} bNodeSocketValueVector;
typedef struct bNodeSocketValueMatrix2x2 {
float value[2][2];
float min, max;
} bNodeSocketValueMatrix2x2;
typedef struct bNodeSocketValueMatrix3x3 {
float value[3][3];
float min, max;
} bNodeSocketValueMatrix3x3;
typedef struct bNodeSocketValueMatrix4x4 {
float value[4][4];
float min, max;
} bNodeSocketValueMatrix4x4;
typedef struct bNodeSocketValueRGBA {
float value[4];
} bNodeSocketValueRGBA;

View File

@ -62,8 +62,9 @@ static const EnumPropertyItem node_socket_data_type_items[] = {
{SOCK_INT, "INT", 0, "Integer", ""},
{SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
{SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
{SOCK_MATRIX3x3, "MATRIX3x3", 0, "3x3 Matrix", ""},
{SOCK_MATRIX4x4, "MATRIX4x4", 0, "4x4 Matrix", ""},
{SOCK_MATRIX_2X2, "MATRIX2x2", 0, "2x2 Matrix", ""},
{SOCK_MATRIX_3X3, "MATRIX3x3", 0, "3x3 Matrix", ""},
{SOCK_MATRIX_4X4, "MATRIX4x4", 0, "4x4 Matrix", ""},
{SOCK_STRING, "STRING", 0, "String", ""},
{SOCK_RGBA, "RGBA", 0, "Color", ""},
{SOCK_OBJECT, "OBJECT", 0, "Object", ""},
@ -91,8 +92,9 @@ static const EnumPropertyItem node_socket_type_items[] = {
{SOCK_INT, "INT", 0, "Integer", ""},
{SOCK_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
{SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
{SOCK_MATRIX3x3, "MATRIX3x3", 0, "3x3 Matrix", ""},
{SOCK_MATRIX4x4, "MATRIX4x4", 0, "4x4 Matrix", ""},
{SOCK_MATRIX_2X2, "MATRIX2x2", 0, "2x2 Matrix", ""},
{SOCK_MATRIX_3X3, "MATRIX3x3", 0, "3x3 Matrix", ""},
{SOCK_MATRIX_4X4, "MATRIX4x4", 0, "4x4 Matrix", ""},
{SOCK_STRING, "STRING", 0, "String", ""},
{SOCK_RGBA, "RGBA", 0, "RGBA", ""},
{SOCK_SHADER, "SHADER", 0, "Shader", ""},
@ -3219,6 +3221,54 @@ static void rna_NodeSocketStandard_vector_range(
*softmax = dval->max;
}
static void rna_NodeSocketStandard_matrix3x3_range(
PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
{
bNodeSocket *sock = ptr->data;
bNodeSocketValueMatrix3x3 *dval = sock->default_value;
if (dval->max < dval->min) {
dval->max = dval->min;
}
*min = -FLT_MAX;
*max = FLT_MAX;
*softmin = dval->min;
*softmax = dval->max;
}
static void rna_NodeSocketStandard_matrix4x4_range(
PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
{
bNodeSocket *sock = ptr->data;
bNodeSocketValueMatrix4x4 *dval = sock->default_value;
if (dval->max < dval->min) {
dval->max = dval->min;
}
*min = -FLT_MAX;
*max = FLT_MAX;
*softmin = dval->min;
*softmax = dval->max;
}
static void rna_NodeSocketStandard_matrix2x2_range(
PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
{
bNodeSocket *sock = ptr->data;
bNodeSocketValueMatrix2x2 *dval = sock->default_value;
if (dval->max < dval->min) {
dval->max = dval->min;
}
*min = -FLT_MAX;
*max = FLT_MAX;
*softmin = dval->min;
*softmax = dval->max;
}
/* using a context update function here, to avoid searching the node if possible */
static void rna_NodeSocketStandard_value_update(struct bContext *C, PointerRNA *ptr)
{
@ -11488,38 +11538,24 @@ static void rna_def_node_socket_vector(BlenderRNA *brna,
RNA_def_struct_sdna_from(srna, "bNodeSocket", NULL);
}
static void rna_def_node_socket_matrix3x3(BlenderRNA *brna,
static void rna_def_node_socket_matrix2x2(BlenderRNA *brna,
const char *identifier,
const char *interface_idname)
{
StructRNA *srna;
PropertyRNA *prop;
const float *value_default;
/* choose sensible common default based on subtype */
switch (subtype) {
case PROP_DIRECTION: {
static const float default_direction[3] = {0.0f, 0.0f, 1.0f};
value_default = default_direction;
break;
}
default: {
static const float default_vector[3] = {0.0f, 0.0f, 0.0f};
value_default = default_vector;
break;
}
}
const float value_default[] = {1.0f, 0.0f, 0.0f, 1.0f};
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
RNA_def_struct_ui_text(srna, "Vector Node Socket", "3D vector socket of a node");
RNA_def_struct_ui_text(srna, "Matrix 2x2 Node Socket", "2x2 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix2x2", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, subtype);
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_float_array_default(prop, value_default);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_vector_range");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix2x2_range");
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_update");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
@ -11528,15 +11564,136 @@ static void rna_def_node_socket_matrix3x3(BlenderRNA *brna,
/* socket interface */
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
RNA_def_struct_ui_text(srna, "Vector Node Socket Interface", "3D vector socket of a node");
RNA_def_struct_ui_text(srna, "Matrix 2x2 Node Socket Interface", "2x2 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix2x2", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, subtype);
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_vector_range");
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix2x2_range");
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");
prop = RNA_def_property(srna, "min_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Minimum Value", "Minimum value");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
prop = RNA_def_property(srna, "max_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Maximum Value", "Maximum value");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
RNA_def_struct_sdna_from(srna, "bNodeSocket", NULL);
}
static void rna_def_node_socket_matrix3x3(BlenderRNA *brna,
const char *identifier,
const char *interface_idname)
{
StructRNA *srna;
PropertyRNA *prop;
const float value_default[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
RNA_def_struct_ui_text(srna, "Matrix 3x3 Node Socket", "3x3 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix3x3", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_float_array_default(prop, value_default);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix3x3_range");
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_update");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_struct_sdna_from(srna, "bNodeSocket", NULL);
/* socket interface */
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
RNA_def_struct_ui_text(srna, "Matrix 3x3 Node Socket Interface", "3x3 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix3x3", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix3x3_range");
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");
prop = RNA_def_property(srna, "min_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "min");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Minimum Value", "Minimum value");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
prop = RNA_def_property(srna, "max_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "max");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Maximum Value", "Maximum value");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
RNA_def_struct_sdna_from(srna, "bNodeSocket", NULL);
}
static void rna_def_node_socket_matrix4x4(BlenderRNA *brna,
const char *identifier,
const char *interface_idname)
{
StructRNA *srna;
PropertyRNA *prop;
const float value_default[] = {1.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f};
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
RNA_def_struct_ui_text(srna, "Matrix 4x4 Node Socket", "4x4 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix4x4", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_float_array_default(prop, value_default);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix4x4_range");
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_update");
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_struct_sdna_from(srna, "bNodeSocket", NULL);
/* socket interface */
srna = RNA_def_struct(brna, interface_idname, "NodeSocketInterfaceStandard");
RNA_def_struct_ui_text(srna, "Matrix 4x4 Node Socket Interface", "4x4 matrix socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix4x4", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "value");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketStandard_matrix4x4_range");
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");
@ -11996,6 +12153,10 @@ static void rna_def_node_socket_standard_types(BlenderRNA *brna)
rna_def_node_socket_vector(
brna, "NodeSocketVectorXYZ", "NodeSocketInterfaceVectorXYZ", PROP_XYZ);
rna_def_node_socket_matrix2x2(brna, "NodeSocketMatrix2x2", "NodeSocketInterfaceMatrix2x2");
rna_def_node_socket_matrix3x3(brna, "NodeSocketMatrix3x3", "NodeSocketInterfaceMatrix3x3");
rna_def_node_socket_matrix4x4(brna, "NodeSocketMatrix4x4", "NodeSocketInterfaceMatrix4x4");
rna_def_node_socket_color(brna, "NodeSocketColor", "NodeSocketInterfaceColor");
rna_def_node_socket_string(brna, "NodeSocketString", "NodeSocketInterfaceString");

View File

@ -421,7 +421,7 @@ static const std::string attribute_name_suffix = "_attribute_name";
*/
static bool socket_type_has_attribute_toggle(const bNodeSocket &socket)
{
return ELEM(socket.type, SOCK_FLOAT, SOCK_VECTOR, SOCK_BOOLEAN, SOCK_RGBA, SOCK_INT, SOCK_MATRIX3x3, SOCK_MATRIX4x4);
return ELEM(socket.type, SOCK_FLOAT, SOCK_VECTOR, SOCK_BOOLEAN, SOCK_RGBA, SOCK_INT, SOCK_MATRIX_3X3, SOCK_MATRIX_4X4);
}
/**
@ -479,10 +479,11 @@ id_property_create_from_socket(const bNodeSocket &socket)
}
return property;
}
case SOCK_MATRIX3x3: {
case SOCK_MATRIX_3X3: {
const bNodeSocketValueMatrix3x3 *value = static_cast<const bNodeSocketValueMatrix3x3 *>(
socket.default_value);
auto property = bke::idprop::create(socket.identifier, Span<float>(value->value, 9));
const Span<float> default_value_span((float *)value->value, 9);
auto property = bke::idprop::create(socket.identifier, default_value_span);
IDPropertyUIDataFloat *ui_data = (IDPropertyUIDataFloat *)IDP_ui_data_ensure(property.get());
ui_data->base.rna_subtype = PROP_MATRIX;
ui_data->min = ui_data->soft_min = double(value->min);
@ -490,14 +491,15 @@ id_property_create_from_socket(const bNodeSocket &socket)
ui_data->default_array = (double *)MEM_mallocN(sizeof(double[9]), "mod_prop_default");
ui_data->default_array_len = 9;
for (const int i : IndexRange(9)) {
ui_data->default_array[i] = double(value->value[i]);
ui_data->default_array[i] = double(default_value_span[i]);
}
return property;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_4X4: {
const bNodeSocketValueMatrix4x4 *value = static_cast<const bNodeSocketValueMatrix4x4 *>(
socket.default_value);
auto property = bke::idprop::create(socket.identifier, Span<float>(value->value, 16));
const Span<float> default_value_span((float *)value->value, 16);
auto property = bke::idprop::create(socket.identifier, default_value_span);
IDPropertyUIDataFloat *ui_data = (IDPropertyUIDataFloat *)IDP_ui_data_ensure(property.get());
ui_data->base.rna_subtype = PROP_MATRIX;
ui_data->min = ui_data->soft_min = double(value->min);
@ -505,7 +507,7 @@ id_property_create_from_socket(const bNodeSocket &socket)
ui_data->default_array = (double *)MEM_mallocN(sizeof(double[16]), "mod_prop_default");
ui_data->default_array_len = 16;
for (const int i : IndexRange(16)) {
ui_data->default_array[i] = double(value->value[i]);
ui_data->default_array[i] = double(default_value_span[i]);
}
return property;
}
@ -585,9 +587,9 @@ static bool id_property_type_matches_socket(const bNodeSocket &socket, const IDP
return property.type == IDP_INT;
case SOCK_VECTOR:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 3;
case SOCK_MATRIX3x3:
case SOCK_MATRIX_3X3:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 9;
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 16;
case SOCK_RGBA:
return property.type == IDP_ARRAY && property.subtype == IDP_FLOAT && property.len == 4;
@ -633,13 +635,13 @@ static void init_socket_cpp_value_from_property(const IDProperty &property,
new (r_value) ValueOrField<float3>(value);
break;
}
case SOCK_MATRIX3x3: {
case SOCK_MATRIX_3X3: {
float3x3 value;
copy_m3_m3(value.ptr(), (const float (*)[3])IDP_Array(&property));
new (r_value) ValueOrField<float3x3>(value);
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_4X4: {
float4x4 value;
copy_m4_m4(value.ptr(), (const float(*)[4])IDP_Array(&property));
new (r_value) ValueOrField<float4x4>(value);

View File

@ -101,8 +101,8 @@ static bool geometry_node_tree_socket_type_valid(bNodeTreeType * /*treetype*/,
SOCK_TEXTURE,
SOCK_IMAGE,
SOCK_MATERIAL,
SOCK_MATRIX3x3,
SOCK_MATRIX4x4);
SOCK_MATRIX_3X3,
SOCK_MATRIX_4X4);
}
void register_node_tree_type_geo()

View File

@ -21,9 +21,9 @@ std::optional<eCustomDataType> node_data_type_to_custom_data_type(const eNodeSoc
return CD_PROP_FLOAT;
case SOCK_VECTOR:
return CD_PROP_FLOAT3;
case SOCK_MATRIX3x3:
case SOCK_MATRIX_3X3:
return CD_PROP_MATRIX3;
case SOCK_MATRIX4x4:
case SOCK_MATRIX_4X4:
return CD_PROP_MATRIX4;
case SOCK_RGBA:
return CD_PROP_COLOR;

View File

@ -79,20 +79,49 @@ struct bNodeSocket *node_add_socket_from_template(struct bNodeTree *ntree,
dval->max = stemp->max;
break;
}
case SOCK_MATRIX3x3: {
bNodeSocketValueMatrix3x3 *dval = (bNodeSocketValueMatrix3x3 *)sock->default_value;
dval->value[0] = stemp->val1;
dval->value[1] = stemp->val2;
dval->value[2] = stemp->val3;
case SOCK_MATRIX_2X2: {
bNodeSocketValueMatrix2x2 *dval = (bNodeSocketValueMatrix2x2 *)sock->default_value;
dval->value[0][0] = stemp->val1;
dval->value[0][1] = 0.0f;
dval->value[1][0] = 0.0f;
dval->value[1][1] = stemp->val1;
dval->min = stemp->min;
dval->max = stemp->max;
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_3X3: {
bNodeSocketValueMatrix3x3 *dval = (bNodeSocketValueMatrix3x3 *)sock->default_value;
dval->value[0][0] = stemp->val1;
dval->value[0][1] = 0.0f;
dval->value[0][2] = 0.0f;
dval->value[1][0] = 0.0f;
dval->value[1][1] = stemp->val1;
dval->value[1][2] = 0.0f;
dval->value[2][0] = 0.0f;
dval->value[2][1] = 0.0f;
dval->value[2][2] = stemp->val1;
dval->min = stemp->min;
dval->max = stemp->max;
break;
}
case SOCK_MATRIX_4X4: {
bNodeSocketValueMatrix4x4 *dval = (bNodeSocketValueMatrix4x4 *)sock->default_value;
dval->value[0] = stemp->val1;
dval->value[1] = stemp->val2;
dval->value[2] = stemp->val3;
dval->value[0][0] = stemp->val1;
dval->value[0][1] = 0.0f;
dval->value[0][2] = 0.0f;
dval->value[0][3] = 0.0f;
dval->value[1][0] = 0.0f;
dval->value[1][1] = stemp->val1;
dval->value[1][2] = 0.0f;
dval->value[1][3] = 0.0f;
dval->value[2][0] = 0.0f;
dval->value[2][1] = 0.0f;
dval->value[2][2] = stemp->val1;
dval->value[2][3] = 0.0f;
dval->value[3][0] = 0.0f;
dval->value[3][1] = 0.0f;
dval->value[3][2] = 0.0f;
dval->value[3][3] = stemp->val1;
dval->min = stemp->min;
dval->max = stemp->max;
break;
@ -350,12 +379,22 @@ void node_socket_init_default_value(bNodeSocket *sock)
sock->default_value = dval;
break;
}
case SOCK_MATRIX3x3: {
case SOCK_MATRIX_2X2: {
static float default_value[][2] = {{1.0f, 0.0f}, {0.0f, 1.0f}};
bNodeSocketValueMatrix2x2 *dval = MEM_cnew<bNodeSocketValueMatrix2x2>(
"node socket value matrix 2x2");
copy_m2_m2(dval->value, default_value);
dval->min = -FLT_MAX;
dval->max = FLT_MAX;
sock->default_value = dval;
break;
}
case SOCK_MATRIX_3X3: {
static float default_value[][3] = {
{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
bNodeSocketValueMatrix3x3 *dval = MEM_cnew<bNodeSocketValueMatrix3x3>(
"node socket value matrix 3x3");
dval->subtype = subtype;
copy_m3_m3(dval->value, default_value);
dval->min = -FLT_MAX;
dval->max = FLT_MAX;
@ -363,14 +402,13 @@ void node_socket_init_default_value(bNodeSocket *sock)
sock->default_value = dval;
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_4X4: {
static float default_value[][4] = {{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 1.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f}};
bNodeSocketValueMatrix4x4 *dval = MEM_cnew<bNodeSocketValueMatrix4x4>(
"node socket value vector");
dval->subtype = subtype;
copy_m4_m4(dval->value, default_value);
dval->min = -FLT_MAX;
dval->max = FLT_MAX;
@ -478,13 +516,19 @@ void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from)
*toval = *fromval;
break;
}
case SOCK_MATRIX3x3: {
case SOCK_MATRIX_2X2: {
bNodeSocketValueMatrix2x2 *toval = (bNodeSocketValueMatrix2x2 *)to->default_value;
bNodeSocketValueMatrix2x2 *fromval = (bNodeSocketValueMatrix2x2 *)from->default_value;
*toval = *fromval;
break;
}
case SOCK_MATRIX_3X3: {
bNodeSocketValueMatrix3x3 *toval = (bNodeSocketValueMatrix3x3 *)to->default_value;
bNodeSocketValueMatrix3x3 *fromval = (bNodeSocketValueMatrix3x3 *)from->default_value;
*toval = *fromval;
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_4X4: {
bNodeSocketValueMatrix4x4 *toval = (bNodeSocketValueMatrix4x4 *)to->default_value;
bNodeSocketValueMatrix4x4 *fromval = (bNodeSocketValueMatrix4x4 *)from->default_value;
*toval = *fromval;
@ -650,18 +694,26 @@ static void standard_node_socket_interface_verify_socket(bNodeTree * /*ntree*/,
toval->max = fromval->max;
break;
}
case SOCK_MATRIX3x3: {
bNodeSocketValueMatrix3x3 *toval = (bNodeSocketValueMatrix3x3 *)sock->default_value;
const bNodeSocketValueMatrix3x3 *fromval = (const bNodeSocketValueMatrix3x3 *)
interface_socket->default_value;
case SOCK_MATRIX_2X2: {
bNodeSocketValueMatrix2x2 *toval = (bNodeSocketValueMatrix2x2 *)sock->default_value;
const bNodeSocketValueMatrix2x2 *fromval = (const bNodeSocketValueMatrix2x2 *)
interface_socket->default_value;
toval->min = fromval->min;
toval->max = fromval->max;
break;
}
case SOCK_MATRIX4x4: {
case SOCK_MATRIX_3X3: {
bNodeSocketValueMatrix3x3 *toval = (bNodeSocketValueMatrix3x3 *)sock->default_value;
const bNodeSocketValueMatrix3x3 *fromval = (const bNodeSocketValueMatrix3x3 *)
interface_socket->default_value;
toval->min = fromval->min;
toval->max = fromval->max;
break;
}
case SOCK_MATRIX_4X4: {
bNodeSocketValueMatrix4x4 *toval = (bNodeSocketValueMatrix4x4 *)sock->default_value;
const bNodeSocketValueMatrix4x4 *fromval = (const bNodeSocketValueMatrix4x4 *)
interface_socket->default_value;
interface_socket->default_value;
toval->min = fromval->min;
toval->max = fromval->max;
break;
@ -820,9 +872,9 @@ static bNodeSocketType *make_socket_type_vector(PropertySubType subtype)
return socktype;
}
static bNodeSocketType *make_socket_type_matrix3()
static bNodeSocketType *make_socket_type_matrix3x3()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX3x3, PROP_MATRIX);
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX_3X3, PROP_MATRIX);
socktype->base_cpp_type = &blender::CPPType::get<blender::float3x3>();
socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) {
*(blender::float3x3 *)r_value = ((bNodeSocketValueMatrix3x3 *)socket.default_value)->value;
@ -836,9 +888,9 @@ static bNodeSocketType *make_socket_type_matrix3()
return socktype;
}
static bNodeSocketType *make_socket_type_matrix4()
static bNodeSocketType *make_socket_type_matrix4x4()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX4x4, PROP_MATRIX);
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX_4X4, PROP_MATRIX);
socktype->base_cpp_type = &blender::CPPType::get<blender::float4x4>();
socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) {
*(blender::float4x4 *)r_value = ((bNodeSocketValueMatrix4x4 *)socket.default_value)->value;
@ -986,6 +1038,10 @@ void register_standard_node_socket_types()
nodeRegisterSocketType(make_socket_type_vector(PROP_EULER));
nodeRegisterSocketType(make_socket_type_vector(PROP_XYZ));
nodeRegisterSocketType(make_standard_socket_type(SOCK_MATRIX_2X2, PROP_MATRIX));
nodeRegisterSocketType(make_socket_type_matrix3x3());
nodeRegisterSocketType(make_socket_type_matrix4x4());
nodeRegisterSocketType(make_socket_type_rgba());
nodeRegisterSocketType(make_socket_type_string());

View File

@ -255,7 +255,7 @@ bNodeSocket &Vector::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket
bNodeSocket &Matrix3x3::build(bNodeTree &ntree, bNode &node) const
{
bNodeSocket &socket = *nodeAddStaticSocket(
&ntree, &node, in_out_, SOCK_MATRIX3x3, PROP_MATRIX, identifier_.c_str(), name_.c_str());
&ntree, &node, in_out_, SOCK_MATRIX_3X3, PROP_MATRIX, identifier_.c_str(), name_.c_str());
this->set_common_flags(socket);
bNodeSocketValueMatrix3x3 &value = *(bNodeSocketValueMatrix3x3 *)socket.default_value;
copy_m3_m3(value.value, default_value_.ptr());
@ -269,7 +269,7 @@ bool Matrix3x3::matches(const bNodeSocket &socket) const
if (!this->matches_common_data(socket)) {
return false;
}
if (socket.type != SOCK_MATRIX3x3) {
if (socket.type != SOCK_MATRIX_3X3) {
return false;
}
return true;
@ -277,12 +277,12 @@ bool Matrix3x3::matches(const bNodeSocket &socket) const
bool Matrix3x3::can_connect(const bNodeSocket &socket) const
{
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX3x3;
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX_3X3;
}
bNodeSocket &Matrix3x3::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const
{
if (socket.type != SOCK_MATRIX3x3) {
if (socket.type != SOCK_MATRIX_3X3) {
BLI_assert(socket.in_out == in_out_);
return this->build(ntree, node);
}
@ -301,7 +301,7 @@ bNodeSocket &Matrix3x3::update_or_build(bNodeTree &ntree, bNode &node, bNodeSock
bNodeSocket &Matrix4x4::build(bNodeTree &ntree, bNode &node) const
{
bNodeSocket &socket = *nodeAddStaticSocket(
&ntree, &node, in_out_, SOCK_MATRIX4x4, PROP_MATRIX, identifier_.c_str(), name_.c_str());
&ntree, &node, in_out_, SOCK_MATRIX_4X4, PROP_MATRIX, identifier_.c_str(), name_.c_str());
this->set_common_flags(socket);
bNodeSocketValueMatrix4x4 &value = *(bNodeSocketValueMatrix4x4 *)socket.default_value;
copy_m4_m4(value.value, default_value_.ptr());
@ -315,7 +315,7 @@ bool Matrix4x4::matches(const bNodeSocket &socket) const
if (!this->matches_common_data(socket)) {
return false;
}
if (socket.type != SOCK_MATRIX4x4) {
if (socket.type != SOCK_MATRIX_4X4) {
return false;
}
return true;
@ -323,12 +323,12 @@ bool Matrix4x4::matches(const bNodeSocket &socket) const
bool Matrix4x4::can_connect(const bNodeSocket &socket) const
{
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX4x4;
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX_4X4;
}
bNodeSocket &Matrix4x4::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const
{
if (socket.type != SOCK_MATRIX4x4) {
if (socket.type != SOCK_MATRIX_4X4) {
BLI_assert(socket.in_out == in_out_);
return this->build(ntree, node);
}