[Bf-blender-cvs] [0b87a846a85] compositor-full-frame: Compositor: Full frame Normalize node

Manuel Castilla noreply at git.blender.org
Mon Aug 16 19:43:43 CEST 2021


Commit: 0b87a846a85269b45bb332def46b3c34731cb91a
Author: Manuel Castilla
Date:   Mon Aug 16 18:16:33 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB0b87a846a85269b45bb332def46b3c34731cb91a

Compositor: Full frame Normalize node

===================================================================

M	source/blender/compositor/operations/COM_NormalizeOperation.cc
M	source/blender/compositor/operations/COM_NormalizeOperation.h

===================================================================

diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.cc b/source/blender/compositor/operations/COM_NormalizeOperation.cc
index f93afcaab95..841b45d2786 100644
--- a/source/blender/compositor/operations/COM_NormalizeOperation.cc
+++ b/source/blender/compositor/operations/COM_NormalizeOperation.cc
@@ -56,6 +56,7 @@ void NormalizeOperation::deinitExecution()
 {
   this->m_imageReader = nullptr;
   delete this->m_cachedInstance;
+  m_cachedInstance = nullptr;
   NodeOperation::deinitMutex();
 }
 
@@ -127,4 +128,60 @@ void NormalizeOperation::deinitializeTileData(rcti * /*rect*/, void * /*data*/)
   /* pass */
 }
 
+void NormalizeOperation::get_area_of_interest(const int UNUSED(input_idx),
+                                              const rcti &UNUSED(output_area),
+                                              rcti &r_input_area)
+{
+  NodeOperation *input = get_input_operation(0);
+  r_input_area.xmin = 0;
+  r_input_area.xmax = input->getWidth();
+  r_input_area.ymin = 0;
+  r_input_area.ymax = input->getHeight();
+}
+
+void NormalizeOperation::update_memory_buffer_started(MemoryBuffer *UNUSED(output),
+                                                      const rcti &UNUSED(area),
+                                                      Span<MemoryBuffer *> inputs)
+{
+  if (m_cachedInstance == nullptr) {
+    MemoryBuffer *input = inputs[0];
+
+    /* Using generic two floats struct to store `x: min`, `y: multiply`. */
+    NodeTwoFloats *minmult = new NodeTwoFloats();
+
+    float minv = 1.0f + BLENDER_ZMAX;
+    float maxv = -1.0f - BLENDER_ZMAX;
+    for (const float *elem : input->as_range()) {
+      const float value = *elem;
+      if ((value > maxv) && (value <= BLENDER_ZMAX)) {
+        maxv = value;
+      }
+      if ((value < minv) && (value >= -BLENDER_ZMAX)) {
+        minv = value;
+      }
+    }
+
+    minmult->x = minv;
+    /* The case of a flat buffer would cause a divide by 0. */
+    minmult->y = ((maxv != minv) ? 1.0f / (maxv - minv) : 0.0f);
+
+    m_cachedInstance = minmult;
+  }
+}
+
+void NormalizeOperation::update_memory_buffer_partial(MemoryBuffer *output,
+                                                      const rcti &area,
+                                                      Span<MemoryBuffer *> inputs)
+{
+  NodeTwoFloats *minmult = m_cachedInstance;
+  for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
+    const float input_value = *it.in(0);
+
+    *it.out = (input_value - minmult->x) * minmult->y;
+
+    /* Clamp infinities. */
+    CLAMP(*it.out, 0.0f, 1.0f);
+  }
+}
+
 }  // namespace blender::compositor
diff --git a/source/blender/compositor/operations/COM_NormalizeOperation.h b/source/blender/compositor/operations/COM_NormalizeOperation.h
index c89ba372189..7af2aad8a88 100644
--- a/source/blender/compositor/operations/COM_NormalizeOperation.h
+++ b/source/blender/compositor/operations/COM_NormalizeOperation.h
@@ -18,7 +18,7 @@
 
 #pragma once
 
-#include "COM_NodeOperation.h"
+#include "COM_MultiThreadedOperation.h"
 #include "DNA_node_types.h"
 
 namespace blender::compositor {
@@ -27,7 +27,7 @@ namespace blender::compositor {
  * \brief base class of normalize, implementing the simple normalize
  * \ingroup operation
  */
-class NormalizeOperation : public NodeOperation {
+class NormalizeOperation : public MultiThreadedOperation {
  protected:
   /**
    * \brief Cached reference to the reader
@@ -64,6 +64,14 @@ class NormalizeOperation : public NodeOperation {
   bool determineDependingAreaOfInterest(rcti *input,
                                         ReadBufferOperation *readOperation,
                                         rcti *output) override;
+
+  void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override;
+  void update_memory_buffer_started(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
+  void update_memory_buffer_partial(MemoryBuffer *output,
+                                    const rcti &area,
+                                    Span<MemoryBuffer *> inputs) override;
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list