20 translate_factor_x_ = 1.0f;
21 translate_factor_y_ = 1.0f;
22 convert_degree_to_rad_ =
false;
38 const double rad = convert_degree_to_rad_ ?
DEG2RAD(
double(degree)) : degree;
39 rotate_cosine_ =
cos(rad);
40 rotate_sine_ = sin(rad);
46 const rcti &output_area,
50 case IMAGE_INPUT_INDEX: {
55 r_input_area = output_area;
64 image_canvas, scale_canvas_, scale_, scale_, r_input_area, r_input_area);
69 rotate_canvas_, scale_canvas_, scale_, scale_, output_area, r_input_area);
83 case DEGREE_INPUT_INDEX:
84 case SCALE_INPUT_INDEX: {
95 const MemoryBuffer *input_img = inputs[IMAGE_INPUT_INDEX];
98 transform_inverted(it, input_img);
101 transform(it, input_img);
107 const bool image_determined =
109 if (image_determined) {
110 rcti image_canvas = r_area;
120 scale_canvas_ = image_canvas;
124 scale_canvas_, rotate_sine_, rotate_cosine_, rotate_canvas_);
126 translate_canvas_ = rotate_canvas_;
129 r_area = translate_canvas_;
133 translate_canvas_ = image_canvas;
137 translate_canvas_, rotate_sine_, rotate_cosine_, rotate_canvas_);
139 scale_canvas_ = rotate_canvas_;
142 r_area = scale_canvas_;
149 float rotate_center_x, rotate_center_y;
151 float rotate_offset_x, rotate_offset_y;
153 translate_canvas_, rotate_canvas_, rotate_offset_x, rotate_offset_y);
157 float scale_offset_x, scale_offset_y;
160 for (; !it.is_end(); ++it) {
164 x = rotate_offset_x +
x;
165 y = rotate_offset_y +
y;
167 x, y, rotate_center_x, rotate_center_y, rotate_sine_, rotate_cosine_);
169 input_img->
read_elem_sampled(x - translate_x_, y - translate_y_, sampler_, it.out);
174 const MemoryBuffer *input_img)
177 const float scale_center_x =
BLI_rcti_size_x(&image_canvas) / 2.0f - translate_x_;
178 const float scale_center_y =
BLI_rcti_size_y(&image_canvas) / 2.0f - translate_y_;
179 float scale_offset_x, scale_offset_y;
182 float rotate_center_x, rotate_center_y;
184 rotate_center_x -= translate_x_;
185 rotate_center_y -= translate_y_;
186 float rotate_offset_x, rotate_offset_y;
188 scale_canvas_, rotate_canvas_, rotate_offset_x, rotate_offset_y);
190 for (; !it.is_end(); ++it) {
191 float x = rotate_offset_x + (it.x - translate_x_);
192 float y = rotate_offset_y + (it.y - translate_y_);
194 x, y, rotate_center_x, rotate_center_y, rotate_sine_, rotate_cosine_);
199 input_img->read_elem_sampled(x, y, sampler_, it.out);
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
void BLI_rcti_translate(struct rcti *rect, int x, int y)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
a MemoryBuffer contains access to the data
void read_elem_sampled(float x, float y, PixelSampler sampler, float *out) const
BuffersIterator< float > iterate_with(Span< MemoryBuffer * > inputs)
NodeOperation contains calculation logic.
void add_output_socket(DataType datatype)
float get_constant_value_default(float default_value)
NodeOperationFlags flags_
const rcti & get_canvas() const
NodeOperation * get_input_operation(int index)
NodeOperationInput * get_input_socket(unsigned int index)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
static void get_rotation_offset(const rcti &input_canvas, const rcti &rotate_canvas, float &r_offset_x, float &r_offset_y)
static void rotate_coords(float &x, float &y, float center_x, float center_y, float sine, float cosine)
static void get_rotation_area_of_interest(const rcti &input_canvas, const rcti &rotate_canvas, float sine, float cosine, const rcti &output_area, rcti &r_input_area)
static void get_rotation_canvas(const rcti &input_canvas, float sine, float cosine, rcti &r_canvas)
static void get_rotation_center(const rcti &area, float &r_x, float &r_y)
static void get_scale_offset(const rcti &input_canvas, const rcti &scale_canvas, float &r_scale_offset_x, float &r_scale_offset_y)
static void get_scale_area_of_interest(const rcti &input_canvas, const rcti &scale_canvas, float relative_scale_x, float relative_scale_y, const rcti &output_area, rcti &r_input_area)
static void scale_area(rcti &area, float relative_scale_x, float relative_scale_y)
static float scale_coord_inverted(const float coord, const float center, const float relative_scale)
ccl_device_inline float3 cos(float3 v)
void expand_area_for_sampler(rcti &area, PixelSampler sampler)
constexpr rcti COM_CONSTANT_INPUT_AREA_OF_INTEREST
constexpr rcti COM_AREA_NONE
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator