Cleanup: Use dynamic declaration for sample curve node
Change the attribute "value" sockets to use dynamic declarations, but not the others. See8149678d5e
,f7383cfe9b
.
This commit is contained in:
parent
84c65732fe
commit
da6867ca3b
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ¶ms)
|
||||
{
|
||||
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 ¶ms, 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 ¶ms, 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()
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue