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:
authorManuel Castilla <manzanillawork@gmail.com>2021-08-13 03:01:25 +0300
committerManuel Castilla <manzanillawork@gmail.com>2021-08-13 03:14:29 +0300
commit1747c679ee5fc1189c7d3266768c594a0a46e3bc (patch)
tree97438fdc9c4e99e7596233ed159a5e504e238c3a /source/blender
parenteb05b26a69c44887b4e6b43a3c55998fbce31708 (diff)
Compositor: Full frame Vector blur node
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.cc46
-rw-r--r--source/blender/compositor/operations/COM_VectorBlurOperation.h11
2 files changed, 57 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.cc b/source/blender/compositor/operations/COM_VectorBlurOperation.cc
index b5b5d426338..18df6f974b3 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,
diff --git a/source/blender/compositor/operations/COM_VectorBlurOperation.h b/source/blender/compositor/operations/COM_VectorBlurOperation.h
index dfcf1fb16f7..c30c150db3c 100644
--- a/source/blender/compositor/operations/COM_VectorBlurOperation.h
+++ b/source/blender/compositor/operations/COM_VectorBlurOperation.h
@@ -26,6 +26,10 @@ namespace blender::compositor {
class VectorBlurOperation : public NodeOperation, public QualityStepHelper {
private:
+ static constexpr int IMAGE_INPUT_INDEX = 0;
+ static constexpr int Z_INPUT_INDEX = 1;
+ static constexpr int SPEED_INPUT_INDEX = 2;
+
/**
* \brief Cached reference to the inputProgram
*/
@@ -68,6 +72,13 @@ class VectorBlurOperation : public NodeOperation, public QualityStepHelper {
ReadBufferOperation *readOperation,
rcti *output) override;
+ void get_area_of_interest(const int input_idx,
+ const rcti &output_area,
+ rcti &r_input_area) override;
+ void update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> inputs) override;
+
protected:
void generateVectorBlur(float *data,
MemoryBuffer *inputImage,