Changeset View
Changeset View
Standalone View
Standalone View
source/blender/compositor/operations/COM_MapUVOperation.cc
| Show All 17 Lines | |||||
| #include "COM_MapUVOperation.h" | #include "COM_MapUVOperation.h" | ||||
| #include "BLI_math.h" | #include "BLI_math.h" | ||||
| namespace blender::compositor { | namespace blender::compositor { | ||||
| MapUVOperation::MapUVOperation() | MapUVOperation::MapUVOperation() | ||||
| { | { | ||||
| this->addInputSocket(DataType::Color, ResizeMode::None); | this->addInputSocket(DataType::Color, ResizeMode::Align); | ||||
| this->addInputSocket(DataType::Vector); | this->addInputSocket(DataType::Vector); | ||||
| this->addOutputSocket(DataType::Color); | this->addOutputSocket(DataType::Color); | ||||
| this->m_alpha = 0.0f; | this->m_alpha = 0.0f; | ||||
| this->flags.complex = true; | this->flags.complex = true; | ||||
| setResolutionInputSocketIndex(1); | set_canvas_input_index(UV_INPUT_INDEX); | ||||
| this->m_inputUVProgram = nullptr; | this->m_inputUVProgram = nullptr; | ||||
| this->m_inputColorProgram = nullptr; | this->m_inputColorProgram = nullptr; | ||||
| } | } | ||||
| void MapUVOperation::init_data() | void MapUVOperation::init_data() | ||||
| { | { | ||||
| NodeOperation *image_input = get_input_operation(0); | NodeOperation *image_input = get_input_operation(IMAGE_INPUT_INDEX); | ||||
| image_width_ = image_input->getWidth(); | image_width_ = image_input->getWidth(); | ||||
| image_height_ = image_input->getHeight(); | image_height_ = image_input->getHeight(); | ||||
| NodeOperation *uv_input = get_input_operation(1); | NodeOperation *uv_input = get_input_operation(UV_INPUT_INDEX); | ||||
| uv_width_ = uv_input->getWidth(); | uv_width_ = uv_input->getWidth(); | ||||
| uv_height_ = uv_input->getHeight(); | uv_height_ = uv_input->getHeight(); | ||||
| } | } | ||||
| void MapUVOperation::initExecution() | void MapUVOperation::initExecution() | ||||
| { | { | ||||
| this->m_inputColorProgram = this->getInputSocketReader(0); | this->m_inputColorProgram = this->getInputSocketReader(0); | ||||
| this->m_inputUVProgram = this->getInputSocketReader(1); | this->m_inputUVProgram = this->getInputSocketReader(1); | ||||
| ▲ Show 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | bool MapUVOperation::determineDependingAreaOfInterest(rcti *input, | ||||
| return false; | return false; | ||||
| } | } | ||||
| void MapUVOperation::get_area_of_interest(const int input_idx, | void MapUVOperation::get_area_of_interest(const int input_idx, | ||||
| const rcti &output_area, | const rcti &output_area, | ||||
| rcti &r_input_area) | rcti &r_input_area) | ||||
| { | { | ||||
| switch (input_idx) { | switch (input_idx) { | ||||
| case 0: { | case IMAGE_INPUT_INDEX: { | ||||
| r_input_area.xmin = 0; | r_input_area = get_input_operation(IMAGE_INPUT_INDEX)->get_canvas(); | ||||
| r_input_area.xmax = image_width_; | |||||
| r_input_area.ymin = 0; | |||||
| r_input_area.ymax = image_height_; | |||||
| break; | break; | ||||
| } | } | ||||
| case 1: { | case UV_INPUT_INDEX: { | ||||
| r_input_area = output_area; | r_input_area = output_area; | ||||
| expand_area_for_sampler(r_input_area, PixelSampler::Bilinear); | expand_area_for_sampler(r_input_area, PixelSampler::Bilinear); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void MapUVOperation::update_memory_buffer_started(MemoryBuffer *UNUSED(output), | void MapUVOperation::update_memory_buffer_started(MemoryBuffer *UNUSED(output), | ||||
| const rcti &UNUSED(area), | const rcti &UNUSED(area), | ||||
| Span<MemoryBuffer *> inputs) | Span<MemoryBuffer *> inputs) | ||||
| { | { | ||||
| const MemoryBuffer *uv_input = inputs[1]; | const MemoryBuffer *uv_input = inputs[UV_INPUT_INDEX]; | ||||
| uv_input_read_fn_ = [=](float x, float y, float *out) { | uv_input_read_fn_ = [=](float x, float y, float *out) { | ||||
| uv_input->read_elem_bilinear(x, y, out); | uv_input->read_elem_bilinear(x, y, out); | ||||
| }; | }; | ||||
| } | } | ||||
| void MapUVOperation::update_memory_buffer_partial(MemoryBuffer *output, | void MapUVOperation::update_memory_buffer_partial(MemoryBuffer *output, | ||||
| const rcti &area, | const rcti &area, | ||||
| Span<MemoryBuffer *> inputs) | Span<MemoryBuffer *> inputs) | ||||
| { | { | ||||
| const MemoryBuffer *input_image = inputs[0]; | const MemoryBuffer *input_image = inputs[IMAGE_INPUT_INDEX]; | ||||
| for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) { | for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) { | ||||
| float xy[2] = {(float)it.x, (float)it.y}; | float xy[2] = {(float)it.x, (float)it.y}; | ||||
| float uv[2]; | float uv[2]; | ||||
| float deriv[2][2]; | float deriv[2][2]; | ||||
| float alpha; | float alpha; | ||||
| pixelTransform(xy, uv, deriv, alpha); | pixelTransform(xy, uv, deriv, alpha); | ||||
| if (alpha == 0.0f) { | if (alpha == 0.0f) { | ||||
| zero_v4(it.out); | zero_v4(it.out); | ||||
| Show All 29 Lines | |||||