[Bf-blender-cvs] [28502f22398] compositor-full-frame: Make Track Position a constant operation

Manuel Castilla noreply at git.blender.org
Mon Aug 2 23:12:20 CEST 2021


Commit: 28502f2239838576713098a9c1b3d5a8a49dbdb5
Author: Manuel Castilla
Date:   Mon Aug 2 17:45:26 2021 +0200
Branches: compositor-full-frame
https://developer.blender.org/rB28502f2239838576713098a9c1b3d5a8a49dbdb5

Make Track Position a constant operation

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

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

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

diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cc b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
index 1d24cba0a97..0f4be16a620 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.cc
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cc
@@ -42,16 +42,24 @@ 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;
+  is_track_position_calculated_ = false;
 }
 
 void TrackPositionOperation::initExecution()
 {
+  if (!is_track_position_calculated_) {
+    calc_track_position();
+  }
+}
+
+void TrackPositionOperation::calc_track_position()
+{
+  is_track_position_calculated_ = true;
   MovieTracking *tracking = nullptr;
   MovieClipUser user = {0};
   MovieTrackingObject *object;
 
+  track_position_ = 0;
   zero_v2(this->m_markerPos);
   zero_v2(this->m_relativePos);
 
@@ -116,6 +124,14 @@ void TrackPositionOperation::initExecution()
       }
     }
   }
+
+  track_position_ = this->m_markerPos[this->m_axis] - this->m_relativePos[this->m_axis];
+  if (this->m_axis == 0) {
+    track_position_ *= this->m_width;
+  }
+  else {
+    track_position_ *= this->m_height;
+  }
 }
 
 void TrackPositionOperation::executePixelSampled(float output[4],
@@ -133,21 +149,12 @@ void TrackPositionOperation::executePixelSampled(float output[4],
   }
 }
 
-void TrackPositionOperation::update_memory_buffer(MemoryBuffer *output,
-                                                  const rcti &area,
-                                                  Span<MemoryBuffer *> UNUSED(inputs))
+const float *TrackPositionOperation::get_constant_elem()
 {
-  /* 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;
+  if (!is_track_position_calculated_) {
+    calc_track_position();
   }
+  return &track_position_;
 }
 
 void TrackPositionOperation::determineResolution(unsigned int resolution[2],
diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h
index 6916b5cbbff..f716bd97737 100644
--- a/source/blender/compositor/operations/COM_TrackPositionOperation.h
+++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h
@@ -20,7 +20,7 @@
 
 #include <string.h>
 
-#include "COM_NodeOperation.h"
+#include "COM_ConstantOperation.h"
 
 #include "DNA_movieclip_types.h"
 #include "DNA_tracking_types.h"
@@ -33,7 +33,7 @@ namespace blender::compositor {
 /**
  * Class with implementation of green screen gradient rasterization
  */
-class TrackPositionOperation : public NodeOperation {
+class TrackPositionOperation : public ConstantOperation {
  protected:
   MovieClip *m_movieClip;
   int m_framenumber;
@@ -47,6 +47,8 @@ class TrackPositionOperation : public NodeOperation {
   int m_width, m_height;
   float m_markerPos[2];
   float m_relativePos[2];
+  float track_position_;
+  bool is_track_position_calculated_;
 
   /**
    * Determine the output resolution. The resolution is retrieved from the Renderer
@@ -94,9 +96,10 @@ class TrackPositionOperation : public NodeOperation {
 
   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;
+  const float *get_constant_elem() override;
+
+ private:
+  void calc_track_position();
 };
 
 }  // namespace blender::compositor



More information about the Bf-blender-cvs mailing list