diff options
author | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-16 19:16:33 +0300 |
---|---|---|
committer | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-16 20:13:28 +0300 |
commit | 0b87a846a85269b45bb332def46b3c34731cb91a (patch) | |
tree | 98b465b6f449aaa8e54fcba65ce92bf3f12060cf /source/blender/compositor/operations | |
parent | 802abbb0dab699639b1a3045799c9df27597f712 (diff) |
Compositor: Full frame Normalize node
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r-- | source/blender/compositor/operations/COM_NormalizeOperation.cc | 57 | ||||
-rw-r--r-- | source/blender/compositor/operations/COM_NormalizeOperation.h | 12 |
2 files changed, 67 insertions, 2 deletions
diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.cc b/source/blender/compositor/operations/COM_NormalizeOperation.cc index f93afcaab95..841b45d2786 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.cc +++ b/source/blender/compositor/operations/COM_NormalizeOperation.cc @@ -56,6 +56,7 @@ void NormalizeOperation::deinitExecution() { this->m_imageReader = nullptr; delete this->m_cachedInstance; + m_cachedInstance = nullptr; NodeOperation::deinitMutex(); } @@ -127,4 +128,60 @@ void NormalizeOperation::deinitializeTileData(rcti * /*rect*/, void * /*data*/) /* pass */ } +void NormalizeOperation::get_area_of_interest(const int UNUSED(input_idx), + const rcti &UNUSED(output_area), + rcti &r_input_area) +{ + NodeOperation *input = get_input_operation(0); + r_input_area.xmin = 0; + r_input_area.xmax = input->getWidth(); + r_input_area.ymin = 0; + r_input_area.ymax = input->getHeight(); +} + +void NormalizeOperation::update_memory_buffer_started(MemoryBuffer *UNUSED(output), + const rcti &UNUSED(area), + Span<MemoryBuffer *> inputs) +{ + if (m_cachedInstance == nullptr) { + MemoryBuffer *input = inputs[0]; + + /* Using generic two floats struct to store `x: min`, `y: multiply`. */ + NodeTwoFloats *minmult = new NodeTwoFloats(); + + float minv = 1.0f + BLENDER_ZMAX; + float maxv = -1.0f - BLENDER_ZMAX; + for (const float *elem : input->as_range()) { + const float value = *elem; + if ((value > maxv) && (value <= BLENDER_ZMAX)) { + maxv = value; + } + if ((value < minv) && (value >= -BLENDER_ZMAX)) { + minv = value; + } + } + + minmult->x = minv; + /* The case of a flat buffer would cause a divide by 0. */ + minmult->y = ((maxv != minv) ? 1.0f / (maxv - minv) : 0.0f); + + m_cachedInstance = minmult; + } +} + +void NormalizeOperation::update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) +{ + NodeTwoFloats *minmult = m_cachedInstance; + for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) { + const float input_value = *it.in(0); + + *it.out = (input_value - minmult->x) * minmult->y; + + /* Clamp infinities. */ + CLAMP(*it.out, 0.0f, 1.0f); + } +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h index c89ba372189..7af2aad8a88 100644 --- a/source/blender/compositor/operations/COM_NormalizeOperation.h +++ b/source/blender/compositor/operations/COM_NormalizeOperation.h @@ -18,7 +18,7 @@ #pragma once -#include "COM_NodeOperation.h" +#include "COM_MultiThreadedOperation.h" #include "DNA_node_types.h" namespace blender::compositor { @@ -27,7 +27,7 @@ namespace blender::compositor { * \brief base class of normalize, implementing the simple normalize * \ingroup operation */ -class NormalizeOperation : public NodeOperation { +class NormalizeOperation : public MultiThreadedOperation { protected: /** * \brief Cached reference to the reader @@ -64,6 +64,14 @@ class NormalizeOperation : public NodeOperation { bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) override; + + void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override; + void update_memory_buffer_started(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) override; + void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) override; }; } // namespace blender::compositor |