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, _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs