[Bf-blender-cvs] [7bef9b83fb5] functions-experimental-refactor: initial MultiFunction generation from node tree
Jacques Lucke
noreply at git.blender.org
Tue Oct 22 13:55:10 CEST 2019
Commit: 7bef9b83fb587e3b69ec4a37a3de5273896b1e6f
Author: Jacques Lucke
Date: Tue Oct 22 13:54:55 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB7bef9b83fb587e3b69ec4a37a3de5273896b1e6f
initial MultiFunction generation from node tree
===================================================================
M source/blender/blenkernel/BKE_multi_function.h
M source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_multi_function.h b/source/blender/blenkernel/BKE_multi_function.h
index a776ff8dcee..4b343fc12f9 100644
--- a/source/blender/blenkernel/BKE_multi_function.h
+++ b/source/blender/blenkernel/BKE_multi_function.h
@@ -520,6 +520,9 @@ class MFParamsBuilder {
class MultiFunction {
public:
+ virtual ~MultiFunction()
+ {
+ }
virtual void call(ArrayRef<uint> mask_indices, MFParams ¶ms, MFContext &context) const = 0;
const MFSignature &signature() const
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index b890e236561..4eb941d2ed4 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -57,13 +57,9 @@ static MFDataType get_type_by_socket(const VirtualSocket &vsocket)
if (idname == "fn_FloatSocket") {
return MFDataType::ForSingle<float>();
}
- else if (idname == "fn_IntegerSocket") {
- return MFDataType::ForSingle<int>();
- }
else if (idname == "fn_VectorSocket") {
return MFDataType::ForSingle<float3>();
}
- BLI_assert(false);
return MFDataType();
}
@@ -91,7 +87,7 @@ class VTreeMFNetwork {
return *m_network;
}
- const MFSocket &lookup_socket(VirtualSocket &vsocket)
+ const MFSocket &lookup_socket(const VirtualSocket &vsocket)
{
return *m_socket_map[vsocket.id()];
}
@@ -128,14 +124,14 @@ class VTreeMFNetworkBuilder {
return m_vtree;
}
- MFBuilderFunctionNode &add_function(MultiFunction &function,
+ MFBuilderFunctionNode &add_function(const MultiFunction &function,
ArrayRef<uint> input_param_indices,
ArrayRef<uint> output_param_indices)
{
return m_builder->add_function(function, input_param_indices, output_param_indices);
}
- MFBuilderFunctionNode &add_function(MultiFunction &function,
+ MFBuilderFunctionNode &add_function(const MultiFunction &function,
ArrayRef<uint> input_param_indices,
ArrayRef<uint> output_param_indices,
const VirtualNode &vnode)
@@ -187,7 +183,7 @@ class VTreeMFNetworkBuilder {
bool is_data_socket(const VirtualSocket &vsocket) const
{
- return m_type_by_vsocket[vsocket.id()].is_none();
+ return !m_type_by_vsocket[vsocket.id()].is_none();
}
void map_sockets_exactly(const VirtualNode &vnode, MFBuilderNode &node)
@@ -271,7 +267,13 @@ class VTreeMFNetworkBuilder {
return false;
}
- MFBuilderOutputSocket &lookup_output_socket(const VirtualSocket &vsocket)
+ bool is_input_linked(const VirtualSocket &vsocket) const
+ {
+ auto &socket = this->lookup_input_socket(vsocket);
+ return socket.as_input().origin() != nullptr;
+ }
+
+ MFBuilderOutputSocket &lookup_output_socket(const VirtualSocket &vsocket) const
{
BLI_assert(vsocket.is_output());
MFBuilderSocket *socket = m_socket_map[vsocket.id()];
@@ -279,7 +281,7 @@ class VTreeMFNetworkBuilder {
return socket->as_output();
}
- MFBuilderInputSocket &lookup_input_socket(const VirtualSocket &vsocket)
+ MFBuilderInputSocket &lookup_input_socket(const VirtualSocket &vsocket) const
{
BLI_assert(vsocket.is_input());
MFBuilderSocket *socket = m_socket_map[vsocket.id()];
@@ -289,13 +291,21 @@ class VTreeMFNetworkBuilder {
std::unique_ptr<VTreeMFNetwork> build()
{
+ Array<int> socket_ids(m_vtree.socket_count(), -1);
+ for (uint vsocket_id = 0; vsocket_id < m_vtree.socket_count(); vsocket_id++) {
+ MFBuilderSocket *builder_socket = m_socket_map[vsocket_id];
+ if (builder_socket != nullptr) {
+ socket_ids[vsocket_id] = builder_socket->id();
+ }
+ }
+
auto network = BLI::make_unique<MFNetwork>(std::move(m_builder));
Array<const MFSocket *> socket_map(m_vtree.socket_count(), nullptr);
for (uint vsocket_id = 0; vsocket_id < m_vtree.socket_count(); vsocket_id++) {
- MFBuilderSocket *builder_socket = m_socket_map[vsocket_id];
- if (builder_socket != nullptr) {
- socket_map[vsocket_id] = &network->socket_by_id(builder_socket->id());
+ int id = socket_ids[vsocket_id];
+ if (id != -1) {
+ socket_map[vsocket_id] = &network->socket_by_id(socket_ids[vsocket_id]);
}
}
@@ -305,6 +315,8 @@ class VTreeMFNetworkBuilder {
using InsertVNodeFunction = std::function<void(
VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualNode &vnode)>;
+using InsertUnlinkedInputFunction = std::function<MFBuilderOutputSocket &(
+ VTreeMFNetworkBuilder &builder, OwnedResources &resources, const VirtualSocket &vsocket)>;
static void INSERT_vector_math(VTreeMFNetworkBuilder &builder,
OwnedResources &resources,
@@ -342,7 +354,44 @@ static StringMap<InsertVNodeFunction> get_node_inserters()
return inserters;
}
-static void insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+static MFBuilderOutputSocket &INSERT_vector_socket(VTreeMFNetworkBuilder &builder,
+ OwnedResources &resources,
+ const VirtualSocket &vsocket)
+{
+ PointerRNA rna = vsocket.rna();
+ float3 value;
+ RNA_float_get_array(&rna, "value", value);
+
+ auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<float3>>(value);
+ auto &node = builder.add_function(*function, {}, {0});
+
+ resources.add(std::move(function), "vector input");
+ return *node.outputs()[0];
+}
+
+static MFBuilderOutputSocket &INSERT_float_socket(VTreeMFNetworkBuilder &builder,
+ OwnedResources &resources,
+ const VirtualSocket &vsocket)
+{
+ PointerRNA rna = vsocket.rna();
+ float value = RNA_float_get(&rna, "value");
+
+ auto function = BLI::make_unique<BKE::MultiFunction_ConstantValue<float>>(value);
+ auto &node = builder.add_function(*function, {}, {0});
+
+ resources.add(std::move(function), "float input");
+ return *node.outputs()[0];
+}
+
+static StringMap<InsertUnlinkedInputFunction> get_unlinked_input_inserter()
+{
+ StringMap<InsertUnlinkedInputFunction> inserters;
+ inserters.add_new("fn_VectorSocket", INSERT_vector_socket);
+ inserters.add_new("fn_FloatSocket", INSERT_float_socket);
+ return inserters;
+}
+
+static bool insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
{
const VirtualNodeTree &vtree = builder.vtree();
auto inserters = get_node_inserters();
@@ -359,9 +408,11 @@ static void insert_nodes(VTreeMFNetworkBuilder &builder, OwnedResources &resourc
builder.add_placeholder(*vnode);
}
}
+
+ return true;
}
-static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &UNUSED(resources))
{
for (const VirtualSocket *to_vsocket : builder.vtree().inputs_with_links()) {
if (to_vsocket->links().size() > 1) {
@@ -387,48 +438,37 @@ static bool insert_links(VTreeMFNetworkBuilder &builder, OwnedResources &resourc
builder.add_link(from_socket, to_socket);
}
+
+ return true;
}
-static std::unique_ptr<BKE::MultiFunction> get_multi_function_by_node(VirtualNode *vnode)
+static bool insert_unlinked_inputs(VTreeMFNetworkBuilder &builder, OwnedResources &resources)
{
- StringRef idname = vnode->idname();
-
- if (idname == "fn_VectorMathNode") {
- return BLI::make_unique<BKE::MultiFunction_AddFloat3s>();
- }
- else if (idname == "fn_CombineVectorNode") {
- return BLI::make_unique<BKE::MultiFunction_CombineVector>();
- }
- else if (idname == "fn_SeparateVectorNode") {
- return BLI::make_unique<BKE::MultiFunction_SeparateVector>();
- }
- else {
- BLI_assert(false);
- return {};
+ Vector<const VirtualSocket *> unlinked_data_inputs;
+ for (const VirtualNode *vnode : builder.vtree().nodes()) {
+ for (const VirtualSocket *vsocket : vnode->inputs()) {
+ if (builder.is_data_socket(*vsocket)) {
+ if (!builder.is_input_linked(*vsocket)) {
+ unlinked_data_inputs.append(vsocket);
+ }
+ }
+ }
}
-}
-static void load_socket_value(VirtualSocket *vsocket, TupleRef tuple, uint index)
-{
- StringRef idname = vsocket->idname();
- PointerRNA rna = vsocket->rna();
+ auto inserters = get_unlinked_input_inserter();
- if (idname == "fn_FloatSocket") {
- float value = RNA_float_get(&rna, "value");
- tuple.set<float>(index, value);
- }
- else if (idname == "fn_IntegerSocket") {
- int value = RNA_int_get(&rna, "value");
- tuple.set<int>(index, value);
- }
- else if (idname == "fn_VectorSocket") {
- float3 value;
- RNA_float_get_array(&rna, "value", value);
- tuple.set<float3>(index, value);
- }
- else {
- BLI_assert(false);
+ for (const VirtualSocket *vsocket : unlinked_data_inputs) {
+ InsertUnlinkedInputFunction *inserter = inserters.lookup_ptr(vsocket->idname());
+
+ if (inserter == nullptr) {
+ return false;
+ }
+ MFBuilderOutputSocket &from_socket = (*inserter)(builder, resources, *vsocket);
+ MFBuilderInputSocket &to_socket = builder.lookup_input_socket(*vsocket);
+ builder.add_link(from_socket, to_socket);
}
+
+ return true;
}
class MultiFunction_FunctionTree : public BKE::MultiFunction {
@@ -544,36 +584,34 @@ void MOD_functiondeform_do(FunctionDeformModifierData *fdmd, float (*vertexCos)[
bNodeTree *tree = (bNodeTree *)DEG_get_original_id((ID *)fdmd->function_tree);
VirtualNodeTree vtree;
- // vtree.add_all_of_tree(tree);
+ vtree.add_all_of_tree(tree);
vtree.freeze_and_index();
- VTreeMFNetworkBuilder builder(vtree);
-
- auto &input_node = builder.add_placeholder(
- {}, {MFDataType::ForSingle<float3>(), MFDataType::ForSingle<float>()});
-
- auto &output_node = builder.add_placeholder({MFDataType::ForSingle<float3>()}, {});
+ const VirtualNode &input_vnode = *vtree.nodes_with_idname("fn_FunctionInputNode")[0];
+ const Virt
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list