[Bf-blender-cvs] [1747c679ee5] compositor-full-frame: Compositor: Full frame Vector blur node

Manuel Castilla noreply at git.blender.org
Fri Aug 13 18:24:17 CEST 2021


Commit: 1747c679ee5fc1189c7d3266768c594a0a46e3bc
Author: Manuel Castilla
Date:   Fri Aug 13 02:01:25 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB1747c679ee5fc1189c7d3266768c594a0a46e3bc

Compositor: Full frame Vector blur node

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

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

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

diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cc b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
index b5b5d426338..18df6f974b3 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.cc
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
@@ -57,6 +57,7 @@ VectorBlurOperation::VectorBlurOperation()
   this->m_inputSpeedProgram = nullptr;
   this->m_inputZProgram = nullptr;
   flags.complex = true;
+  flags.is_fullframe_operation = true;
 }
 void VectorBlurOperation::initExecution()
 {
@@ -121,6 +122,51 @@ bool VectorBlurOperation::determineDependingAreaOfInterest(rcti * /*input*/,
   return false;
 }
 
+void VectorBlurOperation::get_area_of_interest(const int UNUSED(input_idx),
+                                               const rcti &UNUSED(output_area),
+                                               rcti &r_input_area)
+{
+  r_input_area.xmin = 0;
+  r_input_area.xmax = this->getWidth();
+  r_input_area.ymin = 0;
+  r_input_area.ymax = this->getHeight();
+}
+
+void VectorBlurOperation::update_memory_buffer(MemoryBuffer *output,
+                                               const rcti &area,
+                                               Span<MemoryBuffer *> inputs)
+{
+  /* TODO(manzanilla): once tiled implementation is removed, run multi-threaded where possible. */
+  if (!m_cachedInstance) {
+    MemoryBuffer *image = inputs[IMAGE_INPUT_INDEX];
+    const bool is_image_inflated = image->is_a_single_elem();
+    image = is_image_inflated ? image->inflate() : image;
+
+    /* Must be a copy because it's modified in #generateVectorBlur. */
+    MemoryBuffer *speed = inputs[SPEED_INPUT_INDEX];
+    speed = speed->is_a_single_elem() ? speed->inflate() : new MemoryBuffer(*speed);
+
+    MemoryBuffer *z = inputs[Z_INPUT_INDEX];
+    const bool is_z_inflated = z->is_a_single_elem();
+    z = is_z_inflated ? z->inflate() : z;
+
+    m_cachedInstance = (float *)MEM_dupallocN(image->getBuffer());
+    this->generateVectorBlur(m_cachedInstance, image, speed, z);
+
+    if (is_image_inflated) {
+      delete image;
+    }
+    delete speed;
+    if (is_z_inflated) {
+      delete z;
+    }
+  }
+
+  const int num_channels = COM_data_type_num_channels(getOutputSocket()->getDataType());
+  MemoryBuffer buf(m_cachedInstance, num_channels, this->getWidth(), this->getHeight());
+  output->copy_from(&buf, area);
+}
+
 void VectorBlurOperation::generateVectorBlur(float *data,
                                              MemoryBuffer *inputImage,
                                              MemoryBuffer *inputSpeed,
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h
index dfcf1fb16f7..c30c150db3c 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.h
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h
@@ -26,6 +26,10 @@ namespace blender::compositor {
 
 class VectorBlurOperation : public NodeOperation, public QualityStepHelper {
  private:
+  static constexpr int IMAGE_INPUT_INDEX = 0;
+  static constexpr int Z_INPUT_INDEX = 1;
+  static constexpr int SPEED_INPUT_INDEX = 2;
+
   /**
    * \brief Cached reference to the inputProgram
    */
@@ -68,6 +72,13 @@ class VectorBlurOperation : public NodeOperation, public QualityStepHelper {
                                         ReadBufferOperation *readOperation,
                                         rcti *output) override;
 
+  void get_area_of_interest(const int input_idx,
+                            const rcti &output_area,
+                            rcti &r_input_area) override;
+  void update_memory_buffer(MemoryBuffer *output,
+                            const rcti &area,
+                            Span<MemoryBuffer *> inputs) override;
+
  protected:
   void generateVectorBlur(float *data,
                           MemoryBuffer *inputImage,



More information about the Bf-blender-cvs mailing list