Blender V4.3
node_shader_sepcomb_xyz.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2014 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "node_shader_util.hh"
10
12
14#include "NOD_multi_function.hh"
16
18
20{
21 b.is_function_node();
22 b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f);
23 b.add_output<decl::Float>("X");
24 b.add_output<decl::Float>("Y");
25 b.add_output<decl::Float>("Z");
26}
27
29 bNode *node,
30 bNodeExecData * /*execdata*/,
31 GPUNodeStack *in,
32 GPUNodeStack *out)
33{
34 return GPU_stack_link(mat, node, "separate_xyz", in, out);
35}
36
38 public:
40 {
41 static const mf::Signature signature = []() {
43 mf::SignatureBuilder builder{"Separate XYZ", signature};
44 builder.single_input<float3>("XYZ");
45 builder.single_output<float>("X", mf::ParamFlag::SupportsUnusedOutput);
46 builder.single_output<float>("Y", mf::ParamFlag::SupportsUnusedOutput);
47 builder.single_output<float>("Z", mf::ParamFlag::SupportsUnusedOutput);
48 return signature;
49 }();
50 this->set_signature(&signature);
51 }
52
53 void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override
54 {
55 const VArray<float3> &vectors = params.readonly_single_input<float3>(0, "XYZ");
56 MutableSpan<float> xs = params.uninitialized_single_output_if_required<float>(1, "X");
57 MutableSpan<float> ys = params.uninitialized_single_output_if_required<float>(2, "Y");
58 MutableSpan<float> zs = params.uninitialized_single_output_if_required<float>(3, "Z");
59
60 std::array<MutableSpan<float>, 3> outputs = {xs, ys, zs};
61 Vector<int> used_outputs;
62 if (!xs.is_empty()) {
63 used_outputs.append(0);
64 }
65 if (!ys.is_empty()) {
66 used_outputs.append(1);
67 }
68 if (!zs.is_empty()) {
69 used_outputs.append(2);
70 }
71
72 devirtualize_varray(vectors, [&](auto vectors) {
73 mask.foreach_segment_optimized([&](const auto segment) {
74 const int used_outputs_num = used_outputs.size();
75 const int *used_outputs_data = used_outputs.data();
76
77 for (const int64_t i : segment) {
78 const float3 &vector = vectors[i];
79 for (const int out_i : IndexRange(used_outputs_num)) {
80 const int coordinate = used_outputs_data[out_i];
81 outputs[coordinate][i] = vector[coordinate];
82 }
83 }
84 });
85 });
86 }
87};
88
90{
91 static MF_SeparateXYZ separate_fn;
92 builder.set_matching_fn(separate_fn);
93}
94
96{
97 using namespace value_elem;
98 const VectorElem vector_elem = params.get_input_elem<VectorElem>("Vector");
99 params.set_output_elem("X", vector_elem.x);
100 params.set_output_elem("Y", vector_elem.y);
101 params.set_output_elem("Z", vector_elem.z);
102}
103
105{
106 using namespace value_elem;
108 result.x = params.get_output_elem<FloatElem>("X");
109 result.y = params.get_output_elem<FloatElem>("Y");
110 result.z = params.get_output_elem<FloatElem>("Z");
111 params.set_input_elem("Vector", result);
112}
113
115{
116 params.set_input("Vector",
117 float3(params.get_output<float>("X"),
118 params.get_output<float>("Y"),
119 params.get_output<float>("Z")));
120}
121
123#ifdef WITH_MATERIALX
124{
125 NodeItem vector = get_input_value("Vector", NodeItem::Type::Vector3);
126 int index = STREQ(socket_out_->name, "X") ? 0 : STREQ(socket_out_->name, "Y") ? 1 : 2;
127 return vector[index];
128}
129#endif
131
132} // namespace blender::nodes::node_shader_sepcomb_xyz_cc::sep
133
135{
137
138 static blender::bke::bNodeType ntype;
139
141 ntype.declare = file_ns::sh_node_sepxyz_declare;
142 ntype.gpu_fn = file_ns::gpu_shader_sepxyz;
143 ntype.build_multi_function = file_ns::sh_node_sepxyz_build_multi_function;
144 ntype.materialx_fn = file_ns::node_shader_materialx;
145 ntype.eval_elem = file_ns::sh_node_sepxyz_eval_elem;
146 ntype.eval_inverse_elem = file_ns::sh_node_sepxyz_eval_inverse_elem;
147 ntype.eval_inverse = file_ns::sh_node_sepxyz_eval_inverse;
148
150}
151
153
155{
156 b.is_function_node();
157 b.add_input<decl::Float>("X").min(-10000.0f).max(10000.0f);
158 b.add_input<decl::Float>("Y").min(-10000.0f).max(10000.0f);
159 b.add_input<decl::Float>("Z").min(-10000.0f).max(10000.0f);
160 b.add_output<decl::Vector>("Vector");
161}
162
164 bNode *node,
165 bNodeExecData * /*execdata*/,
166 GPUNodeStack *in,
167 GPUNodeStack *out)
168{
169 return GPU_stack_link(mat, node, "combine_xyz", in, out);
170}
171
173{
174 static auto fn = mf::build::SI3_SO<float, float, float, float3>(
175 "Combine Vector",
176 [](float x, float y, float z) { return float3(x, y, z); },
177 mf::build::exec_presets::AllSpanOrSingle());
178 builder.set_matching_fn(fn);
179}
180
182{
183 using namespace value_elem;
184 VectorElem vector_elem;
185 vector_elem.x = params.get_input_elem<FloatElem>("X");
186 vector_elem.y = params.get_input_elem<FloatElem>("Y");
187 vector_elem.z = params.get_input_elem<FloatElem>("Z");
188 params.set_output_elem("Vector", vector_elem);
189}
190
192{
193 using namespace value_elem;
194 const VectorElem output_elem = params.get_output_elem<VectorElem>("Vector");
195 params.set_input_elem("X", output_elem.x);
196 params.set_input_elem("Y", output_elem.y);
197 params.set_input_elem("Z", output_elem.z);
198}
199
201{
202 const float3 output = params.get_output<float3>("Vector");
203 params.set_input("X", output.x);
204 params.set_input("Y", output.y);
205 params.set_input("Z", output.z);
206}
207
209#ifdef WITH_MATERIALX
210{
211 NodeItem x = get_input_value("X", NodeItem::Type::Float);
212 NodeItem y = get_input_value("Y", NodeItem::Type::Float);
213 NodeItem z = get_input_value("Z", NodeItem::Type::Float);
214
215 return create_node("combine3", NodeItem::Type::Vector3, {{"in1", x}, {"in2", y}, {"in3", z}});
216}
217#endif
219
220} // namespace blender::nodes::node_shader_sepcomb_xyz_cc::comb
221
223{
225
226 static blender::bke::bNodeType ntype;
227
229 ntype.declare = file_ns::sh_node_combxyz_declare;
230 ntype.gpu_fn = file_ns::gpu_shader_combxyz;
231 ntype.build_multi_function = file_ns::sh_node_combxyz_build_multi_function;
232 ntype.materialx_fn = file_ns::node_shader_materialx;
233 ntype.eval_elem = file_ns::sh_node_combxyz_eval_elem;
234 ntype.eval_inverse_elem = file_ns::sh_node_combxyz_eval_inverse_elem;
235 ntype.eval_inverse = file_ns::sh_node_combxyz_eval_inverse;
236
238}
#define SH_NODE_COMBXYZ
Definition BKE_node.hh:972
#define NODE_CLASS_CONVERTER
Definition BKE_node.hh:410
#define SH_NODE_SEPXYZ
Definition BKE_node.hh:971
#define STREQ(a, b)
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
int64_t size() const
void append(const T &value)
void set_signature(const Signature *signature)
void set_matching_fn(const mf::MultiFunction *fn)
void call(const IndexMask &mask, mf::Params params, mf::Context) const override
local_group_size(16, 16) .push_constant(Type b
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void node_register_type(bNodeType *ntype)
Definition node.cc:1708
static int gpu_shader_combxyz(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void sh_node_combxyz_eval_inverse_elem(value_elem::InverseElemEvalParams &params)
static void sh_node_combxyz_eval_elem(value_elem::ElemEvalParams &params)
static void sh_node_combxyz_eval_inverse(inverse_eval::InverseEvalParams &params)
static void sh_node_combxyz_build_multi_function(NodeMultiFunctionBuilder &builder)
static void sh_node_combxyz_declare(NodeDeclarationBuilder &b)
static void sh_node_sepxyz_build_multi_function(NodeMultiFunctionBuilder &builder)
static void sh_node_sepxyz_eval_inverse_elem(value_elem::InverseElemEvalParams &params)
static int gpu_shader_sepxyz(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void sh_node_sepxyz_eval_elem(value_elem::ElemEvalParams &params)
static void sh_node_sepxyz_declare(NodeDeclarationBuilder &b)
static void sh_node_sepxyz_eval_inverse(inverse_eval::InverseEvalParams &params)
void devirtualize_varray(const VArray< T > &varray, const Func &func, bool enable=true)
VecBase< float, 3 > float3
#define NODE_SHADER_MATERIALX_BEGIN
#define NODE_SHADER_MATERIALX_END
void register_node_type_sh_combxyz()
void register_node_type_sh_sepxyz()
void sh_fn_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
#define min(a, b)
Definition sort.c:32
__int64 int64_t
Definition stdint.h:89
Defines a node type.
Definition BKE_node.hh:218
NodeInverseElemEvalFunction eval_inverse_elem
Definition BKE_node.hh:378
NodeMaterialXFunction materialx_fn
Definition BKE_node.hh:320
NodeInverseEvalFunction eval_inverse
Definition BKE_node.hh:385
NodeGPUExecFunction gpu_fn
Definition BKE_node.hh:318
NodeElemEvalFunction eval_elem
Definition BKE_node.hh:372
NodeMultiFunctionBuildFunction build_multi_function
Definition BKE_node.hh:336
NodeDeclareFunction declare
Definition BKE_node.hh:347