[Bf-blender-cvs] [21b83a7e8c1] viewport-compositor: Viewport Compositor: Port Vector Curves node

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


Commit: 21b83a7e8c1e93c441228ae6b64b33ea8e9e1f01
Author: Omar Emara
Date:   Sat Nov 13 21:16:19 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB21b83a7e8c1e93c441228ae6b64b33ea8e9e1f01

Viewport Compositor: Port Vector Curves node

This patch ports the Vector Curves node to the viewport compositor. A
variant of the existing vector_curves was added to work without mixing
and the inputs were reduced to vec3 because vec4 are superfluous.

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

M	source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
M	source/blender/nodes/composite/nodes/node_composite_curves.cc
M	source/blender/nodes/shader/nodes/node_shader_curves.cc

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

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 d69854fd87c..cb2d1e1977a 100644
--- a/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
+++ b/source/blender/gpu/shaders/common/gpu_shader_common_curves.glsl
@@ -170,24 +170,36 @@ void curves_film_like(float factor,
   result = mix(color, result, factor);
 }
 
-void curves_vector(float factor,
-                   vec3 vector,
+void curves_vector(vec3 vector,
                    sampler1DArray curve_map,
                    const float layer,
-                   vec4 range_minimums,
-                   vec4 range_dividers,
-                   vec4 start_slopes,
-                   vec4 end_slopes,
+                   vec3 range_minimums,
+                   vec3 range_dividers,
+                   vec3 start_slopes,
+                   vec3 end_slopes,
                    out vec3 result)
 {
   /* Evaluate each component on its curve map. */
-  vec3 parameters = NORMALIZE_PARAMETER(vector.xyz, range_minimums.xyz, range_dividers.xyz);
+  vec3 parameters = NORMALIZE_PARAMETER(vector, range_minimums, range_dividers);
   result.x = texture(curve_map, vec2(parameters.x, layer)).x;
   result.y = texture(curve_map, vec2(parameters.y, layer)).y;
   result.z = texture(curve_map, vec2(parameters.z, layer)).z;
 
   /* Then, extrapolate if needed. */
-  result = extrapolate_if_needed(parameters, result, start_slopes.xyz, end_slopes.xyz);
+  result = extrapolate_if_needed(parameters, result, start_slopes, end_slopes);
+}
 
+void curves_vector_mixed(float factor,
+                         vec3 vector,
+                         sampler1DArray curve_map,
+                         const float layer,
+                         vec3 range_minimums,
+                         vec3 range_dividers,
+                         vec3 start_slopes,
+                         vec3 end_slopes,
+                         out vec3 result)
+{
+  curves_vector(
+      vector, curve_map, layer, range_minimums, range_dividers, start_slopes, end_slopes, result);
   result = mix(vector, result, factor);
 }
diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.cc b/source/blender/nodes/composite/nodes/node_composite_curves.cc
index bf1880b6214..fecee2ba136 100644
--- a/source/blender/nodes/composite/nodes/node_composite_curves.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.cc
@@ -71,6 +71,42 @@ static void node_composit_init_curve_vec(bNodeTree *UNUSED(ntree), bNode *node)
   node->storage = BKE_curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
 }
 
+static int node_composite_gpu_curve_vec(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);
+
+  return GPU_stack_link(mat,
+                        node,
+                        "curves_vector",
+                        in,
+                        out,
+                        band_texture,
+                        GPU_constant(&band_layer),
+                        GPU_uniform(range_minimums),
+                        GPU_uniform(range_dividers),
+                        GPU_uniform(start_slopes),
+                        GPU_uniform(end_slopes));
+}
+
 void register_node_type_cmp_curve_vec(void)
 {
   static bNodeType ntype;
@@ -80,6 +116,7 @@ void register_node_type_cmp_curve_vec(void)
   node_type_size(&ntype, 200, 140, 320);
   node_type_init(&ntype, node_composit_init_curve_vec);
   node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+  node_type_gpu(&ntype, node_composite_gpu_curve_vec);
 
   nodeRegisterType(&ntype);
 }
diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.cc b/source/blender/nodes/shader/nodes/node_shader_curves.cc
index 3c286b53c64..c2b8b78d55a 100644
--- a/source/blender/nodes/shader/nodes/node_shader_curves.cc
+++ b/source/blender/nodes/shader/nodes/node_shader_curves.cc
@@ -80,7 +80,7 @@ static int gpu_shader_curve_vec(GPUMaterial *mat,
 
   return GPU_stack_link(mat,
                         node,
-                        "curves_vector",
+                        "curves_vector_mixed",
                         in,
                         out,
                         band_texture,



More information about the Bf-blender-cvs mailing list