Blender V5.0
multi_function_builder.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
8
10 const void *value,
11 bool make_value_copy)
12 : type_(type), owns_value_(make_value_copy)
13{
14 if (make_value_copy) {
15 void *copied_value = MEM_mallocN_aligned(type.size, type.alignment, __func__);
16 type.copy_construct(value, copied_value);
17 value = copied_value;
18 }
19 value_ = value;
20
21 SignatureBuilder builder{"Constant", signature_};
22 builder.single_output("Value", type);
23 this->set_signature(&signature_);
24}
25
27{
28 if (owns_value_) {
29 signature_.params[0].type.data_type().single_type().destruct(const_cast<void *>(value_));
30 MEM_freeN(const_cast<void *>(value_));
31 }
32}
33
36 Context /*context*/) const
37{
38 GMutableSpan output = params.uninitialized_single_output(0);
39 type_.fill_construct_indices(value_, output.data(), mask);
40}
41
43{
44 return type_.hash_or_fallback(value_, uintptr_t(this));
45}
46
48{
49 const CustomMF_GenericConstant *_other = dynamic_cast<const CustomMF_GenericConstant *>(&other);
50 if (_other == nullptr) {
51 return false;
52 }
53 if (type_ != _other->type_) {
54 return false;
55 }
56 return type_.is_equal(value_, _other->value_);
57}
58
60{
61 const CPPType &type = array.type();
62 SignatureBuilder builder{"Constant Vector", signature_};
63 builder.vector_output("Value", type);
64 this->set_signature(&signature_);
65}
66
69 Context /*context*/) const
70{
71 GVectorArray &vectors = params.vector_output(0);
72 mask.foreach_index([&](const int64_t i) { vectors.extend(i, array_); });
73}
74
76 Span<DataType> output_types)
77 : output_amount_(output_types.size())
78{
79 SignatureBuilder builder{"Default Output", signature_};
80 for (DataType data_type : input_types) {
81 builder.input("Input", data_type);
82 }
83 for (DataType data_type : output_types) {
84 builder.output("Output", data_type);
85 }
86 this->set_signature(&signature_);
87}
89{
90 for (int param_index : this->param_indices()) {
91 ParamType param_type = this->param_type(param_index);
92 if (!param_type.is_output()) {
93 continue;
94 }
95
96 if (param_type.data_type().is_single()) {
97 GMutableSpan span = params.uninitialized_single_output(param_index);
98 const CPPType &type = span.type();
99 type.fill_construct_indices(type.default_value(), span.data(), mask);
100 }
101 }
102}
103
105{
106 SignatureBuilder builder{"Copy", signature_};
107 builder.input("Input", data_type);
108 builder.output("Output", data_type);
109 this->set_signature(&signature_);
110}
111
113{
114 const DataType data_type = this->param_type(0).data_type();
115 switch (data_type.category()) {
116 case DataType::Single: {
117 const GVArray &inputs = params.readonly_single_input(0, "Input");
118 GMutableSpan outputs = params.uninitialized_single_output(1, "Output");
119 inputs.materialize_to_uninitialized(mask, outputs.data());
120 break;
121 }
122 case DataType::Vector: {
123 const GVVectorArray &inputs = params.readonly_vector_input(0, "Input");
124 GVectorArray &outputs = params.vector_output(1, "Output");
125 outputs.extend(mask, inputs);
126 break;
127 }
128 }
129}
130
131} // namespace blender::fn::multi_function
long long int int64_t
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
void fill_construct_indices(const void *value, void *dst, const IndexMask &mask) const
void copy_construct(const void *src, void *dst) const
const void * default_value() const
const CPPType & type() const
void extend(int64_t index, const GVArray &values)
CustomMF_DefaultOutput(Span< DataType > input_types, Span< DataType > output_types)
void call(const IndexMask &mask, Params params, Context context) const override
void call(const IndexMask &mask, Params params, Context context) const override
CustomMF_GenericConstant(const CPPType &type, const void *value, bool make_value_copy)
bool equals(const MultiFunction &other) const override
void call(const IndexMask &mask, Params params, Context context) const override
void call(const IndexMask &mask, Params params, Context context) const override
void set_signature(const Signature *signature)
ParamType param_type(int param_index) const
void input(const char *name, DataType data_type)
void vector_output(const char *name, const ParamFlag flag=ParamFlag::None)
void output(const char *name, DataType data_type, const ParamFlag flag=ParamFlag::None)
void single_output(const char *name, const ParamFlag flag=ParamFlag::None)
#define output
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
Definition mallocn.cc:138
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]
i
Definition text_draw.cc:230