32 CLAMP(radxf_, 0.0f, width / 2.0f);
36 CLAMP(radyf_, 0.0f, height / 2.0f);
51void GaussianBokehBlurOperation::update_gauss()
53 if (gausstab_ ==
nullptr) {
54 int ddwidth = 2 * radx_ + 1;
55 int ddheight = 2 * rady_ + 1;
56 int n = ddwidth * ddheight;
58 float *ddgauss = (
float *)
MEM_mallocN(
sizeof(
float) * n, __func__);
59 float *dgauss = ddgauss;
61 float facx = (radxf_ > 0.0f ? 1.0f / radxf_ : 0.0f);
62 float facy = (radyf_ > 0.0f ? 1.0f / radyf_ : 0.0f);
63 for (
int j = -rady_; j <= rady_; j++) {
64 for (
int i = -radx_; i <= radx_; i++, dgauss++) {
65 float fj =
float(j) * facy;
66 float fi =
float(i) * facx;
67 float dist =
sqrt(fj * fj + fi * fi);
77 for (
int j = n - 1; j >= 0; j--) {
82 int center = rady_ * ddwidth + radx_;
83 ddgauss[center] = 1.0f;
101 const rcti &output_area,
109 r_input_area.
xmax = output_area.
xmax + radx_;
110 r_input_area.
xmin = output_area.
xmin - radx_;
111 r_input_area.
ymax = output_area.
ymax + rady_;
112 r_input_area.
ymin = output_area.
ymin - rady_;
121 const rcti &input_rect = input->get_rect();
122 for (; !it.is_end(); ++it) {
126 const int ymin =
max_ii(y - rady_, input_rect.
ymin);
127 const int ymax =
min_ii(y + rady_ + 1, input_rect.
ymax);
128 const int xmin =
max_ii(x - radx_, input_rect.
xmin);
129 const int xmax =
min_ii(x + radx_ + 1, input_rect.
xmax);
131 float temp_color[4] = {0};
132 float multiplier_accum = 0;
133 const int elem_step = input->elem_stride;
134 const int add_const = (xmin - x + radx_);
135 const int mul_const = (radx_ * 2 + 1);
136 for (
int ny = ymin; ny < ymax; ++ny) {
137 const float *color = input->get_elem(xmin, ny);
138 int gauss_index = ((ny -
y) + rady_) * mul_const + add_const;
139 const int gauss_end = gauss_index + (xmax - xmin);
140 for (; gauss_index < gauss_end; gauss_index += 1, color += elem_step) {
141 const float multiplier = gausstab_[gauss_index];
143 multiplier_accum += multiplier;
147 mul_v4_v4fl(it.out, temp_color, 1.0f / multiplier_accum);
184 if (filtersizex_ > imgx) {
187 else if (filtersizex_ < 1) {
190 radx_ =
float(filtersizex_);
195 if (filtersizey_ > imgy) {
198 else if (filtersizey_ < 1) {
201 rady_ =
float(filtersizey_);
211void GaussianBlurReferenceOperation::update_gauss()
213 const int2 radius =
int2(filtersizex_, filtersizey_);
219 weights_ = std::make_unique<MemoryBuffer>(
DataType::Value, weights_area,
false);
224 *weights_->get_elem(0, 0) = center_weight;
225 sum += center_weight;
227 for (
const int x :
IndexRange(size.x).drop_front(1)) {
229 *weights_->get_elem(x, 0) = weight;
230 sum += weight * 2.0f;
233 for (
const int y :
IndexRange(size.y).drop_front(1)) {
235 *weights_->get_elem(0, y) = weight;
236 sum += weight * 2.0f;
239 for (
const int y : IndexRange(size.y).drop_front(1)) {
240 for (
const int x : IndexRange(size.x).drop_front(1)) {
242 *weights_->get_elem(x, y) = weight;
243 sum += weight * 4.0f;
247 for (
const int y : IndexRange(size.y)) {
248 for (
const int x : IndexRange(size.x)) {
249 *weights_->get_elem(x, y) /=
sum;
255 const rcti &output_area,
265 r_input_area.
xmax = output_area.
xmax + add_x;
266 r_input_area.
xmin = output_area.
xmin - add_x;
267 r_input_area.
ymax = output_area.
ymax + add_y;
268 r_input_area.
ymin = output_area.
ymin - add_y;
278 int2 weights_size =
int2(weights_->get_width(), weights_->get_height());
279 int2 base_radius = weights_size -
int2(1);
288 float center_weight = *weights_->get_elem(0, 0);
289 accumulated_color += center_color * center_weight;
290 accumulated_weight += center_weight;
292 for (
int x = 1; x <= radius.x; x++) {
293 float weight_coordinates = (x /
float(radius.x)) * base_radius.x;
295 weights_->read_elem_bilinear(weight_coordinates, 0.0f, &weight);
298 accumulated_weight += weight * 2.0f;
301 for (
int y = 1; y <= radius.y; y++) {
302 float weight_coordinates = (y /
float(radius.y)) * base_radius.y;
304 weights_->read_elem_bilinear(0.0f, weight_coordinates, &weight);
307 accumulated_weight += weight * 2.0f;
310 for (
int y = 1; y <= radius.y; y++) {
311 for (
int x = 1; x <= radius.x; x++) {
314 weights_->read_elem_bilinear(weight_coordinates.x, weight_coordinates.y, &weight);
319 accumulated_weight += weight * 4.0f;
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void mul_v4_v4fl(float r[4], const float a[4], float f)
MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
@ CMP_NODE_BLUR_ASPECT_NONE
static T sum(const btAlignedObjectArray< T > &items)
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
virtual 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.
static constexpr int SIZE_INPUT_INDEX
virtual void init_data() override
static constexpr int IMAGE_INPUT_INDEX
void init_execution() override
GaussianBlurReferenceOperation()
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.
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void init_data() override
void deinit_execution() override
void init_execution() override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
GaussianBokehBlurOperation()
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
float * get_elem(int x, int y)
BuffersIterator< float > iterate_with(Span< MemoryBuffer * > inputs)
virtual void init_execution()
unsigned int get_height() const
unsigned int get_width() const
virtual void deinit_execution()
draw_view in_light_buf[] float
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
DataType
possible data types for sockets
float RE_filter_value(int type, float x)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
ccl_device_inline float3 ceil(const float3 a)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
T safe_divide(const T &a, const T &b)
T length(const VecBase< T, Size > &a)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2