[Bf-blender-cvs] [53d588a9d97] compositor-full-frame: Compositor: Full frame input nodes

Manuel Castilla noreply at git.blender.org
Mon Aug 2 23:12:18 CEST 2021


Commit: 53d588a9d979a0e8361756895a58c8c460dea6d5
Author: Manuel Castilla
Date:   Fri Jul 30 12:39:15 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB53d588a9d979a0e8361756895a58c8c460dea6d5

Compositor: Full frame input nodes

Adds full frame implementation to "Bokeh Image" node, "Track Position"
node and `SetVectorOperation`.
The other nodes in "Input" submenu are implemented separately.
No functional changes.

---
Note:
These nodes are very similar to already reviewed nodes. The patch
is meant for a quick look before committing.

Differential Revision: https://developer.blender.org/D12090

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

M	source/blender/compositor/operations/COM_BokehImageOperation.cc
M	source/blender/compositor/operations/COM_BokehImageOperation.h
M	source/blender/compositor/operations/COM_SetVectorOperation.cc
M	source/blender/compositor/operations/COM_SetVectorOperation.h
M	source/blender/compositor/operations/COM_TrackPositionOperation.cc
M	source/blender/compositor/operations/COM_TrackPositionOperation.h

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

diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cc b/source/blender/compositor/operations/COM_BokehImageOperation.cc
index 63f283b6acc..bd5b25b5af8 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.cc
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.cc
@@ -110,6 +110,31 @@ void BokehImageOperation::executePixelSampled(float output[4],
   output[3] = (insideBokehMax + insideBokehMed + insideBokehMin) / 3.0f;
 }
 
+void BokehImageOperation::update_memory_buffer_partial(MemoryBuffer *output,
+                                                       const rcti &area,
+                                                       Span<MemoryBuffer *> UNUSED(inputs))
+{
+  const float shift = this->m_data->lensshift;
+  const float shift2 = shift / 2.0f;
+  const float distance = this->m_circularDistance;
+  for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
+    const float insideBokehMax = isInsideBokeh(distance, it.x, it.y);
+    const float insideBokehMed = isInsideBokeh(distance - fabsf(shift2 * distance), it.x, it.y);
+    const float insideBokehMin = isInsideBokeh(distance - fabsf(shift * distance), it.x, it.y);
+    if (shift < 0) {
+      it.out[0] = insideBokehMax;
+      it.out[1] = insideBokehMed;
+      it.out[2] = insideBokehMin;
+    }
+    else {
+      it.out[0] = insideBokehMin;
+      it.out[1] = insideBokehMed;
+      it.out[2] = insideBokehMax;
+    }
+    it.out[3] = (insideBokehMax + insideBokehMed + insideBokehMin) / 3.0f;
+  }
+}
+
 void BokehImageOperation::deinitExecution()
 {
   if (this->m_deleteData) {
diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h
index 2e0bc8a34dc..2527233fabd 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.h
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.h
@@ -18,7 +18,7 @@
 
 #pragma once
 
-#include "COM_NodeOperation.h"
+#include "COM_MultiThreadedOperation.h"
 
 namespace blender::compositor {
 
@@ -49,7 +49,7 @@ namespace blender::compositor {
  * With a simple compare it can be detected if the evaluated pixel is between the outer and inner
  *edge.
  */
-class BokehImageOperation : public NodeOperation {
+class BokehImageOperation : public MultiThreadedOperation {
  private:
   /**
    * \brief Settings of the bokeh image
@@ -151,6 +151,10 @@ class BokehImageOperation : public NodeOperation {
   {
     this->m_deleteData = true;
   }
+
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cc b/source/blender/compositor/operations/COM_SetVectorOperation.cc
index 7b8cf44048c..29350cc1ef0 100644
--- a/source/blender/compositor/operations/COM_SetVectorOperation.cc
+++ b/source/blender/compositor/operations/COM_SetVectorOperation.cc
@@ -25,6 +25,7 @@ SetVectorOperation::SetVectorOperation()
 {
   this->addOutputSocket(DataType::Vector);
   flags.is_set_operation = true;
+  flags.is_fullframe_operation = true;
 }
 
 void SetVectorOperation::executePixelSampled(float output[4],
@@ -44,4 +45,13 @@ void SetVectorOperation::determineResolution(unsigned int resolution[2],
   resolution[1] = preferredResolution[1];
 }
 
+void SetVectorOperation::update_memory_buffer(MemoryBuffer *output,
+                                              const rcti &area,
+                                              Span<MemoryBuffer *> UNUSED(inputs))
+{
+  BLI_assert(output->is_a_single_elem());
+  float *out_elem = output->get_elem(area.xmin, area.ymin);
+  copy_v3_v3(out_elem, get_constant_elem());
+}
+
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h
index 41fd06659d6..b1fcb20f3a9 100644
--- a/source/blender/compositor/operations/COM_SetVectorOperation.h
+++ b/source/blender/compositor/operations/COM_SetVectorOperation.h
@@ -93,6 +93,10 @@ class SetVectorOperation : public ConstantOperation {
     setY(vector[1]);
     setZ(vector[2]);
   }
+
+  void update_memory_buffer(MemoryBuffer *output,
+                            const rcti &area,
+                            Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cc b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
index 993410e3e84..1d24cba0a97 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.cc
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
@@ -42,6 +42,8 @@ TrackPositionOperation::TrackPositionOperation()
   this->m_relativeFrame = 0;
   this->m_speed_output = false;
   flags.is_set_operation = true;
+  flags.is_fullframe_operation = true;
+  flags.can_be_constant = true;
 }
 
 void TrackPositionOperation::initExecution()
@@ -131,6 +133,23 @@ void TrackPositionOperation::executePixelSampled(float output[4],
   }
 }
 
+void TrackPositionOperation::update_memory_buffer(MemoryBuffer *output,
+                                                  const rcti &area,
+                                                  Span<MemoryBuffer *> UNUSED(inputs))
+{
+  /* Should always be folded into a constant operation because there are no inputs and
+   * can_be_constant flag is enabled. */
+  BLI_assert(BLI_rcti_size_x(&area) == 1 && BLI_rcti_size_y(&area) == 1);
+  float *out = output->get_elem(area.xmin, area.ymin);
+  out[0] = this->m_markerPos[this->m_axis] - this->m_relativePos[this->m_axis];
+  if (this->m_axis == 0) {
+    out[0] *= this->m_width;
+  }
+  else {
+    out[0] *= this->m_height;
+  }
+}
+
 void TrackPositionOperation::determineResolution(unsigned int resolution[2],
                                                  unsigned int preferredResolution[2])
 {
diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h
index b0b0a123bd6..6916b5cbbff 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.h
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h
@@ -93,6 +93,10 @@ class TrackPositionOperation : public NodeOperation {
   void initExecution() override;
 
   void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+  void update_memory_buffer(MemoryBuffer *output,
+                            const rcti &area,
+                            Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list