[Bf-blender-cvs] [a05431df882] temp-viewport-compositor-compiler: Viewport Compositor: Implement Time Curve node

Omar Emara noreply at git.blender.org
Wed Mar 30 16:55:16 CEST 2022


Commit: a05431df882d3a84118954b91dec519715d1d233
Author: Omar Emara
Date:   Wed Mar 30 15:59:42 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rBa05431df882d3a84118954b91dec519715d1d233

Viewport Compositor: Implement Time Curve node

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

M	source/blender/draw/engines/compositor/compositor_engine.cc
M	source/blender/nodes/NOD_compositor_execute.hh
M	source/blender/nodes/composite/nodes/node_composite_curves.cc

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

diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc
index bfdf8ed3147..8211f90fef9 100644
--- a/source/blender/draw/engines/compositor/compositor_engine.cc
+++ b/source/blender/draw/engines/compositor/compositor_engine.cc
@@ -43,9 +43,20 @@ class DRWTexturePool : public TexturePool {
   }
 };
 
+static const Scene *get_context_scene()
+{
+  return DRW_context_state_get()->scene;
+}
+
 class DRWContext : public Context {
  public:
   using Context::Context;
+
+  const Scene *get_scene() override
+  {
+    return get_context_scene();
+  }
+
   GPUTexture *get_viewport_texture() override
   {
     return DRW_viewport_texture_list_get()->color;
@@ -58,17 +69,11 @@ class DRWContext : public Context {
   }
 };
 
-/* Get the scene which includes the compositor node tree. */
-static const Scene *get_scene()
-{
-  return DRW_context_state_get()->scene;
-}
-
 /* It is sufficient to check for the scene node tree because the engine will not be enabled when
  * the viewport shading option is disabled. */
 static bool is_compositor_enabled()
 {
-  const Scene *scene = get_scene();
+  const Scene *scene = get_context_scene();
   if (scene->use_nodes && scene->nodetree) {
     return true;
   }
@@ -86,7 +91,7 @@ static void draw()
 
   DRWTexturePool texture_pool;
   DRWContext context(texture_pool);
-  const Scene *scene = get_scene();
+  const Scene *scene = get_context_scene();
   Evaluator evaluator(context, scene->nodetree);
   evaluator.compile();
   evaluator.evaluate();
diff --git a/source/blender/nodes/NOD_compositor_execute.hh b/source/blender/nodes/NOD_compositor_execute.hh
index 8be94f59caa..1fecad233fc 100644
--- a/source/blender/nodes/NOD_compositor_execute.hh
+++ b/source/blender/nodes/NOD_compositor_execute.hh
@@ -106,6 +106,10 @@ class Context {
 
  public:
   Context(TexturePool &texture_pool);
+
+  /* Get the active compositing scene. */
+  virtual const Scene *get_scene() = 0;
+
   /* Get the texture representing the viewport where the result of the compositor should be
    * written. This should be called by output nodes to get their target texture. */
   virtual GPUTexture *get_viewport_texture() = 0;
diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.cc b/source/blender/nodes/composite/nodes/node_composite_curves.cc
index 2efbc23043e..efdbb2cfae0 100644
--- a/source/blender/nodes/composite/nodes/node_composite_curves.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.cc
@@ -21,6 +21,8 @@
  * \ingroup cmpnodes
  */
 
+#include "BLI_math_base.h"
+
 #include "BKE_colortools.h"
 
 #include "UI_interface.h"
@@ -49,6 +51,60 @@ static void node_composit_init_curves_time(bNodeTree *UNUSED(ntree), bNode *node
   node->storage = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
 }
 
+using namespace blender::viewport_compositor;
+
+class TimeCurveOperation : public NodeOperation {
+ public:
+  using NodeOperation::NodeOperation;
+
+  void execute() override
+  {
+    Result &result = get_result("Fac");
+    result.allocate_single_value();
+
+    CurveMapping *curve_mapping = get_curve_mapping();
+    BKE_curvemapping_init(curve_mapping);
+    const float time = BKE_curvemapping_evaluateF(curve_mapping, 0, compute_normalized_time());
+    result.set_float_value(clamp_f(time, 0.0f, 1.0f));
+  }
+
+  CurveMapping *get_curve_mapping()
+  {
+    return static_cast<CurveMapping *>(node().storage);
+  }
+
+  int get_start_time()
+  {
+    return node().custom1;
+  }
+
+  int get_end_time()
+  {
+    return node().custom2;
+  }
+
+  float compute_normalized_time()
+  {
+    const int frame_number = context().get_scene()->r.cfra;
+    if (frame_number < get_start_time()) {
+      return 0.0f;
+    }
+    if (frame_number > get_end_time()) {
+      return 1.0f;
+    }
+    if (get_start_time() == get_end_time()) {
+      return 0.0f;
+    }
+    return static_cast<float>(frame_number - get_start_time()) /
+           static_cast<float>(get_end_time() - get_start_time());
+  }
+};
+
+static NodeOperation *get_compositor_operation(Context &context, DNode node)
+{
+  return new TimeCurveOperation(context, node);
+}
+
 }  // namespace blender::nodes::node_composite_time_curves_cc
 
 void register_node_type_cmp_curve_time()
@@ -62,6 +118,7 @@ void register_node_type_cmp_curve_time()
   node_type_size(&ntype, 200, 140, 320);
   node_type_init(&ntype, file_ns::node_composit_init_curves_time);
   node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+  ntype.get_compositor_operation = file_ns::get_compositor_operation;
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list