This patch unifies the implementation of the Bilateral Blur node across CPU and GPU. The difference is due to two things. First, the CPU code had a bug where the upper limit of the blur window was not included in the accumulation. Second, CPU ignored pixels outside of the image while GPU clamped them to the nearest boundary pixel. The latter difference was aligned with GPU until we eventually add an option to control boundary handing. A few utilities were added to the node operation and memory buffer classes to do clamped pixel reading. Pull Request: https://projects.blender.org/blender/blender/pulls/117751
57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
/* SPDX-FileCopyrightText: 2011 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
#include "BLI_math_base.hh"
|
|
|
|
#include "COM_MultiThreadedOperation.h"
|
|
#include "COM_QualityStepHelper.h"
|
|
|
|
namespace blender::compositor {
|
|
|
|
class BilateralBlurOperation : public MultiThreadedOperation, public QualityStepHelper {
|
|
private:
|
|
SocketReader *input_color_program_;
|
|
SocketReader *input_determinator_program_;
|
|
NodeBilateralBlurData *data_;
|
|
int radius_;
|
|
|
|
public:
|
|
BilateralBlurOperation();
|
|
|
|
/**
|
|
* The inner loop of this operation.
|
|
*/
|
|
void execute_pixel(float output[4], int x, int y, void *data) override;
|
|
|
|
/**
|
|
* Initialize the execution
|
|
*/
|
|
void init_execution() override;
|
|
|
|
/**
|
|
* Deinitialize the execution
|
|
*/
|
|
void deinit_execution() override;
|
|
|
|
bool determine_depending_area_of_interest(rcti *input,
|
|
ReadBufferOperation *read_operation,
|
|
rcti *output) override;
|
|
|
|
void set_data(NodeBilateralBlurData *data)
|
|
{
|
|
data_ = data;
|
|
radius_ = int(math::ceil(data->sigma_space + data->iter));
|
|
}
|
|
|
|
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
|
|
|
|
void update_memory_buffer_partial(MemoryBuffer *output,
|
|
const rcti &area,
|
|
Span<MemoryBuffer *> inputs) override;
|
|
};
|
|
|
|
} // namespace blender::compositor
|