Compositor: Full frame Glare node

Part of T88150.
This commit is contained in:
Manuel Castilla 2021-09-28 19:33:26 +02:00
parent 0830211c95
commit 283d76a70d
Notes: blender-bot 2023-02-14 00:29:15 +01:00
Referenced by issue #91314, Glare Filter Problem with Full Frame Compositing
4 changed files with 69 additions and 2 deletions

View File

@ -26,6 +26,8 @@ GlareBaseOperation::GlareBaseOperation()
this->addInputSocket(DataType::Color);
this->addOutputSocket(DataType::Color);
this->m_settings = nullptr;
flags.is_fullframe_operation = true;
is_output_rendered_ = false;
}
void GlareBaseOperation::initExecution()
{
@ -69,4 +71,36 @@ bool GlareBaseOperation::determineDependingAreaOfInterest(rcti * /*input*/,
return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
}
void GlareBaseOperation::get_area_of_interest(const int input_idx,
const rcti &UNUSED(output_area),
rcti &r_input_area)
{
BLI_assert(input_idx == 0);
UNUSED_VARS_NDEBUG(input_idx);
r_input_area.xmin = 0;
r_input_area.xmax = this->getWidth();
r_input_area.ymin = 0;
r_input_area.ymax = this->getHeight();
}
void GlareBaseOperation::update_memory_buffer(MemoryBuffer *output,
const rcti &UNUSED(area),
Span<MemoryBuffer *> inputs)
{
if (!is_output_rendered_) {
MemoryBuffer *input = inputs[0];
const bool is_input_inflated = input->is_a_single_elem();
if (is_input_inflated) {
input = input->inflate();
}
this->generateGlare(output->getBuffer(), input, m_settings);
is_output_rendered_ = true;
if (is_input_inflated) {
delete input;
}
}
}
} // namespace blender::compositor

View File

@ -49,6 +49,8 @@ class GlareBaseOperation : public SingleThreadedOperation {
*/
NodeGlare *m_settings;
bool is_output_rendered_;
public:
/**
* Initialize the execution
@ -68,6 +70,14 @@ class GlareBaseOperation : public SingleThreadedOperation {
ReadBufferOperation *readOperation,
rcti *output) override;
void get_area_of_interest(const int input_idx,
const rcti &output_area,
rcti &r_input_area) final;
void update_memory_buffer(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> inputs) final;
protected:
GlareBaseOperation();

View File

@ -71,4 +71,24 @@ void GlareThresholdOperation::deinitExecution()
this->m_inputProgram = nullptr;
}
void GlareThresholdOperation::update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> inputs)
{
const float threshold = this->m_settings->threshold;
for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
const float *color = it.in(0);
if (IMB_colormanagement_get_luminance(color) >= threshold) {
it.out[0] = color[0] - threshold;
it.out[1] = color[1] - threshold;
it.out[2] = color[2] - threshold;
CLAMP3_MIN(it.out, 0.0f);
}
else {
zero_v3(it.out);
}
}
}
} // namespace blender::compositor

View File

@ -18,12 +18,12 @@
#pragma once
#include "COM_NodeOperation.h"
#include "COM_MultiThreadedOperation.h"
#include "DNA_light_types.h"
namespace blender::compositor {
class GlareThresholdOperation : public NodeOperation {
class GlareThresholdOperation : public MultiThreadedOperation {
private:
/**
* \brief Cached reference to the inputProgram
@ -59,6 +59,9 @@ class GlareThresholdOperation : public NodeOperation {
}
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;
};
} // namespace blender::compositor