[Bf-blender-cvs] [13590fba71a] compositor-full-frame: Compositor: Full frame Movie Distortion node

Manuel Castilla noreply at git.blender.org
Wed Aug 4 23:03:39 CEST 2021


Commit: 13590fba71a85871190ecaedb532ec36b26f6d80
Author: Manuel Castilla
Date:   Tue Aug 3 23:17:40 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB13590fba71a85871190ecaedb532ec36b26f6d80

Compositor: Full frame Movie Distortion node

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

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

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

diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.cc b/source/blender/compositor/operations/COM_MovieDistortionOperation.cc
index c8e045ea117..d3424959061 100644
--- a/source/blender/compositor/operations/COM_MovieDistortionOperation.cc
+++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.cc
@@ -128,4 +128,51 @@ bool MovieDistortionOperation::determineDependingAreaOfInterest(rcti *input,
   return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 }
 
+void MovieDistortionOperation::get_area_of_interest(const int input_idx,
+                                                    const rcti &output_area,
+                                                    rcti &r_input_area)
+{
+  BLI_assert(input_idx == 0);
+  UNUSED_VARS_NDEBUG(input_idx);
+  r_input_area.xmin = output_area.xmin - m_margin[0];
+  r_input_area.ymin = output_area.ymin - m_margin[1];
+  r_input_area.xmax = output_area.xmax + m_margin[0];
+  r_input_area.ymax = output_area.ymax + m_margin[1];
+}
+
+void MovieDistortionOperation::update_memory_buffer_partial(MemoryBuffer *output,
+                                                            const rcti &area,
+                                                            Span<MemoryBuffer *> inputs)
+{
+  const MemoryBuffer *input_img = inputs[0];
+  if (this->m_distortion == nullptr) {
+    output->copy_from(input_img, area);
+    return;
+  }
+
+  /* `float overscan = 0.0f;` */
+  const float pixel_aspect = this->m_pixel_aspect;
+  const float w = (float)this->m_width /* `/ (1 + overscan)` */;
+  const float h = (float)this->m_height /* `/ (1 + overscan)` */;
+  const float aspx = w / (float)this->m_calibration_width;
+  const float aspy = h / (float)this->m_calibration_height;
+  float xy[2];
+  float distorted_xy[2];
+  for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
+    xy[0] = (it.x /* `- 0.5 * overscan * w` */) / aspx;
+    xy[1] = (it.y /* `- 0.5 * overscan * h` */) / aspy / pixel_aspect;
+
+    if (this->m_apply) {
+      BKE_tracking_distortion_undistort_v2(this->m_distortion, xy, distorted_xy);
+    }
+    else {
+      BKE_tracking_distortion_distort_v2(this->m_distortion, xy, distorted_xy);
+    }
+
+    const float u = distorted_xy[0] * aspx /* `+ 0.5 * overscan * w` */;
+    const float v = (distorted_xy[1] * aspy /* `+ 0.5 * overscan * h` */) * pixel_aspect;
+    input_img->read_elem_bilinear(u, v, it.out);
+  }
+}
+
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h
index 631a62f7ebf..69c2f9c269c 100644
--- a/source/blender/compositor/operations/COM_MovieDistortionOperation.h
+++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h
@@ -18,7 +18,7 @@
 
 #pragma once
 
-#include "COM_NodeOperation.h"
+#include "COM_MultiThreadedOperation.h"
 #include "DNA_movieclip_types.h"
 #include "MEM_guardedalloc.h"
 
@@ -26,7 +26,7 @@
 
 namespace blender::compositor {
 
-class MovieDistortionOperation : public NodeOperation {
+class MovieDistortionOperation : public MultiThreadedOperation {
  private:
   SocketReader *m_inputOperation;
   MovieClip *m_movieClip;
@@ -58,6 +58,11 @@ class MovieDistortionOperation : public NodeOperation {
   bool determineDependingAreaOfInterest(rcti *input,
                                         ReadBufferOperation *readOperation,
                                         rcti *output) override;
+
+  void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) 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