[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