Blender V4.3
COM_KeyingBlurOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7namespace blender::compositor {
8
19
20void KeyingBlurOperation::get_area_of_interest(const int /*input_idx*/,
21 const rcti &output_area,
22 rcti &r_input_area)
23{
24 switch (axis_) {
25 case BLUR_AXIS_X:
26 r_input_area.xmin = output_area.xmin - size_;
27 r_input_area.ymin = output_area.ymin;
28 r_input_area.xmax = output_area.xmax + size_;
29 r_input_area.ymax = output_area.ymax;
30 break;
31 case BLUR_AXIS_Y:
32 r_input_area.xmin = output_area.xmin;
33 r_input_area.ymin = output_area.ymin - size_;
34 r_input_area.xmax = output_area.xmax;
35 r_input_area.ymax = output_area.ymax + size_;
36 break;
37 default:
38 BLI_assert_msg(0, "Unknown axis");
39 break;
40 }
41}
42
44 const rcti &area,
46{
47 const MemoryBuffer *input = inputs[0];
48 BuffersIterator<float> it = output->iterate_with(inputs, area);
49
50 int coord_max;
51 int elem_stride;
52 std::function<int()> get_current_coord;
53 switch (axis_) {
54 case BLUR_AXIS_X:
55 get_current_coord = [&] { return it.x; };
56 coord_max = this->get_width();
57 elem_stride = input->elem_stride;
58 break;
59 case BLUR_AXIS_Y:
60 get_current_coord = [&] { return it.y; };
61 coord_max = this->get_height();
62 elem_stride = input->row_stride;
63 break;
64 }
65
66 for (; !it.is_end(); ++it) {
67 const int coord = get_current_coord();
68 const int start_coord = std::max(0, coord - size_ + 1);
69 const int end_coord = std::min(coord_max, coord + size_);
70 const int count = end_coord - start_coord;
71
72 float sum = 0.0f;
73 const float *start = it.in(0) + (start_coord - coord) * elem_stride;
74 const float *end = start + count * elem_stride;
75 for (const float *elem = start; elem < end; elem += elem_stride) {
76 sum += *elem;
77 }
78
79 *it.out = sum / count;
80 }
81}
82
83} // namespace blender::compositor
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
static T sum(const btAlignedObjectArray< T > &items)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
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.
a MemoryBuffer contains access to the data
BuffersIterator< float > iterate_with(Span< MemoryBuffer * > inputs)
void add_output_socket(DataType datatype)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
int count
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
int ymin
int ymax
int xmin
int xmax