Blender V4.3
node_fn_invert_matrix.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
5#include "BLI_math_matrix.hh"
6
8
10
12{
13 b.is_function_node();
14 b.add_input<decl::Matrix>("Matrix");
15 b.add_output<decl::Matrix>("Matrix").description(
16 "The inverted matrix or the identity matrix if the input is not invertible");
17 b.add_output<decl::Bool>("Invertible").description("True if the input matrix is invertible");
18}
19
21 public:
23 {
24 static mf::Signature signature = []() {
26 mf::SignatureBuilder builder{"Invert Matrix", signature};
27 builder.single_input<float4x4>("Matrix");
28 builder.single_output<float4x4>("Matrix", mf::ParamFlag::SupportsUnusedOutput);
29 builder.single_output<bool>("Invertible", mf::ParamFlag::SupportsUnusedOutput);
30 return signature;
31 }();
32 this->set_signature(&signature);
33 }
34
35 void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override
36 {
37 const VArraySpan<float4x4> in_matrices = params.readonly_single_input<float4x4>(0, "Matrix");
38 MutableSpan<float4x4> out_matrices = params.uninitialized_single_output_if_required<float4x4>(
39 1, "Matrix");
40 MutableSpan<bool> out_invertible = params.uninitialized_single_output_if_required<bool>(
41 2, "Invertible");
42 mask.foreach_index([&](const int64_t i) {
43 const float4x4 &matrix = in_matrices[i];
44 bool success;
45 float4x4 inverted_matrix = math::invert(matrix, success);
46 if (!out_matrices.is_empty()) {
47 out_matrices[i] = success ? inverted_matrix : float4x4::identity();
48 }
49 if (!out_invertible.is_empty()) {
50 out_invertible[i] = success;
51 }
52 });
53 }
54};
55
57{
58 static InvertMatrixFunction fn;
59 builder.set_matching_fn(fn);
60}
61
62static void node_register()
63{
64 static blender::bke::bNodeType ntype;
65 fn_node_type_base(&ntype, FN_NODE_INVERT_MATRIX, "Invert Matrix", NODE_CLASS_CONVERTER);
66 ntype.declare = node_declare;
69}
71
72} // namespace blender::nodes::node_fn_invert_matrix_cc
#define NODE_CLASS_CONVERTER
Definition BKE_node.hh:410
#define NOD_REGISTER_NODE(REGISTER_FUNC)
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
CartesianBasis invert(const CartesianBasis &basis)
static void node_declare(NodeDeclarationBuilder &b)
static void node_build_multi_function(NodeMultiFunctionBuilder &builder)
void fn_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
__int64 int64_t
Definition stdint.h:89
Defines a node type.
Definition BKE_node.hh:218
NodeMultiFunctionBuildFunction build_multi_function
Definition BKE_node.hh:336
NodeDeclareFunction declare
Definition BKE_node.hh:347