Blender
V4.5
source
blender
nodes
composite
nodes
node_composite_composite.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
9
#include "
BLI_bounds_types.hh
"
10
#include "
BLI_math_vector_types.hh
"
11
12
#include "
UI_interface.hh
"
13
#include "
UI_resources.hh
"
14
15
#include "
GPU_shader.hh
"
16
#include "
GPU_texture.hh
"
17
18
#include "
COM_node_operation.hh
"
19
#include "
COM_utilities.hh
"
20
21
#include "
node_composite_util.hh
"
22
23
/* **************** COMPOSITE ******************** */
24
25
namespace
blender::nodes::node_composite_composite_cc
{
26
27
static
void
cmp_node_composite_declare
(
NodeDeclarationBuilder
&
b
)
28
{
29
b
.add_input<
decl::Color
>(
"Image"
).default_value({0.0f, 0.0f, 0.0f, 1.0f});
30
}
31
32
using namespace
blender::compositor
;
33
34
class
CompositeOperation
:
public
NodeOperation
{
35
public
:
36
using
NodeOperation::NodeOperation
;
37
38
void
execute
()
override
39
{
40
if
(!this->
context
().is_valid_compositing_region()) {
41
return
;
42
}
43
44
const
Result
&image = this->
get_input
(
"Image"
);
45
if
(image.
is_single_value
()) {
46
this->
execute_clear
();
47
}
48
else
{
49
this->
execute_copy
();
50
}
51
}
52
53
void
execute_clear
()
54
{
55
const
Result
&image = this->
get_input
(
"Image"
);
56
57
float4
color = image.
get_single_value
<
float4
>();
58
59
const
Domain
domain = this->
compute_domain
();
60
Result
output
= this->
context
().
get_output_result
();
61
if
(this->
context
().use_gpu()) {
62
GPU_texture_clear
(
output
,
GPU_DATA_FLOAT
, color);
63
}
64
else
{
65
parallel_for
(domain.size, [&](
const
int2
texel) { output.store_pixel(texel, color); });
66
}
67
}
68
69
void
execute_copy
()
70
{
71
if
(this->
context
().use_gpu()) {
72
this->
execute_copy_gpu
();
73
}
74
else
{
75
this->
execute_copy_cpu
();
76
}
77
}
78
79
void
execute_copy_gpu
()
80
{
81
const
Result
&image = this->
get_input
(
"Image"
);
82
const
Domain
domain = this->
compute_domain
();
83
Result
output
= this->
context
().
get_output_result
();
84
85
GPUShader *shader = this->
context
().
get_shader
(
"compositor_write_output"
, output.
precision
());
86
GPU_shader_bind
(shader);
87
88
const
Bounds<int2>
bounds = this->
get_output_bounds
();
89
GPU_shader_uniform_2iv
(shader,
"lower_bound"
, bounds.
min
);
90
GPU_shader_uniform_2iv
(shader,
"upper_bound"
, bounds.
max
);
91
92
image.
bind_as_texture
(shader,
"input_tx"
);
93
94
output
.bind_as_image(shader,
"output_img"
);
95
96
compute_dispatch_threads_at_least
(shader, domain.
size
);
97
98
image.
unbind_as_texture
();
99
output
.unbind_as_image();
100
GPU_shader_unbind
();
101
}
102
103
void
execute_copy_cpu
()
104
{
105
const
Domain
domain = this->
compute_domain
();
106
const
Result
&image = this->
get_input
(
"Image"
);
107
Result
output
= this->
context
().
get_output_result
();
108
109
const
Bounds<int2>
bounds = this->
get_output_bounds
();
110
parallel_for
(domain.
size
, [&](
const
int2
texel) {
111
const int2 output_texel = texel + bounds.min;
112
if (output_texel.x > bounds.max.x || output_texel.y > bounds.max.y) {
113
return;
114
}
115
output
.store_pixel(texel + bounds.
min
, image.
load_pixel
<
float4
>(texel));
116
});
117
}
118
119
/* Returns the bounds of the area of the compositing region. Only write into the compositing
120
* region, which might be limited to a smaller region of the output result. */
121
Bounds<int2>
get_output_bounds
()
122
{
123
const
rcti
compositing_region = this->context().get_compositing_region();
124
return
Bounds<int2>
(
int2
(compositing_region.
xmin
, compositing_region.
ymin
),
125
int2
(compositing_region.
xmax
, compositing_region.
ymax
));
126
}
127
128
/* The operation domain has the same size as the compositing region without any transformations
129
* applied. */
130
Domain
compute_domain
()
override
131
{
132
return
Domain
(this->context().get_compositing_region_size());
133
}
134
};
135
136
static
NodeOperation
*
get_compositor_operation
(
Context
&context,
DNode
node
)
137
{
138
return
new
CompositeOperation
(context,
node
);
139
}
140
141
}
// namespace blender::nodes::node_composite_composite_cc
142
143
static
void
register_node_type_cmp_composite
()
144
{
145
namespace
file_ns =
blender::nodes::node_composite_composite_cc
;
146
147
static
blender::bke::bNodeType
ntype;
148
149
cmp_node_type_base
(&ntype,
"CompositorNodeComposite"
,
CMP_NODE_COMPOSITE
);
150
ntype.
ui_name
=
"Composite"
;
151
ntype.
ui_description
=
"Final render output"
;
152
ntype.
enum_name_legacy
=
"COMPOSITE"
;
153
ntype.
nclass
=
NODE_CLASS_OUTPUT
;
154
ntype.
declare
= file_ns::cmp_node_composite_declare;
155
ntype.
get_compositor_operation
= file_ns::get_compositor_operation;
156
ntype.
no_muting
=
true
;
157
158
blender::bke::node_register_type
(ntype);
159
}
160
NOD_REGISTER_NODE
(
register_node_type_cmp_composite
)
NODE_CLASS_OUTPUT
#define NODE_CLASS_OUTPUT
Definition
BKE_node.hh:434
CMP_NODE_COMPOSITE
#define CMP_NODE_COMPOSITE
Definition
BKE_node_legacy_types.hh:170
BLI_bounds_types.hh
BLI_math_vector_types.hh
COM_node_operation.hh
COM_utilities.hh
GPU_shader.hh
GPU_shader_bind
void GPU_shader_bind(GPUShader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
Definition
gpu_shader.cc:423
GPU_shader_uniform_2iv
void GPU_shader_uniform_2iv(GPUShader *sh, const char *name, const int data[2])
Definition
gpu_shader.cc:730
GPU_shader_unbind
void GPU_shader_unbind()
Definition
gpu_shader.cc:456
GPU_texture.hh
GPU_texture_clear
void GPU_texture_clear(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
Definition
gpu_texture.cc:540
GPU_DATA_FLOAT
@ GPU_DATA_FLOAT
Definition
GPU_texture.hh:744
NOD_REGISTER_NODE
#define NOD_REGISTER_NODE(REGISTER_FUNC)
Definition
NOD_register.hh:34
UI_interface.hh
UI_resources.hh
blender::compositor::Context
Definition
COM_context.hh:44
blender::compositor::Context::get_shader
GPUShader * get_shader(const char *info_name, ResultPrecision precision)
Definition
compositor/intern/context.cc:94
blender::compositor::Context::get_output_result
virtual Result get_output_result()=0
blender::compositor::Domain
Definition
COM_domain.hh:135
blender::compositor::Domain::size
int2 size
Definition
COM_domain.hh:138
blender::compositor::NodeOperation
Definition
COM_node_operation.hh:31
blender::compositor::NodeOperation::NodeOperation
NodeOperation(Context &context, DNode node)
Definition
node_operation.cc:30
blender::compositor::Operation::context
Context & context() const
Definition
operation.cc:163
blender::compositor::Operation::get_input
Result & get_input(StringRef identifier) const
Definition
operation.cc:138
blender::compositor::Result
Definition
COM_result.hh:95
blender::compositor::Result::precision
static ResultPrecision precision(eGPUTextureFormat format)
Definition
result.cc:166
blender::compositor::Result::unbind_as_texture
void unbind_as_texture() const
Definition
result.cc:389
blender::compositor::Result::bind_as_texture
void bind_as_texture(GPUShader *shader, const char *texture_name) const
Definition
result.cc:365
blender::compositor::Result::load_pixel
T load_pixel(const int2 &texel) const
blender::compositor::Result::is_single_value
bool is_single_value() const
Definition
result.cc:625
blender::compositor::Result::get_single_value
const T & get_single_value() const
blender::nodes::DNode
Definition
NOD_derived_node_tree.hh:71
blender::nodes::NodeDeclarationBuilder
Definition
NOD_node_declaration.hh:629
blender::nodes::decl::Color
Definition
NOD_socket_declarations.hh:133
blender::nodes::node_composite_composite_cc::CompositeOperation
Definition
node_composite_composite.cc:34
blender::nodes::node_composite_composite_cc::CompositeOperation::execute
void execute() override
Definition
node_composite_composite.cc:38
blender::nodes::node_composite_composite_cc::CompositeOperation::compute_domain
Domain compute_domain() override
Definition
node_composite_composite.cc:130
blender::nodes::node_composite_composite_cc::CompositeOperation::get_output_bounds
Bounds< int2 > get_output_bounds()
Definition
node_composite_composite.cc:121
blender::nodes::node_composite_composite_cc::CompositeOperation::execute_clear
void execute_clear()
Definition
node_composite_composite.cc:53
blender::nodes::node_composite_composite_cc::CompositeOperation::execute_copy_cpu
void execute_copy_cpu()
Definition
node_composite_composite.cc:103
blender::nodes::node_composite_composite_cc::CompositeOperation::execute_copy
void execute_copy()
Definition
node_composite_composite.cc:69
blender::nodes::node_composite_composite_cc::CompositeOperation::execute_copy_gpu
void execute_copy_gpu()
Definition
node_composite_composite.cc:79
b
b
Definition
compositor_morphological_distance_info.hh:24
node
OperationNode * node
Definition
deg_builder_cycle.cc:38
output
#define output
Definition
gpu_glsl_cpp_stubs.hh:1060
blender::bke::node_register_type
void node_register_type(bNodeType &ntype)
Definition
node.cc:2748
blender::compositor
Definition
BKE_node.hh:76
blender::compositor::compute_dispatch_threads_at_least
void compute_dispatch_threads_at_least(GPUShader *shader, int2 threads_range, int2 local_size=int2(16))
Definition
utilities.cc:170
blender::compositor::parallel_for
void parallel_for(const int2 range, const Function &function)
Definition
COM_utilities.hh:83
blender::nodes::node_composite_composite_cc
Definition
node_composite_composite.cc:25
blender::nodes::node_composite_composite_cc::get_compositor_operation
static NodeOperation * get_compositor_operation(Context &context, DNode node)
Definition
node_composite_composite.cc:136
blender::nodes::node_composite_composite_cc::cmp_node_composite_declare
static void cmp_node_composite_declare(NodeDeclarationBuilder &b)
Definition
node_composite_composite.cc:27
blender::int2
VecBase< int32_t, 2 > int2
Definition
BLI_math_vector_types.hh:601
register_node_type_cmp_composite
static void register_node_type_cmp_composite()
Definition
node_composite_composite.cc:143
cmp_node_type_base
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
Definition
node_composite_util.cc:33
node_composite_util.hh
blender::Bounds
Definition
usd_writer_abstract.hh:25
blender::Bounds::max
T max
Definition
BLI_bounds_types.hh:15
blender::Bounds::min
T min
Definition
BLI_bounds_types.hh:14
blender::VecBase< float, 4 >
blender::bke::bNodeType
Defines a node type.
Definition
BKE_node.hh:226
blender::bke::bNodeType::ui_description
std::string ui_description
Definition
BKE_node.hh:232
blender::bke::bNodeType::ui_name
std::string ui_name
Definition
BKE_node.hh:231
blender::bke::bNodeType::get_compositor_operation
NodeGetCompositorOperationFunction get_compositor_operation
Definition
BKE_node.hh:336
blender::bke::bNodeType::nclass
short nclass
Definition
BKE_node.hh:239
blender::bke::bNodeType::enum_name_legacy
const char * enum_name_legacy
Definition
BKE_node.hh:235
blender::bke::bNodeType::no_muting
bool no_muting
Definition
BKE_node.hh:413
blender::bke::bNodeType::declare
NodeDeclareFunction declare
Definition
BKE_node.hh:355
rcti
Definition
DNA_vec_types.h:68
rcti::ymin
int ymin
Definition
DNA_vec_types.h:70
rcti::ymax
int ymax
Definition
DNA_vec_types.h:70
rcti::xmin
int xmin
Definition
DNA_vec_types.h:69
rcti::xmax
int xmax
Definition
DNA_vec_types.h:69
Generated on Fri Apr 3 2026 06:33:18 for Blender by
doxygen
1.11.0