diff options
author | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-16 12:30:52 +0300 |
---|---|---|
committer | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-16 20:10:31 +0300 |
commit | c97795b43af623a102576d6c846887327cc2317e (patch) | |
tree | 5e6e507795712500ef02c01cd77b1e33e7020c06 /source/blender/compositor/operations | |
parent | ddc2d379d408a968db874dad098e84e5ef5efae2 (diff) |
Compositor: Full frame Map Range node
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r-- | source/blender/compositor/operations/COM_MapRangeOperation.cc | 39 | ||||
-rw-r--r-- | source/blender/compositor/operations/COM_MapRangeOperation.h | 8 |
2 files changed, 45 insertions, 2 deletions
diff --git a/source/blender/compositor/operations/COM_MapRangeOperation.cc b/source/blender/compositor/operations/COM_MapRangeOperation.cc index ada3cd6f159..6700d8d06f9 100644 --- a/source/blender/compositor/operations/COM_MapRangeOperation.cc +++ b/source/blender/compositor/operations/COM_MapRangeOperation.cc @@ -104,4 +104,43 @@ void MapRangeOperation::deinitExecution() this->m_destMaxOperation = nullptr; } +void MapRangeOperation::update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) +{ + for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) { + const float source_min = *it.in(1); + const float source_max = *it.in(2); + if (fabsf(source_max - source_min) < 1e-6f) { + it.out[0] = 0.0f; + continue; + } + + float value = *it.in(0); + const float dest_min = *it.in(3); + const float dest_max = *it.in(4); + if (value >= -BLENDER_ZMAX && value <= BLENDER_ZMAX) { + value = (value - source_min) / (source_max - source_min); + value = dest_min + value * (dest_max - dest_min); + } + else if (value > BLENDER_ZMAX) { + value = dest_max; + } + else { + value = dest_min; + } + + if (m_useClamp) { + if (dest_max > dest_min) { + CLAMP(value, dest_min, dest_max); + } + else { + CLAMP(value, dest_max, dest_min); + } + } + + it.out[0] = value; + } +} + } // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_MapRangeOperation.h b/source/blender/compositor/operations/COM_MapRangeOperation.h index a544c59887e..a01be14d528 100644 --- a/source/blender/compositor/operations/COM_MapRangeOperation.h +++ b/source/blender/compositor/operations/COM_MapRangeOperation.h @@ -18,7 +18,7 @@ #pragma once -#include "COM_NodeOperation.h" +#include "COM_MultiThreadedOperation.h" #include "DNA_texture_types.h" namespace blender::compositor { @@ -27,7 +27,7 @@ namespace blender::compositor { * this program converts an input color to an output value. * it assumes we are in sRGB color space. */ -class MapRangeOperation : public NodeOperation { +class MapRangeOperation : public MultiThreadedOperation { private: /** * Cached reference to the inputProgram @@ -68,6 +68,10 @@ class MapRangeOperation : public NodeOperation { { this->m_useClamp = value; } + + void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span<MemoryBuffer *> inputs) override; }; } // namespace blender::compositor |