17 do_degree2_rad_conversion_ =
false;
18 is_degree_set_ =
false;
30 const rcti &rotate_canvas,
45 const float dxmin = area.xmin - center_x;
46 const float dymin = area.ymin - center_y;
47 const float dxmax = area.xmax - center_x;
48 const float dymax = area.ymax - center_y;
50 const float x1 = center_x + (cosine * dxmin + (-sine) * dymin);
51 const float x2 = center_x + (cosine * dxmax + (-sine) * dymin);
52 const float x3 = center_x + (cosine * dxmin + (-sine) * dymax);
53 const float x4 = center_x + (cosine * dxmax + (-sine) * dymax);
54 const float y1 = center_y + (sine * dxmin + cosine * dymin);
55 const float y2 = center_y + (sine * dxmax + cosine * dymin);
56 const float y3 = center_y + (sine * dxmin + cosine * dymax);
57 const float y4 = center_y + (sine * dxmax + cosine * dymax);
58 const float minx = std::min(x1, std::min(x2, std::min(x3, x4)));
59 const float maxx = std::max(x1, std::max(x2, std::max(x3, x4)));
60 const float miny = std::min(y1, std::min(y2, std::min(y3, y4)));
61 const float maxy = std::max(y1, std::max(y2, std::max(y3, y4)));
80 const rcti &rotate_canvas,
83 const rcti &output_area,
86 float center_x, center_y;
89 float rotate_offset_x, rotate_offset_y;
92 r_input_area = output_area;
102 float center_x, center_y;
108 float offset_x, offset_y;
110 r_canvas = rot_bounds;
118 if (!is_degree_set_) {
122 if (do_degree2_rad_conversion_) {
131 is_degree_set_ =
true;
137 const bool image_determined =
139 if (image_determined) {
140 rcti input_canvas = r_area;
151 const rcti &output_area,
154 if (input_idx == DEGREE_INPUT_INDEX) {
163 input_image_canvas, this->
get_canvas(), sine_, cosine_, output_area, r_input_area);
171 const MemoryBuffer *input_img = inputs[IMAGE_INPUT_INDEX];
174 float center_x, center_y;
176 float rotate_offset_x, rotate_offset_y;
178 image_op->
get_canvas(), this->get_canvas(), rotate_offset_x, rotate_offset_y);
181 float x = rotate_offset_x + it.x +
canvas_.
xmin + 0.5f;
182 float y = rotate_offset_y + it.y +
canvas_.
ymin + 0.5f;
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
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)
void set_canvas_input_index(unsigned int index)
set the index of the input socket that will determine the canvas of this operation
void init_data() override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
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_area_rotation_bounds_inverted(const rcti &area, float center_x, float center_y, float sine, float cosine, rcti &r_bounds)
static void get_area_rotation_bounds(const rcti &area, float center_x, float center_y, float sine, float cosine, rcti &r_bounds)
static void get_rotation_canvas(const rcti &input_canvas, float sine, float cosine, rcti &r_canvas)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
static void get_rotation_center(const rcti &area, float &r_x, float &r_y)
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float3 ceil(const float3 a)
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