Matrix operations and sockets for geometry nodes #105408
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
Loading…
Reference in New Issue