Blender V4.3
FN_multi_function_test_common.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
6
8
10 public:
12 {
13 static const Signature signature = []() {
15 SignatureBuilder builder{"Add Prefix", signature};
16 builder.single_input<std::string>("Prefix");
17 builder.single_mutable<std::string>("Strings");
18 return signature;
19 }();
20 this->set_signature(&signature);
21 }
22
23 void call(const IndexMask &mask, Params params, Context /*context*/) const override
24 {
25 const VArray<std::string> &prefixes = params.readonly_single_input<std::string>(0, "Prefix");
26 MutableSpan<std::string> strings = params.single_mutable<std::string>(1, "Strings");
27
28 mask.foreach_index([&](const int64_t i) { strings[i] = prefixes[i] + strings[i]; });
29 }
30};
31
33 public:
35 {
36 static const Signature signature = []() {
38 SignatureBuilder builder{"Create Range", signature};
39 builder.single_input<int>("Size");
40 builder.vector_output<int>("Range");
41 return signature;
42 }();
43 this->set_signature(&signature);
44 }
45
46 void call(const IndexMask &mask, Params params, Context /*context*/) const override
47 {
48 const VArray<int> &sizes = params.readonly_single_input<int>(0, "Size");
49 GVectorArray &ranges = params.vector_output(1, "Range");
50
51 mask.foreach_index([&](const int64_t i) {
52 int size = sizes[i];
53 for (int j : IndexRange(size)) {
54 ranges.append(i, &j);
55 }
56 });
57 }
58};
59
61 private:
62 Signature signature_;
63
64 public:
66 {
67 SignatureBuilder builder{"Append", signature_};
68 builder.vector_mutable("Vector", type);
69 builder.single_input("Value", type);
70 this->set_signature(&signature_);
71 }
72
73 void call(const IndexMask &mask, Params params, Context /*context*/) const override
74 {
75 GVectorArray &vectors = params.vector_mutable(0, "Vector");
76 const GVArray &values = params.readonly_single_input(1, "Value");
77
78 mask.foreach_index([&](const int64_t i) {
79 BUFFER_FOR_CPP_TYPE_VALUE(values.type(), buffer);
80 values.get(i, buffer);
81 vectors.append(i, buffer);
82 values.type().destruct(buffer);
83 });
84 }
85};
86
88 public:
90 {
91 static const Signature signature = []() {
93 SignatureBuilder builder{"Concat Vectors", signature};
94 builder.vector_mutable<int>("A");
95 builder.vector_input<int>("B");
96 return signature;
97 }();
98 this->set_signature(&signature);
99 }
100
101 void call(const IndexMask &mask, Params params, Context /*context*/) const override
102 {
103 GVectorArray &a = params.vector_mutable(0);
104 const GVVectorArray &b = params.readonly_vector_input(1);
105 a.extend(mask, b);
106 }
107};
108
110 public:
112 {
113 static const Signature signature = []() {
115 SignatureBuilder builder{"Append", signature};
116 builder.vector_mutable<int>("Vector");
117 builder.single_input<int>("Value");
118 return signature;
119 }();
120 this->set_signature(&signature);
121 }
122
123 void call(const IndexMask &mask, Params params, Context /*context*/) const override
124 {
125 GVectorArray_TypedMutableRef<int> vectors = params.vector_mutable<int>(0);
126 const VArray<int> &values = params.readonly_single_input<int>(1);
127
128 mask.foreach_index([&](const int64_t i) { vectors.append(i, values[i]); });
129 }
130};
131
133 public:
135 {
136 static const Signature signature = []() {
138 SignatureBuilder builder{"Sum Vectors", signature};
139 builder.vector_input<int>("Vector");
140 builder.single_output<int>("Sum");
141 return signature;
142 }();
143 this->set_signature(&signature);
144 }
145
146 void call(const IndexMask &mask, Params params, Context /*context*/) const override
147 {
148 const VVectorArray<int> &vectors = params.readonly_vector_input<int>(0);
149 MutableSpan<int> sums = params.uninitialized_single_output<int>(1);
150
151 mask.foreach_index([&](const int64_t i) {
152 int sum = 0;
153 for (int j : IndexRange(vectors.get_vector_size(i))) {
154 sum += vectors.get_vector_element(i, j);
155 }
156 sums[i] = sum;
157 });
158 }
159};
160
162 public:
164 {
165 static const Signature signature = []() {
167 SignatureBuilder builder{"Optional Outputs", signature};
168 builder.single_output<int>("Out 1");
169 builder.single_output<std::string>("Out 2");
170 return signature;
171 }();
172 this->set_signature(&signature);
173 }
174
175 void call(const IndexMask &mask, Params params, Context /*context*/) const override
176 {
177 if (params.single_output_is_required(0, "Out 1")) {
178 MutableSpan<int> values = params.uninitialized_single_output<int>(0, "Out 1");
179 index_mask::masked_fill(values, 5, mask);
180 }
181 MutableSpan<std::string> values = params.uninitialized_single_output<std::string>(1, "Out 2");
182 mask.foreach_index(
183 [&](const int i) { new (&values[i]) std::string("hello, this is a long string"); });
184 }
185};
186
187} // namespace blender::fn::multi_function::tests
#define BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name)
static T sum(const btAlignedObjectArray< T > &items)
void append(const int64_t index, const T &value)
void append(int64_t index, const void *value)
int64_t get_vector_size(const int64_t index) const
T get_vector_element(const int64_t index, const int64_t index_in_vector) const
void set_signature(const Signature *signature)
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
void call(const IndexMask &mask, Params params, Context) const override
local_group_size(16, 16) .push_constant(Type b
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void masked_fill(MutableSpan< T > data, const T &value, const IndexMask &mask)
__int64 int64_t
Definition stdint.h:89