Blender V4.3
node_composite_sepcomb_color.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_assert.h"
6
7#include "GPU_material.hh"
8
9#include "COM_shader_node.hh"
10
12
13static void node_cmp_combsep_color_init(bNodeTree * /*ntree*/, bNode *node)
14{
15 NodeCMPCombSepColor *data = MEM_cnew<NodeCMPCombSepColor>(__func__);
16 data->mode = CMP_NODE_COMBSEP_COLOR_RGB;
17 data->ycc_mode = BLI_YCC_ITU_BT709;
18 node->storage = data;
19}
20
22{
23 bNodeSocket *sock1 = (bNodeSocket *)sockets->first;
24 bNodeSocket *sock2 = sock1->next;
25 bNodeSocket *sock3 = sock2->next;
26
30
31 switch (mode) {
33 node_sock_label(sock1, "Red");
34 node_sock_label(sock2, "Green");
35 node_sock_label(sock3, "Blue");
36 break;
38 node_sock_label(sock1, "Hue");
39 node_sock_label(sock2, "Saturation");
40 node_sock_label(sock3, "Value");
41 break;
43 node_sock_label(sock1, "Hue");
44 node_sock_label(sock2, "Saturation");
45 node_sock_label(sock3, "Lightness");
46 break;
48 node_sock_label(sock1, "Y");
49 node_sock_label(sock2, "Cb");
50 node_sock_label(sock3, "Cr");
51 break;
53 node_sock_label(sock1, "Y");
54 node_sock_label(sock2, "U");
55 node_sock_label(sock3, "V");
56 break;
57 default:
59 break;
60 }
61}
62
63/* **************** SEPARATE COLOR ******************** */
64
66
68
70{
71 b.add_input<decl::Color>("Image")
72 .default_value({1.0f, 1.0f, 1.0f, 1.0f})
73 .compositor_domain_priority(0);
74 b.add_output<decl::Float>("Red");
75 b.add_output<decl::Float>("Green");
76 b.add_output<decl::Float>("Blue");
77 b.add_output<decl::Float>("Alpha");
78}
79
80static void cmp_node_separate_color_update(bNodeTree * /*ntree*/, bNode *node)
81{
82 const NodeCMPCombSepColor *storage = (NodeCMPCombSepColor *)node->storage;
84}
85
86using namespace blender::realtime_compositor;
87
89 public:
91
92 void compile(GPUMaterial *material) override
93 {
96
97 GPU_stack_link(material, &bnode(), get_shader_function_name(), inputs, outputs);
98 }
99
101 {
102 switch (node_storage(bnode()).mode) {
104 return "node_composite_separate_rgba";
106 return "node_composite_separate_hsva";
108 return "node_composite_separate_hsla";
110 return "node_composite_separate_yuva_itu_709";
112 switch (node_storage(bnode()).ycc_mode) {
114 return "node_composite_separate_ycca_itu_601";
116 return "node_composite_separate_ycca_itu_709";
118 return "node_composite_separate_ycca_jpeg";
119 }
120 }
121
123 return nullptr;
124 }
125};
126
128{
129 return new SeparateColorShaderNode(node);
130}
131
132} // namespace blender::nodes::node_composite_separate_color_cc
133
135{
137
138 static blender::bke::bNodeType ntype;
139
140 cmp_node_type_base(&ntype, CMP_NODE_SEPARATE_COLOR, "Separate Color", NODE_CLASS_CONVERTER);
141 ntype.declare = file_ns::cmp_node_separate_color_declare;
144 &ntype, "NodeCMPCombSepColor", node_free_standard_storage, node_copy_standard_storage);
145 ntype.updatefunc = file_ns::cmp_node_separate_color_update;
146 ntype.get_compositor_shader_node = file_ns::get_compositor_shader_node;
147
149}
150
151/* **************** COMBINE COLOR ******************** */
152
154
156
158{
159 b.add_input<decl::Float>("Red")
160 .default_value(0.0f)
161 .min(0.0f)
162 .max(1.0f)
164 .compositor_domain_priority(0);
165 b.add_input<decl::Float>("Green")
166 .default_value(0.0f)
167 .min(0.0f)
168 .max(1.0f)
170 .compositor_domain_priority(1);
171 b.add_input<decl::Float>("Blue")
172 .default_value(0.0f)
173 .min(0.0f)
174 .max(1.0f)
176 .compositor_domain_priority(2);
177 b.add_input<decl::Float>("Alpha")
178 .default_value(1.0f)
179 .min(0.0f)
180 .max(1.0f)
182 .compositor_domain_priority(3);
183 b.add_output<decl::Color>("Image");
184}
185
186static void cmp_node_combine_color_update(bNodeTree * /*ntree*/, bNode *node)
187{
188 const NodeCMPCombSepColor *storage = (NodeCMPCombSepColor *)node->storage;
190}
191
192using namespace blender::realtime_compositor;
193
195 public:
197
198 void compile(GPUMaterial *material) override
199 {
200 GPUNodeStack *inputs = get_inputs_array();
201 GPUNodeStack *outputs = get_outputs_array();
202
203 GPU_stack_link(material, &bnode(), get_shader_function_name(), inputs, outputs);
204 }
205
207 {
208 switch (node_storage(bnode()).mode) {
210 return "node_composite_combine_rgba";
212 return "node_composite_combine_hsva";
214 return "node_composite_combine_hsla";
216 return "node_composite_combine_yuva_itu_709";
218 switch (node_storage(bnode()).ycc_mode) {
220 return "node_composite_combine_ycca_itu_601";
222 return "node_composite_combine_ycca_itu_709";
224 return "node_composite_combine_ycca_jpeg";
225 }
226 }
227
229 return nullptr;
230 }
231};
232
234{
235 return new CombineColorShaderNode(node);
236}
237
238} // namespace blender::nodes::node_composite_combine_color_cc
239
241{
243
244 static blender::bke::bNodeType ntype;
245
246 cmp_node_type_base(&ntype, CMP_NODE_COMBINE_COLOR, "Combine Color", NODE_CLASS_CONVERTER);
247 ntype.declare = file_ns::cmp_node_combine_color_declare;
250 &ntype, "NodeCMPCombSepColor", node_free_standard_storage, node_copy_standard_storage);
251 ntype.updatefunc = file_ns::cmp_node_combine_color_update;
252 ntype.get_compositor_shader_node = file_ns::get_compositor_shader_node;
253
255}
#define NODE_CLASS_CONVERTER
Definition BKE_node.hh:410
#define NODE_STORAGE_FUNCS(StorageT)
Definition BKE_node.hh:1799
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define BLI_YCC_JFIF_0_255
#define BLI_YCC_ITU_BT601
#define BLI_YCC_ITU_BT709
CMPNodeCombSepColorMode
@ CMP_NODE_COMBSEP_COLOR_YCC
@ CMP_NODE_COMBSEP_COLOR_YUV
@ CMP_NODE_COMBSEP_COLOR_RGB
@ CMP_NODE_COMBSEP_COLOR_HSV
@ CMP_NODE_COMBSEP_COLOR_HSL
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
@ PROP_FACTOR
Definition RNA_types.hh:154
local_group_size(16, 16) .push_constant(Type b
void node_type_storage(bNodeType *ntype, const char *storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
Definition node.cc:4632
void node_register_type(bNodeType *ntype)
Definition node.cc:1708
static void cmp_node_combine_color_update(bNodeTree *, bNode *node)
static void cmp_node_combine_color_declare(NodeDeclarationBuilder &b)
static void cmp_node_separate_color_declare(NodeDeclarationBuilder &b)
static void cmp_node_separate_color_update(bNodeTree *, bNode *node)
static void node_cmp_combsep_color_label(const ListBase *sockets, CMPNodeCombSepColorMode mode)
void register_node_type_cmp_combine_color()
static void node_cmp_combsep_color_init(bNodeTree *, bNode *node)
void register_node_type_cmp_separate_color()
void cmp_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
void node_sock_label_clear(bNodeSocket *sock)
Definition node_util.cc:82
void node_sock_label(bNodeSocket *sock, const char *name)
Definition node_util.cc:77
void node_free_standard_storage(bNode *node)
Definition node_util.cc:46
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
Definition node_util.cc:58
void * first
struct bNodeSocket * next
Defines a node type.
Definition BKE_node.hh:218
void(* initfunc)(bNodeTree *ntree, bNode *node)
Definition BKE_node.hh:267
NodeDeclareFunction declare
Definition BKE_node.hh:347
void(* updatefunc)(bNodeTree *ntree, bNode *node)
Definition BKE_node.hh:257
NodeGetCompositorShaderNodeFunction get_compositor_shader_node
Definition BKE_node.hh:328