Blender V4.3
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
7#include "BLI_hash.hh"
8
10
12 const void *value,
13 bool make_value_copy)
14 : type_(type), owns_value_(make_value_copy)
15{
16 if (make_value_copy) {
17 void *copied_value = MEM_mallocN_aligned(type.size(), type.alignment(), __func__);
18 type.copy_construct(value, copied_value);
19 value = copied_value;
20 }
21 value_ = value;
22
23 SignatureBuilder builder{"Constant", signature_};
24 builder.single_output("Value", type);
25 this->set_signature(&signature_);
26}
27
29{
30 if (owns_value_) {
31 signature_.params[0].type.data_type().single_type().destruct(const_cast<void *>(value_));
32 MEM_freeN(const_cast<void *>(value_));
33 }
34}
35
38 Context /*context*/) const
39{
40 GMutableSpan output = params.uninitialized_single_output(0);
41 type_.fill_construct_indices(value_, output.data(), mask);
42}
43
45{
46 return type_.hash_or_fallback(value_, uintptr_t(this));
47}
48
50{
51 const CustomMF_GenericConstant *_other = dynamic_cast<const CustomMF_GenericConstant *>(&other);
52 if (_other == nullptr) {
53 return false;
54 }
55 if (type_ != _other->type_) {
56 return false;
57 }
58 return type_.is_equal(value_, _other->value_);
59}
60
62{
63 const CPPType &type = array.type();
64 SignatureBuilder builder{"Constant Vector", signature_};
65 builder.vector_output("Value", type);
66 this->set_signature(&signature_);
67}
68
71 Context /*context*/) const
72{
73 GVectorArray &vectors = params.vector_output(0);
74 mask.foreach_index([&](const int64_t i) { vectors.extend(i, array_); });
75}
76
78 Span<DataType> output_types)
79 : output_amount_(output_types.size())
80{
81 SignatureBuilder builder{"Default Output", signature_};
82 for (DataType data_type : input_types) {
83 builder.input("Input", data_type);
84 }
85 for (DataType data_type : output_types) {
86 builder.output("Output", data_type);
87 }
88 this->set_signature(&signature_);
89}
90void CustomMF_DefaultOutput::call(const IndexMask &mask, Params params, Context /*context*/) const
91{
92 for (int param_index : this->param_indices()) {
93 ParamType param_type = this->param_type(param_index);
94 if (!param_type.is_output()) {
95 continue;
96 }
97
99 GMutableSpan span = params.uninitialized_single_output(param_index);
100 const CPPType &type = span.type();
101 type.fill_construct_indices(type.default_value(), span.data(), mask);
102 }
103 }
104}
105
107{
108 SignatureBuilder builder{"Copy", signature_};
109 builder.input("Input", data_type);
110 builder.output("Output", data_type);
111 this->set_signature(&signature_);
112}
113
114void CustomMF_GenericCopy::call(const IndexMask &mask, Params params, Context /*context*/) const
115{
116 const DataType data_type = this->param_type(0).data_type();
117 switch (data_type.category()) {
118 case DataType::Single: {
119 const GVArray &inputs = params.readonly_single_input(0, "Input");
120 GMutableSpan outputs = params.uninitialized_single_output(1, "Output");
121 inputs.materialize_to_uninitialized(mask, outputs.data());
122 break;
123 }
124 case DataType::Vector: {
125 const GVVectorArray &inputs = params.readonly_vector_input(0, "Input");
126 GVectorArray &outputs = params.vector_output(1, "Output");
127 outputs.extend(mask, inputs);
128 break;
129 }
130 }
131}
132
133} // namespace blender::fn::multi_function
uint64_t hash_or_fallback(const void *value, uint64_t fallback_hash) const
bool is_equal(const void *a, const void *b) const
void fill_construct_indices(const void *value, void *dst, const IndexMask &mask) 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
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
Definition mallocn.cc:110
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
_W64 unsigned int uintptr_t
Definition stdint.h:119
__int64 int64_t
Definition stdint.h:89
unsigned __int64 uint64_t
Definition stdint.h:90