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);
60 std::array<MutableSpan<float>, 3> outputs = {xs, ys, zs};
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();
77 for (
const int64_t i : segment) {
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];
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);
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);
116 params.set_input(
"Vector",
118 params.get_output<
float>(
"Y"),
119 params.get_output<
float>(
"Z")));
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;
141 ntype.
declare = file_ns::sh_node_sepxyz_declare;
142 ntype.
gpu_fn = file_ns::gpu_shader_sepxyz;
145 ntype.
eval_elem = file_ns::sh_node_sepxyz_eval_elem;
147 ntype.
eval_inverse = file_ns::sh_node_sepxyz_eval_inverse;
156 b.is_function_node();
174 static auto fn = mf::build::SI3_SO<float, float, float, float3>(
176 [](
float x,
float y,
float z) {
return float3(x, y,
z); },
177 mf::build::exec_presets::AllSpanOrSingle());
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);
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);
203 params.set_input(
"X", output.x);
204 params.set_input(
"Y", output.y);
205 params.set_input(
"Z", output.z);
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);
215 return create_node(
"combine3", NodeItem::Type::Vector3, {{
"in1", x}, {
"in2", y}, {
"in3",
z}});
229 ntype.
declare = file_ns::sh_node_combxyz_declare;
230 ntype.
gpu_fn = file_ns::gpu_shader_combxyz;
233 ntype.
eval_elem = file_ns::sh_node_combxyz_eval_elem;
235 ntype.
eval_inverse = file_ns::sh_node_combxyz_eval_inverse;
#define NODE_CLASS_CONVERTER
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.
void append(const T &value)
const Signature & signature() const
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
void node_register_type(bNodeType *ntype)
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 ¶ms)
static void sh_node_combxyz_eval_elem(value_elem::ElemEvalParams ¶ms)
static void sh_node_combxyz_eval_inverse(inverse_eval::InverseEvalParams ¶ms)
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 ¶ms)
static int gpu_shader_sepxyz(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void sh_node_sepxyz_eval_elem(value_elem::ElemEvalParams ¶ms)
static void sh_node_sepxyz_declare(NodeDeclarationBuilder &b)
static void sh_node_sepxyz_eval_inverse(inverse_eval::InverseEvalParams ¶ms)
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)
NodeInverseElemEvalFunction eval_inverse_elem
NodeMaterialXFunction materialx_fn
NodeInverseEvalFunction eval_inverse
NodeGPUExecFunction gpu_fn
NodeElemEvalFunction eval_elem
NodeMultiFunctionBuildFunction build_multi_function
NodeDeclareFunction declare