[Bf-blender-cvs] [f52e43554f5] functions-experimental-refactor: simplify interface for generating functions from node trees
Jacques Lucke
noreply at git.blender.org
Sun Nov 3 16:32:30 CET 2019
Commit: f52e43554f58a2db9b62231a19bbc7be899eabab
Author: Jacques Lucke
Date: Sun Nov 3 16:32:23 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBf52e43554f58a2db9b62231a19bbc7be899eabab
simplify interface for generating functions from node trees
===================================================================
M source/blender/functions2/FN_vtree_multi_function_network.h
M source/blender/functions2/FN_vtree_multi_function_network_generation.h
M source/blender/functions2/intern/vtree_multi_function_network/generate.cc
M source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
M source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
===================================================================
diff --git a/source/blender/functions2/FN_vtree_multi_function_network.h b/source/blender/functions2/FN_vtree_multi_function_network.h
index 028063e0696..c08aa56c0fa 100644
--- a/source/blender/functions2/FN_vtree_multi_function_network.h
+++ b/source/blender/functions2/FN_vtree_multi_function_network.h
@@ -37,9 +37,32 @@ class VTreeMFNetwork {
return *m_network;
}
- const MFSocket &lookup_socket(const VSocket &vsocket)
+ const MFInputSocket &lookup_socket(const VInputSocket &vsocket)
{
- return *m_socket_map[vsocket.id()];
+ return m_socket_map[vsocket.id()]->as_input();
+ }
+
+ const MFOutputSocket &lookup_socket(const VOutputSocket &vsocket)
+ {
+ return m_socket_map[vsocket.id()]->as_output();
+ }
+
+ void lookup_sockets(ArrayRef<const VOutputSocket *> vsockets,
+ MutableArrayRef<const MFOutputSocket *> r_result)
+ {
+ BLI_assert(vsockets.size() == r_result.size());
+ for (uint i = 0; i < vsockets.size(); i++) {
+ r_result[i] = &this->lookup_socket(*vsockets[i]);
+ }
+ }
+
+ void lookup_sockets(ArrayRef<const VInputSocket *> vsockets,
+ MutableArrayRef<const MFInputSocket *> r_result)
+ {
+ BLI_assert(vsockets.size() == r_result.size());
+ for (uint i = 0; i < vsockets.size(); i++) {
+ r_result[i] = &this->lookup_socket(*vsockets[i]);
+ }
}
};
diff --git a/source/blender/functions2/FN_vtree_multi_function_network_generation.h b/source/blender/functions2/FN_vtree_multi_function_network_generation.h
index 93c54883827..a0c27f9ac4e 100644
--- a/source/blender/functions2/FN_vtree_multi_function_network_generation.h
+++ b/source/blender/functions2/FN_vtree_multi_function_network_generation.h
@@ -3,6 +3,7 @@
#include "FN_vtree_multi_function_network.h"
#include "BLI_owned_resources.h"
+#include "intern/multi_functions/network.h"
namespace FN {
@@ -11,6 +12,9 @@ using BLI::OwnedResources;
std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const VirtualNodeTree &vtree,
OwnedResources &resources);
+std::unique_ptr<MF_EvaluateNetwork> generate_vtree_multi_function(const VirtualNodeTree &vtree,
+ OwnedResources &resources);
+
} // namespace FN
#endif /* __FN_VTREE_MULTI_FUNCTION_NETWORK_GENERATION_H__ */
diff --git a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
index 54a841e1885..8ac2164a64a 100644
--- a/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions2/intern/vtree_multi_function_network/generate.cc
@@ -116,4 +116,34 @@ std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const Virt
return vtree_network;
}
+std::unique_ptr<MF_EvaluateNetwork> generate_vtree_multi_function(const VirtualNodeTree &vtree,
+ OwnedResources &resources)
+{
+ std::unique_ptr<VTreeMFNetwork> network = generate_vtree_multi_function_network(vtree,
+ resources);
+
+ auto input_vnodes = vtree.nodes_with_idname("fn_FunctionInputNode");
+ auto output_vnodes = vtree.nodes_with_idname("fn_FunctionOutputNode");
+
+ Vector<const MFOutputSocket *> function_inputs;
+ Vector<const MFInputSocket *> function_outputs;
+
+ if (input_vnodes.size() == 1) {
+ auto vsockets = input_vnodes.first()->outputs().drop_back(1);
+ function_inputs.append_n_times(nullptr, vsockets.size());
+ network->lookup_sockets(vsockets, function_inputs);
+ }
+
+ if (output_vnodes.size() == 1) {
+ auto vsockets = output_vnodes.first()->inputs().drop_back(1);
+ function_outputs.append_n_times(nullptr, vsockets.size());
+ network->lookup_sockets(vsockets, function_outputs);
+ }
+
+ auto function = BLI::make_unique<MF_EvaluateNetwork>(std::move(function_inputs),
+ std::move(function_outputs));
+ resources.add(std::move(network), "VTree Multi Function Network");
+ return function;
+}
+
} // namespace FN
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index 4d1ca16a54d..f8845e2893e 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -35,23 +35,10 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
vtree_builder.add_all_of_node_tree(btree);
auto vtree = vtree_builder.build();
- const VNode &input_vnode = *vtree->nodes_with_idname("fn_FunctionInputNode")[0];
- const VNode &output_vnode = *vtree->nodes_with_idname("fn_FunctionOutputNode")[0];
-
BLI::OwnedResources resources;
- auto vtree_network = FN::generate_vtree_multi_function_network(*vtree, resources);
-
- Vector<const MFOutputSocket *> function_inputs = {
- &vtree_network->lookup_socket(input_vnode.output(0)).as_output(),
- &vtree_network->lookup_socket(input_vnode.output(1)).as_output(),
- &vtree_network->lookup_socket(input_vnode.output(2)).as_output()};
-
- Vector<const MFInputSocket *> function_outputs = {
- &vtree_network->lookup_socket(output_vnode.input(0)).as_input()};
-
- FN::MF_EvaluateNetwork function{function_inputs, function_outputs};
+ auto function = FN::generate_vtree_multi_function(*vtree, resources);
- MFParamsBuilder params(function, numVerts);
+ MFParamsBuilder params(*function, numVerts);
params.add_readonly_single_input(ArrayRef<float3>((float3 *)vertexCos, numVerts));
params.add_readonly_single_input(&fdmd->control1);
params.add_readonly_single_input(&fdmd->control2);
@@ -61,7 +48,7 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
MFContext context;
context.vertex_positions = ArrayRef<float3>((float3 *)vertexCos, numVerts);
- function.call(IndexRange(numVerts).as_array_ref(), params.build(), context);
+ function->call(IndexRange(numVerts).as_array_ref(), params.build(), context);
memcpy(vertexCos, output_vectors.begin(), output_vectors.size() * sizeof(float3));
}
diff --git a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
index 0338582f5d3..9ec468feea1 100644
--- a/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functionpoints_cxx.cc
@@ -39,22 +39,10 @@ Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd)
vtree_builder.add_all_of_node_tree(btree);
auto vtree = vtree_builder.build();
- const VNode &input_vnode = *vtree->nodes_with_idname("fn_FunctionInputNode")[0];
- const VNode &output_vnode = *vtree->nodes_with_idname("fn_FunctionOutputNode")[0];
-
BLI::OwnedResources resources;
- auto vtree_network = FN::generate_vtree_multi_function_network(*vtree, resources);
-
- Vector<const MFOutputSocket *> function_inputs = {
- &vtree_network->lookup_socket(input_vnode.output(0)).as_output(),
- &vtree_network->lookup_socket(input_vnode.output(1)).as_output()};
-
- Vector<const MFInputSocket *> function_outputs = {
- &vtree_network->lookup_socket(output_vnode.input(0)).as_input()};
-
- FN::MF_EvaluateNetwork function{function_inputs, function_outputs};
+ auto function = FN::generate_vtree_multi_function(*vtree, resources);
- MFParamsBuilder params(function, 1);
+ MFParamsBuilder params(*function, 1);
params.add_readonly_single_input(&fpmd->control1);
params.add_readonly_single_input(&fpmd->control2);
@@ -62,7 +50,7 @@ Mesh *MOD_functionpoints_do(FunctionPointsModifierData *fpmd)
params.add_vector_output(vector_array);
MFContext context;
- function.call(FN::MFMask({0}), params.build(), context);
+ function->call(FN::MFMask({0}), params.build(), context);
ArrayRef<float3> output_points = vector_array[0].as_typed_ref<float3>();
More information about the Bf-blender-cvs
mailing list