Geometry Nodes: skip unused output of multi-function when evaluating on single values

This is slight optimization. Number of nodes with additional outputs like `Valid`
flag of other math-related things will be more in future, its better to strict api
and do not evaluate even singles. This also can reduce number of logged values.

Pull Request: https://projects.blender.org/blender/blender/pulls/121799
This commit is contained in:
Iliya Katueshenock 2024-05-28 12:00:14 +02:00 committed by Jacques Lucke
parent f3af98db5c
commit 0507dc8c2a

@ -546,6 +546,9 @@ static void execute_multi_function_on_value_variant(const MultiFunction &fn,
/* Store the new fields in the output. */
for (const int i : output_values.index_range()) {
if (output_values[i] == nullptr) {
continue;
}
output_values[i]->set(GField{operation, i});
}
}
@ -563,6 +566,10 @@ static void execute_multi_function_on_value_variant(const MultiFunction &fn,
params.add_readonly_single_input(GPointer{cpp_type, value});
}
for (const int i : output_values.index_range()) {
if (output_values[i] == nullptr) {
params.add_ignored_single_output("");
continue;
}
SocketValueVariant &output_variant = *output_values[i];
const CPPType &cpp_type = fn.param_type(params.next_param_index()).data_type().single_type();
const eNodeSocketDatatype socket_type =
@ -716,12 +723,19 @@ class LazyFunctionForMultiFunctionNode : public LazyFunction {
input_values[i] = params.try_get_input_data_ptr<SocketValueVariant>(i);
}
for (const int i : outputs_.index_range()) {
output_values[i] = new (params.get_output_data_ptr(i)) SocketValueVariant();
if (params.get_output_usage(i) != lf::ValueUsage::Unused) {
output_values[i] = new (params.get_output_data_ptr(i)) SocketValueVariant();
}
else {
output_values[i] = nullptr;
}
}
execute_multi_function_on_value_variant(
*fn_item_.fn, fn_item_.owned_fn, input_values, output_values);
for (const int i : outputs_.index_range()) {
params.output_set(i);
if (params.get_output_usage(i) != lf::ValueUsage::Unused) {
params.output_set(i);
}
}
}
};