Compositor: Reorder inputs accordingly to importance

This patch reorders the inputs of some of the compositor nodes
accordingly to their importance. The importance is already quantified
internally using the domain priority of the input, so we needn't make
any subjective judgement and just order by the priority.

This breaks forward and backward compatibility if input indices were
used as opposed to input identifiers due to the different order.
Handling compatibility is not impossible, but is difficult, and it was
already ignored in many past node changes.

Pull Request: https://projects.blender.org/blender/blender/pulls/146311
This commit is contained in:
Omar Emara
2025-09-23 17:32:07 +02:00
committed by Omar Emara
parent bafb63a654
commit 7ec89d1bfb
24 changed files with 183 additions and 217 deletions

View File

@@ -20,7 +20,7 @@ float4 preprocess_foreground(float4 foreground, float straight_alpha)
}
/* Computes the Porter and Duff Over compositing operation. */
float4 alpha_over(float factor, float4 background, float4 foreground, float straight_alpha)
float4 alpha_over(float4 background, float4 foreground, float factor, float straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -34,9 +34,9 @@ float4 alpha_over(float factor, float4 background, float4 foreground, float stra
* held out by the foreground. See for reference:
*
* https://benmcewan.com/blog/disjoint-over-and-conjoint-over-explained */
float4 alpha_over_disjoint(float factor,
float4 background,
float4 alpha_over_disjoint(float4 background,
float4 foreground,
float factor,
float straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -61,9 +61,9 @@ float4 alpha_over_disjoint(float factor,
* https://benmcewan.com/blog/disjoint-over-and-conjoint-over-explained
*
* However, the equation is wrong and should actually be A+B(1-a/b), A if a>b. */
float4 alpha_over_conjoint(float factor,
float4 background,
float4 alpha_over_conjoint(float4 background,
float4 foreground,
float factor,
float straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -82,9 +82,9 @@ float4 alpha_over_conjoint(float factor,
return mix(background, mix_result, factor);
}
void node_composite_alpha_over(float factor,
float4 background,
void node_composite_alpha_over(float4 background,
float4 foreground,
float factor,
float type,
float straight_alpha,
out float4 result)
@@ -92,13 +92,13 @@ void node_composite_alpha_over(float factor,
result = background;
switch (int(type)) {
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_OVER:
result = alpha_over(factor, background, foreground, straight_alpha);
result = alpha_over(background, foreground, factor, straight_alpha);
break;
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_DISJOINT_OVER:
result = alpha_over_disjoint(factor, background, foreground, straight_alpha);
result = alpha_over_disjoint(background, foreground, factor, straight_alpha);
break;
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_CONJOINT_OVER:
result = alpha_over_conjoint(factor, background, foreground, straight_alpha);
result = alpha_over_conjoint(background, foreground, factor, straight_alpha);
break;
}
}

View File

@@ -238,8 +238,8 @@ float4 white_point_variable(const float4 color,
return float4(balanced, color.w);
}
void node_composite_color_balance(const float factor,
const float4 color,
void node_composite_color_balance(const float4 color,
const float factor,
const float type,
const float base_lift,
const float4 color_lift,
@@ -284,8 +284,8 @@ void node_composite_color_balance(const float factor,
result = float4(mix(color.xyz(), result.xyz(), min(factor, 1.0f)), color.w);
}
void node_composite_color_balance_white_point_constant(const float factor,
const float4 color,
void node_composite_color_balance_white_point_constant(const float4 color,
const float factor,
const float type,
const float base_lift,
const float4 color_lift,

View File

@@ -15,8 +15,8 @@ float3 compute_hue_curve_map_coordinates(float3 parameters)
return parameters * sampler_scale + sampler_offset;
}
void node_composite_hue_correct(float factor,
float4 color,
void node_composite_hue_correct(float4 color,
float factor,
sampler1DArray curve_map,
const float layer,
float3 minimums,

View File

@@ -5,7 +5,7 @@
#include "gpu_shader_common_color_utils.glsl"
void node_composite_invert(
float fac, float4 color, float invert_color, float invert_alpha, out float4 result)
float4 color, float factor, float invert_color, float invert_alpha, out float4 result)
{
result = color;
if (invert_color != 0.0f) {
@@ -14,5 +14,5 @@ void node_composite_invert(
if (invert_alpha != 0.0f) {
result.a = 1.0f - result.a;
}
result = mix(color, result, fac);
result = mix(color, result, factor);
}

View File

@@ -98,6 +98,31 @@ void curves_combined_rgb(float factor,
result = mix(color, result, factor);
}
void curves_combined_rgb_compositor(float4 color,
float factor,
float4 black_level,
float4 white_level,
sampler1DArray curve_map,
const float layer,
float4 range_minimums,
float4 range_dividers,
float4 start_slopes,
float4 end_slopes,
out float4 result)
{
curves_combined_rgb(factor,
color,
black_level,
white_level,
curve_map,
layer,
range_minimums,
range_dividers,
start_slopes,
end_slopes,
result);
}
void curves_combined_only(float factor,
float4 color,
float4 black_level,
@@ -129,6 +154,31 @@ void curves_combined_only(float factor,
result = mix(color, result, factor);
}
void curves_combined_only_compositor(float4 color,
float factor,
float4 black_level,
float4 white_level,
sampler1DArray curve_map,
const float layer,
float range_minimum,
float range_divider,
float start_slope,
float end_slope,
out float4 result)
{
curves_combined_only(factor,
color,
black_level,
white_level,
curve_map,
layer,
range_minimum,
range_divider,
start_slope,
end_slope,
result);
}
/* Contrary to standard tone curve implementations, the film-like implementation tries to preserve
* the hue of the colors as much as possible. To understand why this might be a problem, consider
* the violet color (0.5, 0.0, 1.0). If this color was to be evaluated at a power curve x^4, the
@@ -207,6 +257,31 @@ void curves_film_like(float factor,
result = mix(color, result, clamp(factor, 0.0f, 1.0f));
}
void curves_film_like_compositor(float4 color,
float factor,
float4 black_level,
float4 white_level,
sampler1DArray curve_map,
const float layer,
float range_minimum,
float range_divider,
float start_slope,
float end_slope,
out float4 result)
{
curves_film_like(factor,
color,
black_level,
white_level,
curve_map,
layer,
range_minimum,
range_divider,
start_slope,
end_slope,
result);
}
void curves_vector(float3 vector,
sampler1DArray curve_map,
const float layer,

View File

@@ -41,18 +41,9 @@ static const EnumPropertyItem type_items[] = {
static void node_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(2);
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Color>("Image", "Image_001")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Color>("Image", "Image_001").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Fac").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Menu>("Type")
.default_value(CMP_NODE_ALPHA_OVER_OPERATION_TYPE_OVER)
.static_items(type_items);
@@ -85,9 +76,9 @@ static float4 preprocess_foreground(const float4 &foreground, const bool straigh
}
/* Computes the Porter and Duff Over compositing operation. */
static float4 alpha_over(const float factor,
const float4 &background,
static float4 alpha_over(const float4 &background,
const float4 &foreground,
const float factor,
const bool straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -102,9 +93,9 @@ static float4 alpha_over(const float factor,
* held out by the foreground. See for reference:
*
* https://benmcewan.com/blog/disjoint-over-and-conjoint-over-explained */
static float4 alpha_over_disjoint(const float factor,
const float4 &background,
static float4 alpha_over_disjoint(const float4 &background,
const float4 &foreground,
const float factor,
const bool straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -127,9 +118,9 @@ static float4 alpha_over_disjoint(const float factor,
* background if it is more opaque but not necessary completely opaque. See for reference:
*
* https://benmcewan.com/blog/disjoint-over-and-conjoint-over-explained */
static float4 alpha_over_conjoint(const float factor,
const float4 &background,
static float4 alpha_over_conjoint(const float4 &background,
const float4 &foreground,
const float factor,
const bool straight_alpha)
{
const float4 foreground_color = preprocess_foreground(foreground, straight_alpha);
@@ -150,24 +141,24 @@ static float4 alpha_over_conjoint(const float factor,
static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder)
{
static auto function = mf::build::SI5_SO<float, float4, float4, MenuValue, bool, float4>(
static auto function = mf::build::SI5_SO<float4, float4, float, MenuValue, bool, float4>(
"Alpha Over",
[=](const float factor,
const float4 &background,
[=](const float4 &background,
const float4 &foreground,
const float factor,
const MenuValue type,
const bool straight_alpha) -> float4 {
switch (CMPNodeAlphaOverOperationType(type.value)) {
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_OVER:
return alpha_over(factor, background, foreground, straight_alpha);
return alpha_over(background, foreground, factor, straight_alpha);
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_DISJOINT_OVER:
return alpha_over_disjoint(factor, background, foreground, straight_alpha);
return alpha_over_disjoint(background, foreground, factor, straight_alpha);
case CMP_NODE_ALPHA_OVER_OPERATION_TYPE_CONJOINT_OVER:
return alpha_over_conjoint(factor, background, foreground, straight_alpha);
return alpha_over_conjoint(background, foreground, factor, straight_alpha);
}
return background;
},
mf::build::exec_presets::SomeSpanOrSingle<1, 2>());
mf::build::exec_presets::SomeSpanOrSingle<0, 1>());
builder.set_matching_fn(function);
}

View File

@@ -55,15 +55,8 @@ static void cmp_node_colorbalance_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Color>("Image");
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Fac").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Menu>("Type")
.default_value(CMP_NODE_COLOR_BALANCE_LGG)
@@ -310,8 +303,8 @@ static float4 white_point_variable(const float4 color,
return float4(balanced, color.w);
}
static float4 color_balance(const float factor,
const float4 color,
static float4 color_balance(const float4 color,
const float factor,
const CMPNodeColorBalanceMethod type,
const float base_lift,
const float4 color_lift,
@@ -363,8 +356,8 @@ class ColorBalanceFunction : public mf::MultiFunction {
static const mf::Signature signature = []() {
mf::Signature signature;
mf::SignatureBuilder builder{"Color Balance", signature};
builder.single_input<float>("Factor");
builder.single_input<float4>("Color");
builder.single_input<float>("Factor");
builder.single_input<MenuValue>("Type");
builder.single_input<float>("Base Lift");
@@ -394,8 +387,8 @@ class ColorBalanceFunction : public mf::MultiFunction {
void call(const IndexMask &mask, mf::Params params, mf::Context /*context*/) const override
{
const VArray<float> factor_array = params.readonly_single_input<float>(0, "Factor");
const VArray<float4> color_array = params.readonly_single_input<float4>(1, "Color");
const VArray<float4> color_array = params.readonly_single_input<float4>(0, "Color");
const VArray<float> factor_array = params.readonly_single_input<float>(1, "Factor");
const VArray<MenuValue> type_array = params.readonly_single_input<MenuValue>(2, "Type");
const VArray<float> base_lift_array = params.readonly_single_input<float>(3, "Base Lift");
@@ -484,8 +477,8 @@ class ColorBalanceFunction : public mf::MultiFunction {
const float output_tint = output_tint_array.get_internal_single();
mask.foreach_index([&](const int64_t i) {
result[i] = color_balance(factor,
color_array[i],
result[i] = color_balance(color_array[i],
factor,
CMPNodeColorBalanceMethod(type),
base_lift,
color_lift,
@@ -509,8 +502,8 @@ class ColorBalanceFunction : public mf::MultiFunction {
}
else {
mask.foreach_index([&](const int64_t i) {
result[i] = color_balance(factor_array[i],
color_array[i],
result[i] = color_balance(color_array[i],
factor_array[i],
CMPNodeColorBalanceMethod(type_array[i].value),
base_lift_array[i],
color_lift_array[i],

View File

@@ -130,17 +130,15 @@ namespace blender::nodes::node_composite_rgb_curves_cc {
static void cmp_node_rgbcurves_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.description("Image/Color input on which RGB color transformation will be applied");
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1)
.description("Amount of influence the node exerts on the image");
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.description("Image/Color input on which RGB color transformation will be applied");
b.add_input<decl::Color>("Black Level")
.default_value({0.0f, 0.0f, 0.0f, 1.0f})
.description("Input color that should be mapped to black");
@@ -188,7 +186,7 @@ static int node_gpu_material(GPUMaterial *material,
if (curve_mapping->tone == CURVE_TONE_FILMLIKE) {
return GPU_stack_link(material,
node,
"curves_film_like",
"curves_film_like_compositor",
inputs,
outputs,
band_texture,
@@ -215,7 +213,7 @@ static int node_gpu_material(GPUMaterial *material,
{
return GPU_stack_link(material,
node,
"curves_combined_only",
"curves_combined_only_compositor",
inputs,
outputs,
band_texture,
@@ -228,7 +226,7 @@ static int node_gpu_material(GPUMaterial *material,
return GPU_stack_link(material,
node,
"curves_combined_rgb",
"curves_combined_rgb_compositor",
inputs,
outputs,
band_texture,
@@ -246,9 +244,9 @@ static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &
BKE_curvemapping_premultiply(curve_mapping, false);
builder.construct_and_set_matching_fn_cb([=]() {
return mf::build::SI4_SO<float, float4, float4, float4, float4>(
return mf::build::SI4_SO<float4, float, float4, float4, float4>(
"RGB Curves",
[=](const float factor, const float4 &color, const float4 &black, const float4 &white)
[=](const float4 &color, const float factor, const float4 &black, const float4 &white)
-> float4 {
float3 black_white_scale;
BKE_curvemapping_set_black_white_ex(black, white, black_white_scale);
@@ -259,7 +257,7 @@ static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &
return float4(math::interpolate(color.xyz(), result, math::clamp(factor, 0.0f, 1.0f)),
color.w);
},
mf::build::exec_presets::SomeSpanOrSingle<1>());
mf::build::exec_presets::SomeSpanOrSingle<0>());
});
}

View File

@@ -75,19 +75,16 @@ static void cmp_node_denoise_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Color>("Albedo")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.hide_value()
.structure_type(StructureType::Dynamic);
b.add_input<decl::Vector>("Normal")
.default_value({0.0f, 0.0f, 0.0f})
.min(-1.0f)
.max(1.0f)
.hide_value()
.compositor_domain_priority(2)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Color>("Albedo")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.hide_value()
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Bool>("HDR").default_value(true);
b.add_input<decl::Menu>("Prefilter")

View File

@@ -28,24 +28,14 @@ static void cmp_node_zcombine_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("A")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Depth A")
.default_value(1.0f)
.min(0.0f)
.max(10000.0f)
.compositor_domain_priority(2)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Depth A").default_value(1.0f).min(0.0f).max(10000.0f).structure_type(
StructureType::Dynamic);
b.add_input<decl::Color>("B")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Depth B")
.default_value(1.0f)
.min(0.0f)
.max(10000.0f)
.compositor_domain_priority(3)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Depth B").default_value(1.0f).min(0.0f).max(10000.0f).structure_type(
StructureType::Dynamic);
b.add_input<decl::Bool>("Use Alpha")
.default_value(false)
.description(

View File

@@ -26,16 +26,14 @@ namespace blender::nodes::node_composite_despeckle_cc {
static void cmp_node_despeckle_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Color Threshold")
.default_value(0.5f)

View File

@@ -15,17 +15,15 @@ namespace blender::nodes::node_composite_double_edge_mask_cc {
static void cmp_node_double_edge_mask_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Float>("Inner Mask")
.default_value(0.8f)
.min(0.0f)
.max(1.0f)
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Outer Mask")
.default_value(0.8f)
.min(0.0f)
.max(1.0f)
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Inner Mask")
.default_value(0.8f)
.min(0.0f)
.max(1.0f)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Bool>("Image Edges")
.default_value(false)

View File

@@ -25,10 +25,8 @@ namespace blender::nodes::node_composite_exposure_cc {
static void cmp_node_exposure_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Float>("Exposure").min(-10.0f).max(10.0f).compositor_domain_priority(1);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Exposure").min(-10.0f).max(10.0f);
b.add_output<decl::Color>("Image");
}

View File

@@ -37,16 +37,14 @@ static const EnumPropertyItem type_items[] = {
static void cmp_node_filter_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Menu>("Type").default_value(CMP_NODE_FILTER_SOFT).static_items(type_items);

View File

@@ -26,34 +26,20 @@ namespace blender::nodes::node_composite_hue_sat_val_cc {
static void cmp_node_huesatval_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Float>("Hue")
.default_value(0.5f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Hue").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Float>("Saturation")
.default_value(1.0f)
.min(0.0f)
.max(2.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(2);
.subtype(PROP_FACTOR);
b.add_input<decl::Float>("Value")
.default_value(1.0f)
.min(0.0f)
.max(2.0f)
.subtype(PROP_FACTOR)
.translation_context(BLT_I18NCONTEXT_COLOR)
.compositor_domain_priority(3);
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(4);
.translation_context(BLT_I18NCONTEXT_COLOR);
b.add_input<decl::Float>("Fac").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_output<decl::Color>("Image");
}

View File

@@ -27,15 +27,8 @@ namespace blender::nodes::node_composite_huecorrect_cc {
static void cmp_node_huecorrect_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Fac").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_output<decl::Color>("Image");
}
@@ -95,7 +88,7 @@ static int node_gpu_material(GPUMaterial *material,
GPU_uniform(range_dividers));
}
static float4 hue_correct(const float factor, const float4 &color, const CurveMapping *curve_map)
static float4 hue_correct(const float4 &color, const float factor, const CurveMapping *curve_map)
{
float3 hsv;
rgb_to_hsv_v(color, hsv);
@@ -129,12 +122,12 @@ static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &
BKE_curvemapping_init(curve_mapping);
builder.construct_and_set_matching_fn_cb([=]() {
return mf::build::SI2_SO<float, float4, float4>(
return mf::build::SI2_SO<float4, float, float4>(
"Hue Correct",
[=](const float factor, const float4 &color) -> float4 {
return hue_correct(factor, color, curve_mapping);
[=](const float4 &color, const float factor) -> float4 {
return hue_correct(color, factor, curve_mapping);
},
mf::build::exec_presets::SomeSpanOrSingle<1>());
mf::build::exec_presets::SomeSpanOrSingle<0>());
});
}

View File

@@ -26,17 +26,10 @@ namespace blender::nodes::node_composite_invert_cc {
static void cmp_node_invert_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Float>("Fac")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Color")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Bool>("Invert Color").default_value(true).compositor_domain_priority(2);
b.add_input<decl::Bool>("Invert Alpha").default_value(false).compositor_domain_priority(3);
b.add_input<decl::Color>("Color").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Fac").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Bool>("Invert Color").default_value(true);
b.add_input<decl::Bool>("Invert Alpha").default_value(false);
b.add_output<decl::Color>("Color");
}
@@ -54,9 +47,9 @@ static int node_gpu_material(GPUMaterial *material,
static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder)
{
static auto function = mf::build::SI4_SO<float, float4, bool, bool, float4>(
static auto function = mf::build::SI4_SO<float4, float, bool, bool, float4>(
"Invert Color",
[](const float factor, const float4 &color, const bool invert_color, const bool invert_alpha)
[](const float4 &color, const float factor, const bool invert_color, const bool invert_alpha)
-> float4 {
float4 result = color;
if (invert_color) {
@@ -67,7 +60,7 @@ static void node_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &
}
return math::interpolate(color, result, factor);
},
mf::build::exec_presets::SomeSpanOrSingle<1>());
mf::build::exec_presets::SomeSpanOrSingle<0>());
builder.set_matching_fn(function);
}

View File

@@ -46,7 +46,6 @@ static void cmp_node_map_uv_declare(NodeDeclarationBuilder &b)
.description(
"The UV coordinates at which to sample the texture. The Z component is assumed to "
"contain an alpha channel")
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
PanelDeclarationBuilder &sampling_panel = b.add_panel("Sampling").default_closed(true);

View File

@@ -25,14 +25,8 @@ namespace blender::nodes::node_composite_posterize_cc {
static void cmp_node_posterize_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Float>("Steps")
.default_value(8.0f)
.min(2.0f)
.max(1024.0f)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Steps").default_value(8.0f).min(2.0f).max(1024.0f);
b.add_output<decl::Color>("Image");
}

View File

@@ -73,9 +73,7 @@ NODE_STORAGE_FUNCS(NodeCMPCombSepColor)
static void cmp_node_separate_color_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_output<decl::Float>("Red");
b.add_output<decl::Float>("Green");
b.add_output<decl::Float>("Blue");
@@ -254,30 +252,10 @@ NODE_STORAGE_FUNCS(NodeCMPCombSepColor)
static void cmp_node_combine_color_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Float>("Red")
.default_value(0.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(0);
b.add_input<decl::Float>("Green")
.default_value(0.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(1);
b.add_input<decl::Float>("Blue")
.default_value(0.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(2);
b.add_input<decl::Float>("Alpha")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR)
.compositor_domain_priority(3);
b.add_input<decl::Float>("Red").default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Float>("Green").default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Float>("Blue").default_value(0.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Float>("Alpha").default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_output<decl::Color>("Image");
}

View File

@@ -35,14 +35,8 @@ static const EnumPropertyItem type_items[] = {
static void cmp_node_setalpha_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Float>("Alpha")
.default_value(1.0f)
.min(0.0f)
.max(1.0f)
.compositor_domain_priority(1);
b.add_input<decl::Color>("Image").default_value({1.0f, 1.0f, 1.0f, 1.0f});
b.add_input<decl::Float>("Alpha").default_value(1.0f).min(0.0f).max(1.0f);
b.add_input<decl::Menu>("Type")
.default_value(CMP_NODE_SETALPHA_MODE_APPLY)
.static_items(type_items);

View File

@@ -24,9 +24,7 @@ namespace blender::nodes::node_composite_rgb_to_bw_cc {
static void cmp_node_rgbtobw_declare(NodeDeclarationBuilder &b)
{
b.is_function_node();
b.add_input<decl::Color>("Image")
.default_value({0.8f, 0.8f, 0.8f, 1.0f})
.compositor_domain_priority(0);
b.add_input<decl::Color>("Image").default_value({0.8f, 0.8f, 0.8f, 1.0f});
b.add_output<decl::Float>("Val");
}

View File

@@ -35,12 +35,6 @@ static void cmp_node_vec_blur_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Color>("Image")
.default_value({1.0f, 1.0f, 1.0f, 1.0f})
.compositor_domain_priority(0)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Z")
.default_value(0.0f)
.min(0.0f)
.compositor_domain_priority(2)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Vector>("Speed")
.dimensions(4)
@@ -48,8 +42,9 @@ static void cmp_node_vec_blur_declare(NodeDeclarationBuilder &b)
.min(0.0f)
.max(1.0f)
.subtype(PROP_VELOCITY)
.compositor_domain_priority(1)
.structure_type(StructureType::Dynamic);
b.add_input<decl::Float>("Z").default_value(0.0f).min(0.0f).structure_type(
StructureType::Dynamic);
b.add_input<decl::Int>("Samples").default_value(32).min(1).max(256).description(
"The number of samples used to approximate the motion blur");
b.add_input<decl::Float>("Shutter").default_value(0.5f).min(0.0f).description(