Geometry Nodes: Matrix socket type, attribute type, and initial nodes #116166

Merged
Hans Goudey merged 47 commits from HooglyBoogly/blender:nodes-matrix-socket into main 2024-02-13 18:59:46 +01:00
8 changed files with 7 additions and 59 deletions
Showing only changes of commit 028e44a360 - Show all commits

View File

@ -177,9 +177,6 @@ template<typename Fn> bool socket_data_to_static_type(const eNodeSocketDatatype
case SOCK_ROTATION:
fn.template operator()<bNodeSocketValueRotation>();
return true;
case SOCK_MATRIX:
fn.template operator()<bNodeSocketValueMatrix>();
return true;
case SOCK_VECTOR:
fn.template operator()<bNodeSocketValueVector>();
return true;
@ -210,6 +207,7 @@ template<typename Fn> bool socket_data_to_static_type(const eNodeSocketDatatype
case SOCK_CUSTOM:
case SOCK_SHADER:
case SOCK_MATRIX:
case SOCK_GEOMETRY:
return true;
}

View File

@ -704,9 +704,6 @@ static void write_node_socket_default_value(BlendWriter *writer, const bNodeSock
case SOCK_ROTATION:
BLO_write_struct(writer, bNodeSocketValueRotation, sock->default_value);
break;
case SOCK_MATRIX:
BLO_write_struct(writer, bNodeSocketValueMatrix, sock->default_value);
break;
case SOCK_MENU: {
BLO_write_struct(writer, bNodeSocketValueMenu, sock->default_value);
break;
@ -2768,8 +2765,6 @@ static void *socket_value_storage(bNodeSocket &socket)
return &socket.default_value_typed<bNodeSocketValueMaterial>()->value;
case SOCK_ROTATION:
return &socket.default_value_typed<bNodeSocketValueRotation>()->value_euler;
case SOCK_MATRIX:
return &socket.default_value_typed<bNodeSocketValueMatrix>()->value;
case SOCK_MENU:
return &socket.default_value_typed<bNodeSocketValueMenu>()->value;
case SOCK_STRING:

View File

@ -330,10 +330,6 @@ inline void socket_data_write_impl(BlendWriter *writer, bNodeSocketValueMenu &da
{
BLO_write_struct(writer, bNodeSocketValueMenu, &data);
}
inline void socket_data_write_impl(BlendWriter *writer, bNodeSocketValueMatrix &data)
{
BLO_write_struct(writer, bNodeSocketValueMatrix, &data);
}
static void socket_data_write(BlendWriter *writer, bNodeTreeInterfaceSocket &socket)
{

View File

@ -896,10 +896,6 @@ typedef struct bNodeSocketValueRotation {
float value_euler[3];
} bNodeSocketValueRotation;
typedef struct bNodeSocketValueMatrix {
float value[4][4];
} bNodeSocketValueMatrix;
typedef struct bNodeSocketValueRGBA {
float value[4];
} bNodeSocketValueRGBA;

View File

@ -1015,42 +1015,22 @@ static void rna_def_node_socket_interface_rotation(BlenderRNA *brna, const char
static void rna_def_node_socket_matrix(BlenderRNA *brna, const char *identifier)
{
StructRNA *srna;
PropertyRNA *prop;
srna = RNA_def_struct(brna, identifier, "NodeSocketStandard");
RNA_def_struct_ui_text(srna, "Matrix Node Socket", "Matrix value socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix", "default_value");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, nullptr, "value");
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
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", nullptr);
}
static void rna_def_node_socket_interface_matrix(BlenderRNA *brna, const char *identifier)
{
StructRNA *srna;
PropertyRNA *prop;
srna = RNA_def_struct(brna, identifier, "NodeTreeInterfaceSocket");
RNA_def_struct_ui_text(srna, "Matrix Node Socket Interface", "Matrix value socket of a node");
RNA_def_struct_sdna(srna, "bNodeTreeInterfaceSocket");
RNA_def_struct_sdna_from(srna, "bNodeSocketValueMatrix", "socket_data");
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, nullptr, "value");
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Default Value", "Input value used for unconnected socket");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeTreeInterfaceSocket_value_update");
RNA_def_struct_sdna_from(srna, "bNodeTreeInterfaceSocket", nullptr);
rna_def_node_tree_interface_socket_builtin(srna);

View File

@ -250,9 +250,7 @@ static SocketDeclarationPtr declaration_for_interface_socket(
break;
}
case SOCK_MATRIX: {
const auto &value = node_interface::get_socket_data_as<bNodeSocketValueMatrix>(io_socket);
std::unique_ptr<decl::Matrix> decl = std::make_unique<decl::Matrix>();
decl->default_value = float4x4(value.value);
dst = std::move(decl);
break;
}

View File

@ -631,12 +631,6 @@ void node_socket_init_default_value_data(eNodeSocketDatatype datatype, int subty
*data = dval;
break;
}
case SOCK_MATRIX: {
bNodeSocketValueMatrix *dval = MEM_cnew<bNodeSocketValueMatrix>(__func__);
unit_m4(dval->value);
*data = dval;
break;
}
case SOCK_VECTOR: {
static float default_value[] = {0.0f, 0.0f, 0.0f};
bNodeSocketValueVector *dval = MEM_cnew<bNodeSocketValueVector>("node socket value vector");
@ -712,6 +706,7 @@ void node_socket_init_default_value_data(eNodeSocketDatatype datatype, int subty
case SOCK_CUSTOM:
case SOCK_GEOMETRY:
case SOCK_MATRIX:
case SOCK_SHADER:
break;
}
@ -760,12 +755,6 @@ void node_socket_copy_default_value_data(eNodeSocketDatatype datatype, void *to,
*toval = *fromval;
break;
}
case SOCK_MATRIX: {
bNodeSocketValueMatrix *toval = (bNodeSocketValueMatrix *)to;
bNodeSocketValueMatrix *fromval = (bNodeSocketValueMatrix *)from;
*toval = *fromval;
break;
}
case SOCK_STRING: {
bNodeSocketValueString *toval = (bNodeSocketValueString *)to;
bNodeSocketValueString *fromval = (bNodeSocketValueString *)from;
@ -816,6 +805,7 @@ void node_socket_copy_default_value_data(eNodeSocketDatatype datatype, void *to,
case SOCK_CUSTOM:
case SOCK_GEOMETRY:
case SOCK_MATRIX:
case SOCK_SHADER:
break;
}
@ -1001,14 +991,12 @@ static bNodeSocketType *make_socket_type_matrix()
{
bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATRIX, PROP_NONE);
socktype->base_cpp_type = &blender::CPPType::get<float4x4>();
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
const auto &typed_value = *static_cast<const bNodeSocketValueMatrix *>(socket_value);
*static_cast<float4x4 *>(r_value) = float4x4(typed_value.value);
socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) {
*static_cast<float4x4 *>(r_value) = float4x4::identity();
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) {
const auto &typed_value = *static_cast<const bNodeSocketValueMatrix *>(socket_value);
new (r_value) SocketValueVariant(float4x4(typed_value.value));
socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/, void *r_value) {
new (r_value) SocketValueVariant(float4x4::identity());
};
static SocketValueVariant default_value{float4x4::identity()};
socktype->geometry_nodes_default_cpp_value = &default_value;

View File

@ -449,9 +449,6 @@ bNodeSocket &Matrix::build(bNodeTree &ntree, bNode &node) const
this->identifier.c_str(),
this->name.c_str());
this->set_common_flags(socket);
bNodeSocketValueMatrix &value = *static_cast<bNodeSocketValueMatrix *>(socket.default_value);
/* Use #memcpy rather than in-place new because the default value may not be properly aligned. */
memcpy(value.value, &this->default_value, sizeof(float4x4));
return socket;
}