[Bf-blender-cvs] [30baa0b7ff9] compositor-full-frame: Compositor: Full frame ZCombine node

Manuel Castilla noreply at git.blender.org
Tue Jul 27 23:26:02 CEST 2021


Commit: 30baa0b7ff9c1b7f241a6e70f71bd26d5cb9e4e4
Author: Manuel Castilla
Date:   Sun Jul 25 19:40:59 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB30baa0b7ff9c1b7f241a6e70f71bd26d5cb9e4e4

Compositor: Full frame ZCombine node

Adds full frame implementation to this node operations.
No functional changes.

===================================================================

M	source/blender/compositor/operations/COM_ZCombineOperation.cc
M	source/blender/compositor/operations/COM_ZCombineOperation.h

===================================================================

diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.cc b/source/blender/compositor/operations/COM_ZCombineOperation.cc
index 9d3ca7e736e..48289b8a777 100644
--- a/source/blender/compositor/operations/COM_ZCombineOperation.cc
+++ b/source/blender/compositor/operations/COM_ZCombineOperation.cc
@@ -60,6 +60,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 +101,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 +171,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 +205,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;
diff --git a/source/blender/compositor/operations/COM_ZCombineOperation.h b/source/blender/compositor/operations/COM_ZCombineOperation.h
index d0b1aee7310..acd60b6c866 100644
--- a/source/blender/compositor/operations/COM_ZCombineOperation.h
+++ b/source/blender/compositor/operations/COM_ZCombineOperation.h
@@ -26,7 +26,7 @@ namespace blender::compositor {
  * this program converts an input color to an output value.
  * it assumes we are in sRGB color space.
  */
-class ZCombineOperation : public NodeOperation {
+class ZCombineOperation : public MultiThreadedOperation {
  protected:
   SocketReader *m_image1Reader;
   SocketReader *m_depth1Reader;
@@ -46,13 +46,21 @@ class ZCombineOperation : public NodeOperation {
    * The inner loop of this operation.
    */
   void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 
 class ZCombineAlphaOperation : public ZCombineOperation {
   void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 
-class ZCombineMaskOperation : public NodeOperation {
+class ZCombineMaskOperation : public MultiThreadedOperation {
  protected:
   SocketReader *m_maskReader;
   SocketReader *m_image1Reader;
@@ -64,9 +72,17 @@ class ZCombineMaskOperation : public NodeOperation {
   void initExecution() override;
   void deinitExecution() override;
   void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 class ZCombineMaskAlphaOperation : public ZCombineMaskOperation {
   void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list