[Bf-blender-cvs] [d5655a84493] compositor-full-frame: Compositor: Add invert option to TransformOperation

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


Commit: d5655a844931e27d1a514ca08cfbf799d8c58a4e
Author: Manuel Castilla
Date:   Mon Aug 2 21:47:33 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rBd5655a844931e27d1a514ca08cfbf799d8c58a4e

Compositor: Add invert option to TransformOperation

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

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

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

diff --git a/source/blender/compositor/operations/COM_TransformOperation.cc b/source/blender/compositor/operations/COM_TransformOperation.cc
index 7d549190444..255b97e0c73 100644
--- a/source/blender/compositor/operations/COM_TransformOperation.cc
+++ b/source/blender/compositor/operations/COM_TransformOperation.cc
@@ -104,14 +104,40 @@ void TransformOperation::update_memory_buffer_partial(MemoryBuffer *output,
 {
   const MemoryBuffer *input_img = inputs[0];
   MemoryBuffer *input_scale = inputs[4];
-  for (BuffersIterator<float> it = output->iterate_with({input_scale}, area); !it.is_end(); ++it) {
+  BuffersIterator<float> it = output->iterate_with({input_scale}, area);
+  if (invert_) {
+    transform_inverted(it, input_img);
+  }
+  else {
+    transform(it, input_img);
+  }
+}
+
+void TransformOperation::transform(BuffersIterator<float> &it, const MemoryBuffer *input_img)
+{
+  for (; !it.is_end(); ++it) {
     const float scale = *it.in(0);
     float x = it.x - translate_x_;
     float y = it.y - translate_y_;
+    RotateOperation::rotate_coords(
+        x, y, rotate_center_x_, rotate_center_y_, rotate_sine_, rotate_cosine_);
     x = ScaleOperation::scale_coord(x, scale_center_x_, scale);
     y = ScaleOperation::scale_coord(y, scale_center_y_, scale);
+    input_img->read_elem_sampled(x, y, sampler_, it.out);
+  }
+}
+
+void TransformOperation::transform_inverted(BuffersIterator<float> &it,
+                                            const MemoryBuffer *input_img)
+{
+  for (; !it.is_end(); ++it) {
+    const float scale = *it.in(0);
+    float x = ScaleOperation::scale_coord(it.x, scale_center_x_, scale);
+    float y = ScaleOperation::scale_coord(it.y, scale_center_y_, scale);
     RotateOperation::rotate_coords(
         x, y, rotate_center_x_, rotate_center_y_, rotate_sine_, rotate_cosine_);
+    x -= translate_x_;
+    y -= translate_y_;
     input_img->read_elem_sampled(x, y, sampler_, it.out);
   }
 }
diff --git a/source/blender/compositor/operations/COM_TransformOperation.h b/source/blender/compositor/operations/COM_TransformOperation.h
index d14b51713ee..a0d61690b1d 100644
--- a/source/blender/compositor/operations/COM_TransformOperation.h
+++ b/source/blender/compositor/operations/COM_TransformOperation.h
@@ -39,6 +39,7 @@ class TransformOperation : public MultiThreadedOperation {
   bool convert_degree_to_rad_;
   float translate_factor_x_;
   float translate_factor_y_;
+  bool invert_;
 
  public:
   TransformOperation();
@@ -56,11 +57,21 @@ class TransformOperation : public MultiThreadedOperation {
   {
     sampler_ = sampler;
   }
+  void set_invert(bool value)
+  {
+    invert_ = value;
+  }
   void init_data() 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;
+
+ private:
+  /** Translate -> Rotate -> Scale. */
+  void transform(BuffersIterator<float> &it, const MemoryBuffer *input_img);
+  /** Scale -> Rotate -> Translate. */
+  void transform_inverted(BuffersIterator<float> &it, const MemoryBuffer *input_img);
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list