29 sizeavailable_ =
false;
31 extend_bounds_ =
false;
39void BokehBlurOperation::update_size()
46 if (size_input->get_flags().is_constant_operation) {
47 size_ = *
static_cast<ConstantOperation *
>(size_input)->get_constant_elem();
48 CLAMP(size_, 0.0f, 10.0f);
50 sizeavailable_ =
true;
55 if (!extend_bounds_) {
64 canvas.
xmax += add_size;
65 canvas.
ymax += add_size;
71 const rcti &output_area,
77 const float add_size = size_ * max_dim / 100.0f;
78 r_input_area.
xmin = output_area.
xmin - add_size;
79 r_input_area.
xmax = output_area.
xmax + add_size;
80 r_input_area.
ymin = output_area.
ymin - add_size;
81 r_input_area.
ymax = output_area.
ymax + add_size;
90 r_input_area = output_area;
104 const int radius = size_ * max_dim / 100.0f;
111 for (; !it.is_end(); ++it) {
114 const float bounding_box = *it.in(0);
115 if (bounding_box <= 0.0f) {
122 for (
int yi = -radius; yi <= radius; ++yi) {
123 for (
int xi = -radius; xi <= radius; ++xi) {
124 const float2 normalized_texel = (
float2(xi, yi) + radius + 0.5f) / (radius * 2.0f + 1.0f);
125 const float2 weight_texel = (1.0f - normalized_texel) *
float2(bokeh_size - 1);
126 const float4 weight = bokeh_input->
get_elem(
int(weight_texel.x),
int(weight_texel.y));
128 accumulated_color += color;
129 accumulated_weight += weight;
MINLINE float round_to_even(float f)
MINLINE void copy_v4_v4(float r[4], const float a[4])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void init_data() 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
const float * get_elem_clamped(int x, int y) const
const int get_width() const
get the width of this MemoryBuffer
const int get_height() const
get the height of this MemoryBuffer
float * get_elem(int x, int y)
void read_elem(int x, int y, float *out) const
BuffersIterator< float > iterate_with(Span< MemoryBuffer * > inputs)
NodeOperation contains calculation logic.
unsigned int get_height() const
void add_output_socket(DataType datatype)
unsigned int get_width() const
NodeOperationFlags flags_
const rcti & get_canvas() 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)
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
constexpr int IMAGE_INPUT_INDEX
constexpr int BOKEH_INPUT_INDEX
constexpr int BOUNDING_BOX_INPUT_INDEX
constexpr rcti COM_CONSTANT_INPUT_AREA_OF_INTEREST
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
constexpr int SIZE_INPUT_INDEX
T safe_divide(const T &a, const T &b)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2