[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