15 nearest_neighbour_ =
false;
31bool MapUVOperation::read_uv(
float x,
float y,
float &r_u,
float &r_v,
float &r_alpha)
41 uv_input_read_fn_(x, y,
vector);
42 r_u =
vector[0] * image_width_;
43 r_v =
vector[1] * image_height_;
56 read_uv(
xy[0],
xy[1], r_uv[0], r_uv[1], r_alpha);
59 const float epsilon[2] = {1.0f, 1.0f};
65 if (read_uv(
xy[0] + epsilon[0],
xy[1], uv[0], uv[1], alpha)) {
66 r_deriv[0][0] += uv[0] - r_uv[0];
67 r_deriv[1][0] += uv[1] - r_uv[1];
70 if (read_uv(
xy[0] - epsilon[0],
xy[1], uv[0], uv[1], alpha)) {
71 r_deriv[0][0] += r_uv[0] - uv[0];
72 r_deriv[1][0] += r_uv[1] - uv[1];
76 float numinv = 1.0f /
float(num);
77 r_deriv[0][0] *= numinv;
78 r_deriv[1][0] *= numinv;
82 if (read_uv(
xy[0],
xy[1] + epsilon[1], uv[0], uv[1], alpha)) {
83 r_deriv[0][1] += uv[0] - r_uv[0];
84 r_deriv[1][1] += uv[1] - r_uv[1];
87 if (read_uv(
xy[0],
xy[1] - epsilon[1], uv[0], uv[1], alpha)) {
88 r_deriv[0][1] += r_uv[0] - uv[0];
89 r_deriv[1][1] += r_uv[1] - uv[1];
93 float numinv = 1.0f /
float(num);
94 r_deriv[0][1] *= numinv;
95 r_deriv[1][1] *= numinv;
100 const rcti &output_area,
104 case IMAGE_INPUT_INDEX: {
108 case UV_INPUT_INDEX: {
109 r_input_area = output_area;
121 uv_input_read_fn_ = [=](
float x,
float y,
float *out) {
130 const MemoryBuffer *input_image = inputs[IMAGE_INPUT_INDEX];
142 if (nearest_neighbour_) {
150 const float threshold = alpha_ * 0.05f;
155 const float du =
len_v2(deriv[0]);
156 const float dv =
len_v2(deriv[1]);
157 const float factor = 1.0f - threshold * (du / image_width_ + dv / image_height_);
MINLINE void mul_v4_fl(float r[4], float f)
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v4(float r[4])
MINLINE void zero_v2(float r[2])
void init_data() override
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.
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void pixel_transform(const float xy[2], float r_uv[2], float r_deriv[2][2], float &r_alpha)
a MemoryBuffer contains access to the data
void read_elem_bilinear(float x, float y, float *out) const
void read_elem_filtered(float x, float y, float dx[2], float dy[2], bool extend_boundary, float *out) const
void read_elem_sampled(float x, float y, PixelSampler sampler, float *out) const
NodeOperation contains calculation logic.
unsigned int get_height() const
void add_output_socket(DataType datatype)
unsigned int get_width() const
NodeOperationFlags flags_
const rcti & get_canvas() const
NodeOperation * get_input_operation(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
draw_view in_light_buf[] float
@ Vector
Vector data type.
void expand_area_for_sampler(rcti &area, PixelSampler sampler)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator