[Bf-blender-cvs] [53d588a9d97] compositor-full-frame: Compositor: Full frame input nodes
Manuel Castilla
noreply at git.blender.org
Mon Aug 2 23:12:18 CEST 2021
Commit: 53d588a9d979a0e8361756895a58c8c460dea6d5
Author: Manuel Castilla
Date: Fri Jul 30 12:39:15 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB53d588a9d979a0e8361756895a58c8c460dea6d5
Compositor: Full frame input nodes
Adds full frame implementation to "Bokeh Image" node, "Track Position"
node and `SetVectorOperation`.
The other nodes in "Input" submenu are implemented separately.
No functional changes.
---
Note:
These nodes are very similar to already reviewed nodes. The patch
is meant for a quick look before committing.
Differential Revision: https://developer.blender.org/D12090
===================================================================
M source/blender/compositor/operations/COM_BokehImageOperation.cc
M source/blender/compositor/operations/COM_BokehImageOperation.h
M source/blender/compositor/operations/COM_SetVectorOperation.cc
M source/blender/compositor/operations/COM_SetVectorOperation.h
M source/blender/compositor/operations/COM_TrackPositionOperation.cc
M source/blender/compositor/operations/COM_TrackPositionOperation.h
===================================================================
diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.cc b/source/blender/compositor/operations/COM_BokehImageOperation.cc
index 63f283b6acc..bd5b25b5af8 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.cc
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.cc
@@ -110,6 +110,31 @@ void BokehImageOperation::executePixelSampled(float output[4],
output[3] = (insideBokehMax + insideBokehMed + insideBokehMin) / 3.0f;
}
+void BokehImageOperation::update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ const float shift = this->m_data->lensshift;
+ const float shift2 = shift / 2.0f;
+ const float distance = this->m_circularDistance;
+ for (BuffersIterator<float> it = output->iterate_with({}, area); !it.is_end(); ++it) {
+ const float insideBokehMax = isInsideBokeh(distance, it.x, it.y);
+ const float insideBokehMed = isInsideBokeh(distance - fabsf(shift2 * distance), it.x, it.y);
+ const float insideBokehMin = isInsideBokeh(distance - fabsf(shift * distance), it.x, it.y);
+ if (shift < 0) {
+ it.out[0] = insideBokehMax;
+ it.out[1] = insideBokehMed;
+ it.out[2] = insideBokehMin;
+ }
+ else {
+ it.out[0] = insideBokehMin;
+ it.out[1] = insideBokehMed;
+ it.out[2] = insideBokehMax;
+ }
+ it.out[3] = (insideBokehMax + insideBokehMed + insideBokehMin) / 3.0f;
+ }
+}
+
void BokehImageOperation::deinitExecution()
{
if (this->m_deleteData) {
diff --git a/source/blender/compositor/operations/COM_BokehImageOperation.h b/source/blender/compositor/operations/COM_BokehImageOperation.h
index 2e0bc8a34dc..2527233fabd 100644
--- a/source/blender/compositor/operations/COM_BokehImageOperation.h
+++ b/source/blender/compositor/operations/COM_BokehImageOperation.h
@@ -18,7 +18,7 @@
#pragma once
-#include "COM_NodeOperation.h"
+#include "COM_MultiThreadedOperation.h"
namespace blender::compositor {
@@ -49,7 +49,7 @@ namespace blender::compositor {
* With a simple compare it can be detected if the evaluated pixel is between the outer and inner
*edge.
*/
-class BokehImageOperation : public NodeOperation {
+class BokehImageOperation : public MultiThreadedOperation {
private:
/**
* \brief Settings of the bokeh image
@@ -151,6 +151,10 @@ class BokehImageOperation : public NodeOperation {
{
this->m_deleteData = true;
}
+
+ void update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> inputs) override;
};
} // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.cc b/source/blender/compositor/operations/COM_SetVectorOperation.cc
index 7b8cf44048c..29350cc1ef0 100644
--- a/source/blender/compositor/operations/COM_SetVectorOperation.cc
+++ b/source/blender/compositor/operations/COM_SetVectorOperation.cc
@@ -25,6 +25,7 @@ SetVectorOperation::SetVectorOperation()
{
this->addOutputSocket(DataType::Vector);
flags.is_set_operation = true;
+ flags.is_fullframe_operation = true;
}
void SetVectorOperation::executePixelSampled(float output[4],
@@ -44,4 +45,13 @@ void SetVectorOperation::determineResolution(unsigned int resolution[2],
resolution[1] = preferredResolution[1];
}
+void SetVectorOperation::update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ BLI_assert(output->is_a_single_elem());
+ float *out_elem = output->get_elem(area.xmin, area.ymin);
+ copy_v3_v3(out_elem, get_constant_elem());
+}
+
} // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_SetVectorOperation.h b/source/blender/compositor/operations/COM_SetVectorOperation.h
index 41fd06659d6..b1fcb20f3a9 100644
--- a/source/blender/compositor/operations/COM_SetVectorOperation.h
+++ b/source/blender/compositor/operations/COM_SetVectorOperation.h
@@ -93,6 +93,10 @@ class SetVectorOperation : public ConstantOperation {
setY(vector[1]);
setZ(vector[2]);
}
+
+ void update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> inputs) override;
};
} // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cc b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
index 993410e3e84..1d24cba0a97 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.cc
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
@@ -42,6 +42,8 @@ TrackPositionOperation::TrackPositionOperation()
this->m_relativeFrame = 0;
this->m_speed_output = false;
flags.is_set_operation = true;
+ flags.is_fullframe_operation = true;
+ flags.can_be_constant = true;
}
void TrackPositionOperation::initExecution()
@@ -131,6 +133,23 @@ void TrackPositionOperation::executePixelSampled(float output[4],
}
}
+void TrackPositionOperation::update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ /* Should always be folded into a constant operation because there are no inputs and
+ * can_be_constant flag is enabled. */
+ BLI_assert(BLI_rcti_size_x(&area) == 1 && BLI_rcti_size_y(&area) == 1);
+ float *out = output->get_elem(area.xmin, area.ymin);
+ out[0] = this->m_markerPos[this->m_axis] - this->m_relativePos[this->m_axis];
+ if (this->m_axis == 0) {
+ out[0] *= this->m_width;
+ }
+ else {
+ out[0] *= this->m_height;
+ }
+}
+
void TrackPositionOperation::determineResolution(unsigned int resolution[2],
unsigned int preferredResolution[2])
{
diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h
index b0b0a123bd6..6916b5cbbff 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.h
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h
@@ -93,6 +93,10 @@ class TrackPositionOperation : public NodeOperation {
void initExecution() override;
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler) override;
+
+ void update_memory_buffer(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> inputs) override;
};
} // namespace blender::compositor
More information about the Bf-blender-cvs
mailing list