[Bf-blender-cvs] [92130916d5c] functions: fix network evaluation
Jacques Lucke
noreply at git.blender.org
Thu Nov 21 15:19:47 CET 2019
Commit: 92130916d5cb7d28bbbc20eefedb965389447905
Author: Jacques Lucke
Date: Thu Nov 21 12:48:13 2019 +0100
Branches: functions
https://developer.blender.org/rB92130916d5cb7d28bbbc20eefedb965389447905
fix network evaluation
===================================================================
M source/blender/functions/intern/multi_functions/network.cc
M source/blender/functions/intern/multi_functions/network.h
===================================================================
diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index 03400496c30..b95e31d09e4 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -9,26 +9,51 @@ void MF_EvaluateNetwork::call(MFMask mask, MFParams params, MFContext context) c
}
Storage storage(mask);
- this->copy_inputs_to_storage(params, storage);
+ this->copy_inputs_to_storage(mask, params, storage);
this->evaluate_network_to_compute_outputs(mask, context, storage);
this->copy_computed_values_to_outputs(mask, params, storage);
}
-BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFParams params,
+BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
+ MFParams params,
Storage &storage) const
{
- for (uint i = 0; i < m_inputs.size(); i++) {
- const MFOutputSocket &socket = *m_inputs[i];
+ for (uint input_index = 0; input_index < m_inputs.size(); input_index++) {
+ const MFOutputSocket &socket = *m_inputs[input_index];
switch (socket.type().category()) {
case MFDataType::Single: {
- GenericVirtualListRef input_list = params.readonly_single_input(i, "Input");
+ GenericVirtualListRef input_list = params.readonly_single_input(input_index, "Input");
for (const MFInputSocket *target : socket.targets()) {
- storage.set_virtual_list_for_input__non_owning(*target, input_list);
+ const MFNode &target_node = target->node();
+ if (target_node.is_function()) {
+ const MFFunctionNode &target_function_node = target_node.as_function();
+ uint param_index = target_function_node.input_param_indices()[target->index()];
+ MFParamType param_type = target_function_node.function().param_type(param_index);
+
+ if (param_type.is_single_input()) {
+ storage.set_virtual_list_for_input__non_owning(*target, input_list);
+ }
+ else if (param_type.is_mutable_single()) {
+ GenericMutableArrayRef array = this->allocate_array(param_type.data_type().type(),
+ mask.min_array_size());
+ for (uint i : mask.indices()) {
+ array.copy_in__uninitialized(i, input_list[i]);
+ }
+ storage.set_array_ref_for_input__non_owning(*target, array);
+ }
+ else {
+ BLI_assert(false);
+ }
+ }
+ else {
+ storage.set_virtual_list_for_input__non_owning(*target, input_list);
+ }
}
break;
}
case MFDataType::Vector: {
- GenericVirtualListListRef input_list_list = params.readonly_vector_input(i, "Input");
+ GenericVirtualListListRef input_list_list = params.readonly_vector_input(input_index,
+ "Input");
for (const MFInputSocket *target : socket.targets()) {
const MFNode &target_node = target->node();
if (target_node.is_function()) {
@@ -41,8 +66,8 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFParams params,
}
else if (param_type.is_mutable_vector()) {
GenericVectorArray *vector_array = new GenericVectorArray(
- param_type.data_type().base_type(), input_list_list.size());
- for (uint i = 0; i < input_list_list.size(); i++) {
+ param_type.data_type().base_type(), mask.min_array_size());
+ for (uint i : mask.indices()) {
vector_array->extend_single__copy(i, input_list_list[i]);
}
storage.set_vector_array_for_input__non_owning(*target, vector_array);
diff --git a/source/blender/functions/intern/multi_functions/network.h b/source/blender/functions/intern/multi_functions/network.h
index f4a88973a6f..2687618d2b0 100644
--- a/source/blender/functions/intern/multi_functions/network.h
+++ b/source/blender/functions/intern/multi_functions/network.h
@@ -163,7 +163,7 @@ class MF_EvaluateNetwork final : public MultiFunction {
void call(MFMask mask, MFParams params, MFContext context) const override;
private:
- void copy_inputs_to_storage(MFParams params, Storage &storage) const;
+ void copy_inputs_to_storage(MFMask mask, MFParams params, Storage &storage) const;
void evaluate_network_to_compute_outputs(MFMask mask,
MFContext &global_context,
More information about the Bf-blender-cvs
mailing list