[Bf-blender-cvs] [25b95e277f2] viewport-compositor: Viewport Compositor: Port Time node

Omar Emara noreply at git.blender.org
Tue Dec 28 20:02:46 CET 2021


Commit: 25b95e277f24f087d76bcf405f98341aee4c306d
Author: Omar Emara
Date:   Thu Nov 18 10:51:22 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB25b95e277f24f087d76bcf405f98341aee4c306d

Viewport Compositor: Port Time node

This patch ports the Time node to the viewport compositor. The current
frame number was added to the View UBO in order to be accessed by the
shader.

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

M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/shaders/common_view_lib.glsl
M	source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
M	source/blender/nodes/composite/nodes/node_composite_curves.cc

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

diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index de7c39e762d..4718064b9fe 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -413,6 +413,10 @@ typedef struct DRWViewUboStorage {
   float viewcamtexcofac[4];
   float viewport_size[2];
   float viewport_size_inv[2];
+
+  float frame_number;
+
+  float _pad[3];
 } DRWViewUboStorage;
 
 BLI_STATIC_ASSERT_ALIGN(DRWViewUboStorage, 16)
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 53ac49ac54b..d121adf226b 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1084,6 +1084,8 @@ static void drw_update_view(const float viewport_size[2])
   copy_v2_v2(storage->viewport_size_inv, viewport_size);
   invert_v2(storage->viewport_size_inv);
 
+  storage->frame_number = (float)DST.draw_ctx.scene->r.cfra;
+
   /* TODO(fclem): update a big UBO and only bind ranges here. */
   GPU_uniformbuf_update(G_draw.view_ubo, &DST.view_active->storage);
 
diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl
index 1e64a43349b..25ee02a1a60 100644
--- a/source/blender/draw/intern/shaders/common_view_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_view_lib.glsl
@@ -22,6 +22,10 @@ layout(std140) uniform viewBlock
   vec4 CameraTexCoFactors;
   vec2 ViewportSize;
   vec2 ViewportSizeInverse;
+
+  float FrameNumber;
+
+  float ViewBlockPad1, ViewBlockPad2, ViewBlockPad3;
 };
 
 #define ViewNear (ViewVecs[0].w)
diff --git a/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
index cb2d1e1977a..80074b440a9 100644
--- a/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
+++ b/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
@@ -203,3 +203,25 @@ void curves_vector_mixed(float factor,
       vector, curve_map, layer, range_minimums, range_dividers, start_slopes, end_slopes, result);
   result = mix(vector, result, factor);
 }
+
+void curves_time(sampler1DArray curve_map,
+                 float layer,
+                 float range_minimum,
+                 float range_divider,
+                 float start_slope,
+                 float end_slope,
+                 float start_frame,
+                 float end_frame,
+                 out float result)
+{
+  float normalized_time = (FrameNumber - start_frame) / (end_frame - start_frame);
+
+  /* Evaluate the normalized time on the first curve map. */
+  float parameter = NORMALIZE_PARAMETER(normalized_time, range_minimum, range_divider);
+  result = texture(curve_map, vec2(parameter, layer)).x;
+
+  /* Then, extrapolate if needed. */
+  result = extrapolate_if_needed(parameter, result, start_slope, end_slope);
+
+  result = clamp(result, 0.0, 1.0);
+}
diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.cc b/source/blender/nodes/composite/nodes/node_composite_curves.cc
index fecee2ba136..5a97594c583 100644
--- a/source/blender/nodes/composite/nodes/node_composite_curves.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.cc
@@ -42,6 +42,47 @@ 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);
 }
 
+static int node_composite_gpu_curve_time(GPUMaterial *mat,
+                                         bNode *node,
+                                         bNodeExecData *UNUSED(execdata),
+                                         GPUNodeStack *in,
+                                         GPUNodeStack *out)
+{
+  CurveMapping *curve_mapping = (CurveMapping *)node->storage;
+
+  BKE_curvemapping_init(curve_mapping);
+  float *band_values;
+  int band_size;
+  BKE_curvemapping_table_RGBA(curve_mapping, &band_values, &band_size);
+  float band_layer;
+  GPUNodeLink *band_texture = GPU_color_band(mat, band_size, band_values, &band_layer);
+
+  float start_slopes[CM_TOT];
+  float end_slopes[CM_TOT];
+  BKE_curvemapping_compute_slopes(curve_mapping, start_slopes, end_slopes);
+  float range_minimums[CM_TOT];
+  BKE_curvemapping_get_range_minimums(curve_mapping, range_minimums);
+  float range_dividers[CM_TOT];
+  BKE_curvemapping_compute_range_dividers(curve_mapping, range_dividers);
+
+  const float start_frame = (float)node->custom1;
+  const float end_frame = (float)node->custom2;
+
+  return GPU_stack_link(mat,
+                        node,
+                        "curves_time",
+                        in,
+                        out,
+                        band_texture,
+                        GPU_constant(&band_layer),
+                        GPU_uniform(range_minimums),
+                        GPU_uniform(range_dividers),
+                        GPU_uniform(start_slopes),
+                        GPU_uniform(end_slopes),
+                        GPU_uniform(&start_frame),
+                        GPU_uniform(&end_frame));
+}
+
 void register_node_type_cmp_curve_time(void)
 {
   static bNodeType ntype;
@@ -51,6 +92,7 @@ void register_node_type_cmp_curve_time(void)
   node_type_size(&ntype, 140, 100, 320);
   node_type_init(&ntype, node_composit_init_curves_time);
   node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+  node_type_gpu(&ntype, node_composite_gpu_curve_time);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list