Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/compositor/operations/COM_VectorBlurOperation.cc')
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cc b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
index df65044afc1..5405e6d424a 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.cc
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
@@ -57,6 +57,7 @@ VectorBlurOperation::VectorBlurOperation()
this->m_inputSpeedProgram = nullptr;
this->m_inputZProgram = nullptr;
flags.complex = true;
+ flags.is_fullframe_operation = true;
}
void VectorBlurOperation::initExecution()
{
@@ -121,6 +122,51 @@ bool VectorBlurOperation::determineDependingAreaOfInterest(rcti * /*input*/,
return false;
}
+void VectorBlurOperation::get_area_of_interest(const int UNUSED(input_idx),
+ const rcti &UNUSED(output_area),
+ rcti &r_input_area)
+{
+ r_input_area.xmin = 0;
+ r_input_area.xmax = this->getWidth();
+ r_input_area.ymin = 0;
+ r_input_area.ymax = this->getHeight();
+}
+
+void VectorBlurOperation::update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> inputs)
+{
+ /* TODO(manzanilla): once tiled implementation is removed, run multi-threaded where possible. */
+ if (!m_cachedInstance) {
+ MemoryBuffer *image = inputs[IMAGE_INPUT_INDEX];
+ const bool is_image_inflated = image->is_a_single_elem();
+ image = is_image_inflated ? image->inflate() : image;
+
+ /* Must be a copy because it's modified in #generateVectorBlur. */
+ MemoryBuffer *speed = inputs[SPEED_INPUT_INDEX];
+ speed = speed->is_a_single_elem() ? speed->inflate() : new MemoryBuffer(*speed);
+
+ MemoryBuffer *z = inputs[Z_INPUT_INDEX];
+ const bool is_z_inflated = z->is_a_single_elem();
+ z = is_z_inflated ? z->inflate() : z;
+
+ m_cachedInstance = (float *)MEM_dupallocN(image->getBuffer());
+ this->generateVectorBlur(m_cachedInstance, image, speed, z);
+
+ if (is_image_inflated) {
+ delete image;
+ }
+ delete speed;
+ if (is_z_inflated) {
+ delete z;
+ }
+ }
+
+ const int num_channels = COM_data_type_num_channels(getOutputSocket()->getDataType());
+ MemoryBuffer buf(m_cachedInstance, num_channels, this->getWidth(), this->getHeight());
+ output->copy_from(&buf, area);
+}
+
void VectorBlurOperation::generateVectorBlur(float *data,
MemoryBuffer *inputImage,
MemoryBuffer *inputSpeed,