[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