Blender
V4.3
source
blender
compositor
operations
COM_BilateralBlurOperation.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2011 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
5
#include "
COM_BilateralBlurOperation.h
"
6
7
namespace
blender::compositor
{
8
9
BilateralBlurOperation::BilateralBlurOperation
()
10
{
11
this->
add_input_socket
(
DataType::Color
);
12
this->
add_input_socket
(
DataType::Color
);
13
this->
add_output_socket
(
DataType::Color
);
14
flags_
.can_be_constant =
true
;
15
}
16
17
void
BilateralBlurOperation::get_area_of_interest
(
const
int
/*input_idx*/
,
18
const
rcti
&output_area,
19
rcti
&r_input_area)
20
{
21
const
int
add
= radius_ + 1;
22
23
r_input_area.
xmax
= output_area.
xmax
+ (
add
);
24
r_input_area.
xmin
= output_area.
xmin
- (
add
);
25
r_input_area.
ymax
= output_area.
ymax
+ (
add
);
26
r_input_area.
ymin
= output_area.
ymin
- (
add
);
27
}
28
29
struct
PixelCursor
{
30
MemoryBuffer
*
input_determinator
;
31
MemoryBuffer
*
input_color
;
32
int
step
;
33
float
sigma_color
;
34
const
float
*
determ_reference_color
;
35
float
temp_color
[4];
36
float
*
out
;
37
int
radius
;
38
int
x
;
39
int
y
;
40
};
41
42
static
void
blur_pixel
(
PixelCursor
&p)
43
{
44
float
blur_divider = 0.0f;
45
zero_v4
(p.
out
);
46
47
/* TODO(sergey): This isn't really good bilateral filter, it should be
48
* using gaussian bell for weights. Also sigma_color doesn't seem to be
49
* used correct at all.
50
*/
51
for
(
int
yi = -p.
radius
; yi <= p.
radius
; yi += p.
step
) {
52
for
(
int
xi = -p.
radius
; xi <= p.
radius
; xi += p.
step
) {
53
p.
input_determinator
->
read_elem_clamped
(p.
x
+ xi, p.
y
+ yi, p.
temp_color
);
54
/* Do not take the alpha channel into account. */
55
const
float
delta_color = (
fabsf
(p.
determ_reference_color
[0] - p.
temp_color
[0]) +
56
fabsf
(p.
determ_reference_color
[1] - p.
temp_color
[1]) +
57
fabsf
(p.
determ_reference_color
[2] - p.
temp_color
[2]));
58
if
(delta_color < p.
sigma_color
) {
59
/* Add this to the blur. */
60
p.
input_color
->
read_elem_clamped
(p.
x
+ xi, p.
y
+ yi, p.
temp_color
);
61
add_v4_v4
(p.
out
, p.
temp_color
);
62
blur_divider += 1.0f;
63
}
64
}
65
}
66
67
if
(blur_divider > 0.0f) {
68
mul_v4_fl
(p.
out
, 1.0f / blur_divider);
69
}
70
else
{
71
copy_v4_v4
(p.
out
,
COM_COLOR_BLACK
);
72
}
73
}
74
75
void
BilateralBlurOperation::update_memory_buffer_partial
(
MemoryBuffer
*
output
,
76
const
rcti
&area,
77
Span<MemoryBuffer *>
inputs
)
78
{
79
PixelCursor
p = {};
80
p.
step
= 1;
81
p.
sigma_color
= data_->sigma_color;
82
p.
radius
= radius_;
83
p.
input_color
=
inputs
[0];
84
p.
input_determinator
=
inputs
[1];
85
for
(
int
y
= area.
ymin
;
y
< area.
ymax
;
y
++) {
86
p.
out
=
output
->get_elem(area.
xmin
,
y
);
87
p.
y
=
y
;
88
for
(
int
x
= area.
xmin
;
x
< area.
xmax
;
x
++) {
89
p.
x
=
x
;
90
/* This will be used as the reference color for the determinator. */
91
p.
determ_reference_color
= p.
input_determinator
->
get_elem
(
x
,
y
);
92
blur_pixel
(p);
93
p.
out
+=
output
->elem_stride;
94
}
95
}
96
}
97
98
}
// namespace blender::compositor
x
x
Definition
BLI_expr_pylike_eval_test.cc:345
mul_v4_fl
MINLINE void mul_v4_fl(float r[4], float f)
Definition
math_vector_inline.c:587
add_v4_v4
MINLINE void add_v4_v4(float r[4], const float a[4])
Definition
math_vector_inline.c:424
copy_v4_v4
MINLINE void copy_v4_v4(float r[4], const float a[4])
Definition
math_vector_inline.c:57
zero_v4
MINLINE void zero_v4(float r[4])
Definition
math_vector_inline.c:29
COM_BilateralBlurOperation.h
output
#define output
blender::Span
Definition
BLI_span.hh:75
blender::compositor::BilateralBlurOperation::BilateralBlurOperation
BilateralBlurOperation()
Definition
COM_BilateralBlurOperation.cc:9
blender::compositor::BilateralBlurOperation::update_memory_buffer_partial
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_BilateralBlurOperation.cc:75
blender::compositor::BilateralBlurOperation::get_area_of_interest
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
Definition
COM_BilateralBlurOperation.cc:17
blender::compositor::MemoryBuffer
a MemoryBuffer contains access to the data
Definition
COM_MemoryBuffer.h:35
blender::compositor::MemoryBuffer::get_elem
float * get_elem(int x, int y)
Definition
COM_MemoryBuffer.h:161
blender::compositor::MemoryBuffer::read_elem_clamped
void read_elem_clamped(int x, int y, float *out) const
Definition
COM_MemoryBuffer.h:191
blender::compositor::NodeOperation::add_output_socket
void add_output_socket(DataType datatype)
Definition
COM_NodeOperation.cc:102
blender::compositor::NodeOperation::flags_
NodeOperationFlags flags_
Definition
COM_NodeOperation.h:295
blender::compositor::NodeOperation::add_input_socket
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
Definition
COM_NodeOperation.cc:97
y
y
Definition
compositor_morphological_blur_info.hh:15
fabsf
#define fabsf(x)
Definition
device/metal/compat.h:288
blender::compositor::DataType::Color
@ Color
Color data type.
Definition
COM_defines.h:27
add
static void add(blender::Map< std::string, std::string > &messages, Message &msg)
Definition
msgfmt.cc:227
blender::compositor
Definition
COM_JumpFloodingAlgorithm.cc:20
blender::compositor::blur_pixel
static void blur_pixel(PixelCursor &p)
Definition
COM_BilateralBlurOperation.cc:42
blender::compositor::COM_COLOR_BLACK
constexpr float COM_COLOR_BLACK[4]
Definition
COM_defines.h:63
inputs
static blender::bke::bNodeSocketTemplate inputs[]
Definition
node_texture_at.cc:11
blender::compositor::PixelCursor
Definition
COM_BilateralBlurOperation.cc:29
blender::compositor::PixelCursor::sigma_color
float sigma_color
Definition
COM_BilateralBlurOperation.cc:33
blender::compositor::PixelCursor::y
int y
Definition
COM_BilateralBlurOperation.cc:39
blender::compositor::PixelCursor::x
int x
Definition
COM_BilateralBlurOperation.cc:38
blender::compositor::PixelCursor::determ_reference_color
const float * determ_reference_color
Definition
COM_BilateralBlurOperation.cc:34
blender::compositor::PixelCursor::input_color
MemoryBuffer * input_color
Definition
COM_BilateralBlurOperation.cc:31
blender::compositor::PixelCursor::temp_color
float temp_color[4]
Definition
COM_BilateralBlurOperation.cc:35
blender::compositor::PixelCursor::input_determinator
MemoryBuffer * input_determinator
Definition
COM_BilateralBlurOperation.cc:30
blender::compositor::PixelCursor::radius
int radius
Definition
COM_BilateralBlurOperation.cc:37
blender::compositor::PixelCursor::step
int step
Definition
COM_BilateralBlurOperation.cc:32
blender::compositor::PixelCursor::out
float * out
Definition
COM_BilateralBlurOperation.cc:36
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 Sat Oct 4 2025 05:32:23 for Blender by
doxygen
1.14.0