Blender V4.5
node_composite_invert.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_math_vector.hh"
11
13
14#include "NOD_multi_function.hh"
15
16#include "UI_interface.hh"
17#include "UI_resources.hh"
18
19#include "GPU_material.hh"
20
22
23/* **************** INVERT ******************** */
24
26
28{
29 b.add_input<decl::Float>("Fac")
30 .default_value(1.0f)
31 .min(0.0f)
32 .max(1.0f)
34 .compositor_domain_priority(1);
35 b.add_input<decl::Color>("Color")
36 .default_value({1.0f, 1.0f, 1.0f, 1.0f})
37 .compositor_domain_priority(0);
38 b.add_input<decl::Bool>("Invert Color").default_value(true).compositor_domain_priority(2);
39 b.add_input<decl::Bool>("Invert Alpha").default_value(false).compositor_domain_priority(3);
40
41 b.add_output<decl::Color>("Color");
42}
43
44using namespace blender::compositor;
45
46static int node_gpu_material(GPUMaterial *material,
47 bNode *node,
48 bNodeExecData * /*execdata*/,
51{
52 return GPU_stack_link(material, node, "node_composite_invert", inputs, outputs);
53}
54
56{
57 static auto function = mf::build::SI4_SO<float, float4, bool, bool, float4>(
58 "Invert Color",
59 [](const float factor, const float4 &color, const bool invert_color, const bool invert_alpha)
60 -> float4 {
62 if (invert_color) {
63 result = float4(1.0f - result.xyz(), result.w);
64 }
65 if (invert_alpha) {
66 result = float4(result.xyz(), 1.0f - result.w);
67 }
68 return math::interpolate(color, result, factor);
69 },
70 mf::build::exec_presets::SomeSpanOrSingle<1>());
71 builder.set_matching_fn(function);
72}
73
74} // namespace blender::nodes::node_composite_invert_cc
75
77{
79
80 static blender::bke::bNodeType ntype;
81
82 cmp_node_type_base(&ntype, "CompositorNodeInvert", CMP_NODE_INVERT);
83 ntype.ui_name = "Invert Color";
84 ntype.ui_description = "Invert colors, producing a negative";
85 ntype.enum_name_legacy = "INVERT";
87 ntype.declare = file_ns::cmp_node_invert_declare;
88 ntype.gpu_fn = file_ns::node_gpu_material;
89 ntype.build_multi_function = file_ns::node_build_multi_function;
90
92}
#define NODE_CLASS_OP_COLOR
Definition BKE_node.hh:435
#define CMP_NODE_INVERT
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
#define NOD_REGISTER_NODE(REGISTER_FUNC)
@ PROP_FACTOR
Definition RNA_types.hh:239
void set_matching_fn(const mf::MultiFunction *fn)
void node_register_type(bNodeType &ntype)
Definition node.cc:2748
T interpolate(const T &a, const T &b, const FactorT &t)
static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder)
static void cmp_node_invert_declare(NodeDeclarationBuilder &b)
static int node_gpu_material(GPUMaterial *material, bNode *node, bNodeExecData *, GPUNodeStack *inputs, GPUNodeStack *outputs)
VecBase< float, 4 > float4
static void register_node_type_cmp_invert()
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]
Defines a node type.
Definition BKE_node.hh:226
std::string ui_description
Definition BKE_node.hh:232
NodeGPUExecFunction gpu_fn
Definition BKE_node.hh:330
NodeMultiFunctionBuildFunction build_multi_function
Definition BKE_node.hh:344
const char * enum_name_legacy
Definition BKE_node.hh:235
NodeDeclareFunction declare
Definition BKE_node.hh:355