Blender V4.3
COM_ProjectorLensDistortionOperation.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
7
8namespace blender::compositor {
9
18
20{
21 NodeOperation *dispersion_input = get_input_operation(1);
22 if (dispersion_input->get_flags().is_constant_operation) {
23 dispersion_ = static_cast<ConstantOperation *>(dispersion_input)->get_constant_elem()[0];
24 }
25 kr_ = 0.25f * max_ff(min_ff(dispersion_, 1.0f), 0.0f);
26 kr2_ = kr_ * 20;
27}
28
30{
32 /* Ensure screen space. */
33 BLI_rcti_translate(&canvas, -canvas.xmin, -canvas.ymin);
34 });
35
36 NodeOperation::determine_canvas(preferred_area, r_area);
37}
38
40 const rcti &output_area,
41 rcti &r_input_area)
42{
43 if (input_idx == 1) {
44 /* Dispersion input is used as constant only. */
46 return;
47 }
48
49 r_input_area.ymax = output_area.ymax;
50 r_input_area.ymin = output_area.ymin;
51 r_input_area.xmin = output_area.xmin - kr2_ - 2;
52 r_input_area.xmax = output_area.xmax + kr2_ + 2;
53}
54
56 const rcti &area,
58{
59 const MemoryBuffer *input_image = inputs[0];
60 const float height = this->get_height();
61 const float width = this->get_width();
62 float color[4];
63 for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
64 const float v = (it.y + 0.5f) / height;
65 const float u = (it.x + 0.5f) / width;
66 input_image->read_elem_bilinear((u * width + kr2_) - 0.5f, v * height - 0.5f, color);
67 it.out[0] = color[0];
68 input_image->read_elem(it.x, it.y, color);
69 it.out[1] = color[1];
70 input_image->read_elem_bilinear((u * width - kr2_) - 0.5f, v * height - 0.5f, color);
71 it.out[2] = color[2];
72 it.out[3] = 1.0f;
73 }
74}
75
76} // namespace blender::compositor
MINLINE float max_ff(float a, float b)
MINLINE float min_ff(float a, float b)
void BLI_rcti_translate(struct rcti *rect, int x, int y)
Definition rct.c:560
ATTR_WARN_UNUSED_RESULT const BMVert * v
a MemoryBuffer contains access to the data
void read_elem_bilinear(float x, float y, float *out) const
void read_elem(int x, int y, float *out) const
NodeOperation contains calculation logic.
void add_output_socket(DataType datatype)
const NodeOperationFlags get_flags() const
NodeOperation * get_input_operation(int index)
void set_determined_canvas_modifier(std::function< void(rcti &canvas)> fn)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
virtual void determine_canvas(const rcti &preferred_area, rcti &r_area)
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
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.
constexpr rcti COM_CONSTANT_INPUT_AREA_OF_INTEREST
Definition COM_defines.h:90
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
int ymin
int ymax
int xmin
int xmax