Cleanup: Use dynamic declaration for sample curve node

Change the attribute "value" sockets to use dynamic declarations, but
not the others. See 8149678d5e, f7383cfe9b.
This commit is contained in:
Hans Goudey 2023-12-21 10:33:15 -05:00
parent 84c65732fe
commit da6867ca3b
3 changed files with 22 additions and 111 deletions

View File

@ -1765,10 +1765,10 @@ static void versioning_nodes_dynamic_sockets(bNodeTree &ntree)
}
}
static void versioning_switch_node_dynamic_socket(bNodeTree &ntree)
static void versioning_nodes_dynamic_sockets_2(bNodeTree &ntree)
{
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
if (node->type != GEO_NODE_SWITCH) {
if (!ELEM(node->type, GEO_NODE_SWITCH, GEO_NODE_SAMPLE_CURVE)) {
continue;
}
version_socket_identifier_suffixes_for_dynamic_types(node->inputs, "_");
@ -2586,7 +2586,7 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
if (ntree->type == NTREE_GEOMETRY) {
version_geometry_nodes_use_rotation_socket(*ntree);
versioning_switch_node_dynamic_socket(*ntree);
versioning_nodes_dynamic_sockets_2(*ntree);
}
}
}

View File

@ -27,12 +27,10 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Geometry>("Curves").only_realized_data().supported_type(
GeometryComponent::Type::Curve);
b.add_input<decl::Float>("Value", "Value_Float").hide_value().field_on_all();
b.add_input<decl::Int>("Value", "Value_Int").hide_value().field_on_all();
b.add_input<decl::Vector>("Value", "Value_Vector").hide_value().field_on_all();
b.add_input<decl::Color>("Value", "Value_Color").hide_value().field_on_all();
b.add_input<decl::Bool>("Value", "Value_Bool").hide_value().field_on_all();
b.add_input<decl::Rotation>("Value", "Value_Rotation").hide_value().field_on_all();
if (const bNode *node = b.node_or_null()) {
const NodeGeometryCurveSample &storage = node_storage(*node);
b.add_input(eCustomDataType(storage.data_type), "Value").hide_value().field_on_all();
}
b.add_input<decl::Float>("Factor")
.min(0.0f)
@ -49,16 +47,14 @@ static void node_declare(NodeDeclarationBuilder &b)
node_storage(node).use_all_curves = false;
});
b.add_output<decl::Float>("Value", "Value_Float").dependent_field({7, 8, 9});
b.add_output<decl::Int>("Value", "Value_Int").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Value", "Value_Vector").dependent_field({7, 8, 9});
b.add_output<decl::Color>("Value", "Value_Color").dependent_field({7, 8, 9});
b.add_output<decl::Bool>("Value", "Value_Bool").dependent_field({7, 8, 9});
b.add_output<decl::Rotation>("Value", "Value_Rotation").dependent_field({7, 8, 9});
if (const bNode *node = b.node_or_null()) {
const NodeGeometryCurveSample &storage = node_storage(*node);
b.add_output(eCustomDataType(storage.data_type), "Value").dependent_field({2, 3, 4});
}
b.add_output<decl::Vector>("Position").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Tangent").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Normal").dependent_field({7, 8, 9});
b.add_output<decl::Vector>("Position").dependent_field({2, 3, 4});
b.add_output<decl::Vector>("Tangent").dependent_field({2, 3, 4});
b.add_output<decl::Vector>("Normal").dependent_field({2, 3, 4});
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
@ -80,51 +76,23 @@ static void node_init(bNodeTree * /*tree*/, bNode *node)
static void node_update(bNodeTree *ntree, bNode *node)
{
const NodeGeometryCurveSample &storage = node_storage(*node);
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
const eCustomDataType data_type = eCustomDataType(storage.data_type);
const GeometryNodeCurveSampleMode mode = GeometryNodeCurveSampleMode(storage.mode);
bNodeSocket *in_socket_float = static_cast<bNodeSocket *>(node->inputs.first)->next;
bNodeSocket *in_socket_int32 = in_socket_float->next;
bNodeSocket *in_socket_vector = in_socket_int32->next;
bNodeSocket *in_socket_color4f = in_socket_vector->next;
bNodeSocket *in_socket_bool = in_socket_color4f->next;
bNodeSocket *in_socket_quat = in_socket_bool->next;
bNodeSocket *factor = in_socket_quat->next;
bNodeSocket *factor = static_cast<bNodeSocket *>(node->inputs.first)->next->next;
bNodeSocket *length = factor->next;
bNodeSocket *curve_index = length->next;
bke::nodeSetSocketAvailability(ntree, factor, mode == GEO_NODE_CURVE_SAMPLE_FACTOR);
bke::nodeSetSocketAvailability(ntree, length, mode == GEO_NODE_CURVE_SAMPLE_LENGTH);
bke::nodeSetSocketAvailability(ntree, curve_index, !storage.use_all_curves);
bke::nodeSetSocketAvailability(ntree, in_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, in_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, in_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, in_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, in_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, in_socket_quat, data_type == CD_PROP_QUATERNION);
bNodeSocket *out_socket_float = static_cast<bNodeSocket *>(node->outputs.first);
bNodeSocket *out_socket_int32 = out_socket_float->next;
bNodeSocket *out_socket_vector = out_socket_int32->next;
bNodeSocket *out_socket_color4f = out_socket_vector->next;
bNodeSocket *out_socket_bool = out_socket_color4f->next;
bNodeSocket *out_socket_quat = out_socket_bool->next;
bke::nodeSetSocketAvailability(ntree, out_socket_vector, data_type == CD_PROP_FLOAT3);
bke::nodeSetSocketAvailability(ntree, out_socket_float, data_type == CD_PROP_FLOAT);
bke::nodeSetSocketAvailability(ntree, out_socket_color4f, data_type == CD_PROP_COLOR);
bke::nodeSetSocketAvailability(ntree, out_socket_bool, data_type == CD_PROP_BOOL);
bke::nodeSetSocketAvailability(ntree, out_socket_int32, data_type == CD_PROP_INT32);
bke::nodeSetSocketAvailability(ntree, out_socket_quat, data_type == CD_PROP_QUATERNION);
}
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
{
const NodeDeclaration &declaration = *params.node_type().static_declaration;
search_link_ops_for_declarations(params, declaration.inputs.as_span().take_front(4));
search_link_ops_for_declarations(params, declaration.outputs.as_span().take_front(3));
search_link_ops_for_declarations(params, declaration.inputs.as_span().take_front(1));
search_link_ops_for_declarations(params, declaration.inputs.as_span().take_back(3));
search_link_ops_for_declarations(params, declaration.outputs.as_span().take_back(3));
const std::optional<eCustomDataType> type = bke::socket_type_to_custom_data_type(
eNodeSocketDatatype(params.other_socket().type));
@ -467,59 +435,6 @@ static Array<float> curve_accumulated_lengths(const bke::CurvesGeometry &curves)
return curve_lengths;
}
static GField get_input_attribute_field(GeoNodeExecParams &params, const eCustomDataType data_type)
{
switch (data_type) {
case CD_PROP_FLOAT:
return params.extract_input<GField>("Value_Float");
case CD_PROP_FLOAT3:
return params.extract_input<GField>("Value_Vector");
case CD_PROP_COLOR:
return params.extract_input<GField>("Value_Color");
case CD_PROP_BOOL:
return params.extract_input<GField>("Value_Bool");
case CD_PROP_INT32:
return params.extract_input<GField>("Value_Int");
case CD_PROP_QUATERNION:
return params.extract_input<GField>("Value_Rotation");
default:
BLI_assert_unreachable();
}
return {};
}
static void output_attribute_field(GeoNodeExecParams &params, GField field)
{
switch (bke::cpp_type_to_custom_data_type(field.cpp_type())) {
case CD_PROP_FLOAT: {
params.set_output("Value_Float", field);
break;
}
case CD_PROP_FLOAT3: {
params.set_output("Value_Vector", field);
break;
}
case CD_PROP_COLOR: {
params.set_output("Value_Color", field);
break;
}
case CD_PROP_BOOL: {
params.set_output("Value_Bool", field);
break;
}
case CD_PROP_INT32: {
params.set_output("Value_Int", field);
break;
}
case CD_PROP_QUATERNION: {
params.set_output("Value_Rotation", field);
break;
}
default:
break;
}
}
static void node_geo_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curves");
@ -538,12 +453,11 @@ static void node_geo_exec(GeoNodeExecParams params)
curves.ensure_evaluated_lengths();
const NodeGeometryCurveSample &storage = node_storage(params.node());
const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)storage.mode;
const eCustomDataType data_type = eCustomDataType(storage.data_type);
const GeometryNodeCurveSampleMode mode = GeometryNodeCurveSampleMode(storage.mode);
Field<float> length_field = params.extract_input<Field<float>>(
mode == GEO_NODE_CURVE_SAMPLE_FACTOR ? "Factor" : "Length");
GField src_values_field = get_input_attribute_field(params, data_type);
GField src_values_field = params.extract_input<GField>("Value");
std::shared_ptr<FieldOperation> sample_op;
if (curves.curves_num() == 1) {
@ -577,7 +491,7 @@ static void node_geo_exec(GeoNodeExecParams params)
params.set_output("Position", Field<float3>(sample_op, 0));
params.set_output("Tangent", Field<float3>(sample_op, 1));
params.set_output("Normal", Field<float3>(sample_op, 2));
output_attribute_field(params, GField(sample_op, 3));
params.set_output("Value", GField(sample_op, 3));
}
static void node_register()

View File

@ -371,9 +371,6 @@ static const char *get_current_socket_identifier_for_future_socket(
const Span<const SocketDeclaration *> socket_decls)
{
switch (node.type) {
case GEO_NODE_SAMPLE_CURVE: {
return get_identifier_from_decl("Value", socket, socket_decls);
}
case FN_NODE_RANDOM_VALUE: {
return get_identifier_from_decl({"Min", "Max", "Value"}, socket, socket_decls);
}