diff options
author | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-10 16:25:10 +0300 |
---|---|---|
committer | Manuel Castilla <manzanillawork@gmail.com> | 2021-08-10 17:16:23 +0300 |
commit | d481c6651d149bdc83a8c0bbb675d3d296f7c530 (patch) | |
tree | 96f7fca0fdf2a08eb1dabbfb2025ad88ae378c03 /source/blender/compositor/operations/COM_ZCombineOperation.cc | |
parent | 8f6cc16490843bec88806c2f76c0aa012db938dd (diff) |
Compositor: Full frame color nodes
Adds full frame implementation to "Alpha Over",
"Hue Saturation Value", "Invert", "Tonemap" and "ZCombine" nodes.
The other nodes in "Color" submenu are implemented separately.
No functional changes.
Reviewed By: jbakker
Differential Revision: https://developer.blender.org/D12092
Diffstat (limited to 'source/blender/compositor/operations/COM_ZCombineOperation.cc')
-rw-r--r-- | source/blender/compositor/operations/COM_ZCombineOperation.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cc b/source/blender/compositor/operations/COM_ZCombineOperation.cc index 9d3ca7e736e..7050c3b2d83 100644 --- a/source/blender/compositor/operations/COM_ZCombineOperation.cc +++ b/source/blender/compositor/operations/COM_ZCombineOperation.cc @@ -33,6 +33,7 @@ ZCombineOperation::ZCombineOperation() this->m_depth1Reader = nullptr; this->m_image2Reader = nullptr; this->m_depth2Reader = nullptr; + this->flags.can_be_constant = true; } void ZCombineOperation::initExecution() @@ -60,6 +61,19 @@ void ZCombineOperation::executePixelSampled(float output[4], this->m_image2Reader->readSampled(output, x, y, sampler); } } + +void ZCombineOperation::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 depth1 = *it.in(1); + const float depth2 = *it.in(3); + const float *color = (depth1 < depth2) ? it.in(0) : it.in(2); + copy_v4_v4(it.out, color); + } +} + void ZCombineAlphaOperation::executePixelSampled(float output[4], float x, float y, @@ -88,6 +102,32 @@ void ZCombineAlphaOperation::executePixelSampled(float output[4], output[3] = MAX2(color1[3], color2[3]); } +void ZCombineAlphaOperation::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 depth1 = *it.in(1); + const float depth2 = *it.in(3); + const float *color1; + const float *color2; + if (depth1 <= depth2) { + color1 = it.in(0); + color2 = it.in(2); + } + else { + color1 = it.in(2); + color2 = it.in(0); + } + const float fac = color1[3]; + const float ifac = 1.0f - fac; + it.out[0] = fac * color1[0] + ifac * color2[0]; + it.out[1] = fac * color1[1] + ifac * color2[1]; + it.out[2] = fac * color1[2] + ifac * color2[2]; + it.out[3] = MAX2(color1[3], color2[3]); + } +} + void ZCombineOperation::deinitExecution() { this->m_image1Reader = nullptr; @@ -132,6 +172,18 @@ void ZCombineMaskOperation::executePixelSampled(float output[4], interp_v4_v4v4(output, color1, color2, 1.0f - mask[0]); } +void ZCombineMaskOperation::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 mask = *it.in(0); + const float *color1 = it.in(1); + const float *color2 = it.in(2); + interp_v4_v4v4(it.out, color1, color2, 1.0f - mask); + } +} + void ZCombineMaskAlphaOperation::executePixelSampled(float output[4], float x, float y, @@ -154,6 +206,24 @@ void ZCombineMaskAlphaOperation::executePixelSampled(float output[4], output[3] = MAX2(color1[3], color2[3]); } +void ZCombineMaskAlphaOperation::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 mask = *it.in(0); + const float *color1 = it.in(1); + const float *color2 = it.in(2); + const float fac = (1.0f - mask) * (1.0f - color1[3]) + mask * color2[3]; + const float mfac = 1.0f - fac; + + it.out[0] = color1[0] * mfac + color2[0] * fac; + it.out[1] = color1[1] * mfac + color2[1] * fac; + it.out[2] = color1[2] * mfac + color2[2] * fac; + it.out[3] = MAX2(color1[3], color2[3]); + } +} + void ZCombineMaskOperation::deinitExecution() { this->m_image1Reader = nullptr; |