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.
4 changed files with 95 additions and 58 deletions
Showing only changes of commit 87004bd122 - Show all commits

View File

@ -311,6 +311,8 @@ static void library_foreach_node_socket(LibraryForeachIDData *data, bNodeSocket
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
break;
}
}
@ -450,6 +452,12 @@ 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:
BLO_write_struct(writer, bNodeSocketValueMatrix3x3, sock->default_value);
break;
case SOCK_MATRIX4x4:
BLO_write_struct(writer, bNodeSocketValueMatrix4x4, sock->default_value);
break;
case SOCK_CUSTOM:
/* Custom node sockets where default_value is defined uses custom properties for storage. */
break;
@ -873,6 +881,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:
break;
}
}
@ -968,6 +978,8 @@ static void expand_node_socket(BlendExpander *expander, bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
break;
}
}
@ -1583,6 +1595,8 @@ static void socket_id_user_increment(bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
break;
}
}
@ -1642,6 +1656,8 @@ static bool socket_id_user_decrement(bNodeSocket *sock)
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_GEOMETRY:
case SOCK_MATRIX3x3:
case SOCK_MATRIX4x4:
break;
}
return false;
@ -1786,6 +1802,10 @@ const char *nodeStaticSocketType(int type, int subtype)
return "NodeSocketTexture";
case SOCK_MATERIAL:
return "NodeSocketMaterial";
case SOCK_MATRIX3x3:
return "NodeSocketMatrix3x3";
case SOCK_MATRIX4x4:
return "NodeSocketMatrix4x4";
}
return nullptr;
}

View File

@ -232,6 +232,8 @@ typedef enum eNodeSocketDatatype {
SOCK_COLLECTION = 11,
SOCK_TEXTURE = 12,
SOCK_MATERIAL = 13,
SOCK_MATRIX3x3 = 14,
SOCK_MATRIX4x4 = 15,
} eNodeSocketDatatype;
/** Socket shape. */

View File

@ -11484,6 +11484,73 @@ 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,
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;
}
}
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_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, subtype);
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_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, "Vector Node Socket Interface", "3D vector socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, subtype);
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_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_color(BlenderRNA *brna,
const char *identifier,
const char *interface_idname)

View File

@ -254,13 +254,9 @@ 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());
bNodeSocket &socket = *nodeAddSocket(
&ntree, &node, in_out_, "NodeSocketMatrix3x3", 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());
value.min = soft_min_value_;
value.max = soft_max_value_;
return socket;
}
@ -272,34 +268,12 @@ bool Matrix3x3::matches(const bNodeSocket &socket) const
if (socket.type != SOCK_MATRIX3x3) {
return false;
}
if (socket.typeinfo->subtype != PROP_MATRIX) {
return false;
}
return true;
}
bool Matrix3x3::can_connect(const bNodeSocket &socket) const
{
if (!sockets_can_connect(*this, socket)) {
return false;
}
return basic_types_can_connect(*this, socket);
}
bNodeSocket &Matrix3x3::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const
{
if (socket.type != SOCK_MATRIX3x3) {
BLI_assert(socket.in_out == in_out_);
return this->build(ntree, node);
}
if (socket.typeinfo->subtype != PROP_MATRIX) {
modify_subtype_except_for_storage(socket, PROP_MATRIX);
}
this->set_common_flags(socket);
bNodeSocketValueMatrix3x3 &value = *(bNodeSocketValueMatrix3x3 *)socket.default_value;
value.subtype = PROP_MATRIX;
STRNCPY(socket.name, name_.c_str());
return socket;
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX3x3;
}
/** \} */
@ -310,13 +284,9 @@ 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());
bNodeSocket &socket = *nodeAddSocket(
&ntree, &node, in_out_, "NodeSocketMatrix4x4", 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());
value.min = soft_min_value_;
value.max = soft_max_value_;
return socket;
}
@ -328,34 +298,12 @@ bool Matrix4x4::matches(const bNodeSocket &socket) const
if (socket.type != SOCK_MATRIX4x4) {
return false;
}
if (socket.typeinfo->subtype != PROP_MATRIX) {
return false;
}
return true;
}
bool Matrix4x4::can_connect(const bNodeSocket &socket) const
{
if (!sockets_can_connect(*this, socket)) {
return false;
}
return basic_types_can_connect(*this, socket);
}
bNodeSocket &Matrix4x4::update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const
{
if (socket.type != SOCK_MATRIX4x4) {
BLI_assert(socket.in_out == in_out_);
return this->build(ntree, node);
}
if (socket.typeinfo->subtype != PROP_MATRIX) {
modify_subtype_except_for_storage(socket, PROP_MATRIX);
}
this->set_common_flags(socket);
bNodeSocketValueMatrix4x4 &value = *(bNodeSocketValueMatrix4x4 *)socket.default_value;
value.subtype = PROP_MATRIX;
STRNCPY(socket.name, name_.c_str());
return socket;
return sockets_can_connect(*this, socket) && socket.type == SOCK_MATRIX4x4;
}
/** \} */