Compositor: Full frame Mask node

Adds full frame implementation to this node operations.
No functional changes.

Reviewed By: jbakker

Differential Revision: https://developer.blender.org/D11751
This commit is contained in:
Manuel Castilla 2021-08-10 15:24:17 +02:00
parent 079f35572b
commit 5deb3229a0
2 changed files with 46 additions and 2 deletions

View File

@ -161,4 +161,41 @@ void MaskOperation::executePixelSampled(float output[4],
}
}
void MaskOperation::update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> UNUSED(inputs))
{
Vector<MaskRasterHandle *> handles = get_non_null_handles();
if (handles.size() == 0) {
output->fill(area, COM_VALUE_ZERO);
return;
}
float xy[2];
for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
xy[0] = it.x * m_maskWidthInv + m_mask_px_ofs[0];
xy[1] = it.y * m_maskHeightInv + m_mask_px_ofs[1];
*it.out = 0.0f;
for (MaskRasterHandle *handle : handles) {
*it.out += BKE_maskrasterize_handle_sample(handle, xy);
}
/* Until we get better falloff. */
*it.out /= m_rasterMaskHandleTot;
}
}
Vector<MaskRasterHandle *> MaskOperation::get_non_null_handles() const
{
Vector<MaskRasterHandle *> handles;
for (int i = 0; i < m_rasterMaskHandleTot; i++) {
MaskRasterHandle *handle = m_rasterMaskHandles[i];
if (handle == nullptr) {
continue;
}
handles.append(handle);
}
return handles;
}
} // namespace blender::compositor

View File

@ -19,7 +19,7 @@
#pragma once
#include "BLI_listbase.h"
#include "COM_NodeOperation.h"
#include "COM_MultiThreadedOperation.h"
#include "DNA_mask_types.h"
#include "IMB_imbuf_types.h"
@ -31,7 +31,7 @@ namespace blender::compositor {
/**
* Class with implementation of mask rasterization
*/
class MaskOperation : public NodeOperation {
class MaskOperation : public MultiThreadedOperation {
protected:
Mask *m_mask;
@ -98,6 +98,13 @@ class MaskOperation : public NodeOperation {
}
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
void update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> inputs) override;
private:
Vector<MaskRasterHandle *> get_non_null_handles() const;
};
} // namespace blender::compositor