[Bf-blender-cvs] [53d345a8975] functions-experimental-refactor: add missing implicit conversions
Jacques Lucke
noreply at git.blender.org
Thu Oct 31 14:12:55 CET 2019
Commit: 53d345a89758fbb1c6d5432d4d8fd4e6331497e3
Author: Jacques Lucke
Date: Thu Oct 31 13:15:33 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB53d345a89758fbb1c6d5432d4d8fd4e6331497e3
add missing implicit conversions
===================================================================
M source/blender/blenkernel/BKE_multi_functions.h
M source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_multi_functions.h b/source/blender/blenkernel/BKE_multi_functions.h
index e31b43b278f..b63476f2474 100644
--- a/source/blender/blenkernel/BKE_multi_functions.h
+++ b/source/blender/blenkernel/BKE_multi_functions.h
@@ -142,6 +142,58 @@ template<typename FromT, typename ToT> class MultiFunction_Convert : public Mult
}
};
+template<typename FromT, typename ToT> class MultiFunction_ConvertList : public MultiFunction {
+ public:
+ MultiFunction_ConvertList()
+ {
+ MFSignatureBuilder signature;
+ signature.readonly_vector_input<FromT>("Inputs");
+ signature.vector_output<ToT>("Outputs");
+ this->set_signature(signature);
+ }
+
+ void call(ArrayRef<uint> mask_indices,
+ MFParams ¶ms,
+ MFContext &UNUSED(context)) const override
+ {
+ VirtualListListRef<FromT> inputs = params.readonly_vector_input<FromT>(0, "Inputs");
+ GenericVectorArray::MutableTypedRef<ToT> outputs = params.vector_output<ToT>(1, "Outputs");
+
+ for (uint index : mask_indices) {
+ VirtualListRef<FromT> input_list = inputs[index];
+
+ for (uint i = 0; i < input_list.size(); i++) {
+ const FromT &from_value = input_list[i];
+ ToT to_value = static_cast<ToT>(from_value);
+ outputs.append_single(index, to_value);
+ }
+ }
+ }
+};
+
+template<typename T> class MultiFunction_SingleElementList : public MultiFunction {
+ public:
+ MultiFunction_SingleElementList()
+ {
+ MFSignatureBuilder signature;
+ signature.readonly_single_input<T>("Input");
+ signature.vector_output<T>("Outputs");
+ this->set_signature(signature);
+ }
+
+ void call(ArrayRef<uint> mask_indices,
+ MFParams ¶ms,
+ MFContext &UNUSED(context)) const override
+ {
+ VirtualListRef<T> inputs = params.readonly_single_input<T>(0, "Input");
+ GenericVectorArray::MutableTypedRef<T> outputs = params.vector_output<T>(1, "Outputs");
+
+ for (uint i : mask_indices) {
+ outputs.append_single(i, inputs[i]);
+ }
+ }
+};
+
class MultiFunction_SimpleVectorize final : public MultiFunction {
private:
const MultiFunction &m_function;
diff --git a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
index c06b62bfec2..05a72ea5a6a 100644
--- a/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
+++ b/source/blender/modifiers/intern/MOD_functiondeform_cxx.cc
@@ -615,6 +615,26 @@ static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert
return {node.inputs()[0], node.outputs()[0]};
}
+template<typename FromT, typename ToT>
+static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_convert_list(
+ VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+ const MultiFunction &fn = allocate_resource<BKE::MultiFunction_ConvertList<FromT, ToT>>(
+ "convert list function", resources);
+ MFBuilderFunctionNode &node = builder.add_function(fn, {0}, {1});
+ return {node.inputs()[0], node.outputs()[0]};
+}
+
+template<typename T>
+static std::pair<MFBuilderInputSocket *, MFBuilderOutputSocket *> INSERT_element_to_list(
+ VTreeMFNetworkBuilder &builder, OwnedResources &resources)
+{
+ const MultiFunction &fn = allocate_resource<BKE::MultiFunction_SingleElementList<T>>(
+ "single element list function", resources);
+ MFBuilderFunctionNode &node = builder.add_function(fn, {0}, {1});
+ return {node.inputs()[0], node.outputs()[0]};
+}
+
static Map<std::pair<std::string, std::string>, InsertImplicitConversionFunction>
get_conversion_inserters()
{
@@ -629,6 +649,25 @@ get_conversion_inserters()
inserters.add_new({"fn_IntegerSocket", "fn_BooleanSocket"}, INSERT_convert<int, bool>);
inserters.add_new({"fn_BooleanSocket", "fn_IntegerSocket"}, INSERT_convert<bool, int>);
+ inserters.add_new({"fn_IntegerListSocket", "fn_FloatListSocket"},
+ INSERT_convert_list<int, float>);
+ inserters.add_new({"fn_FloatListSocket", "fn_IntegerListSocket"},
+ INSERT_convert_list<float, int>);
+
+ inserters.add_new({"fn_FloatListSocket", "fn_BooleanListSocket"},
+ INSERT_convert_list<float, bool>);
+ inserters.add_new({"fn_BooleanListSocket", "fn_FloatListSocket"},
+ INSERT_convert_list<bool, float>);
+
+ inserters.add_new({"fn_IntegerListSocket", "fn_BooleanListSocket"},
+ INSERT_convert_list<int, bool>);
+ inserters.add_new({"fn_BooleanListSocket", "fn_IntegerListSocket"},
+ INSERT_convert_list<bool, int>);
+
+ inserters.add_new({"fn_IntegerSocket", "fn_IntegerListSocket"}, INSERT_element_to_list<int>);
+ inserters.add_new({"fn_FloatSocket", "fn_FloatListSocket"}, INSERT_element_to_list<float>);
+ inserters.add_new({"fn_BooleanSocket", "fn_BooleanListSocket"}, INSERT_element_to_list<bool>);
+
return inserters;
}
More information about the Bf-blender-cvs
mailing list