Compositor: Added Weighted Standard Curve evaluation

Available in RGB Curve node in the compositor and as modifier in the
sequencer. I reshuffled the values of the enum. But a the first commit
is just 1 day old I think that the order is more important than the file
compatibility.
This commit is contained in:
Jeroen Bakker 2018-08-24 10:04:33 +02:00
parent f029aefe3e
commit b8c9df6f21
Notes: blender-bot 2023-02-14 07:45:38 +01:00
Referenced by commit 5d3c815c2f, Revert "Compositor: Added Weighted Standard Curve evaluation"
Referenced by issue #56523, Enable/Disable Viewport Visibility Bug
Referenced by issue #56524, Navigate Gizmo obscured by objects
Referenced by issue #56525, Missing images in Texture Slots
4 changed files with 50 additions and 6 deletions

View File

@ -953,6 +953,28 @@ static void curvemapping_evaluateRGBF_filmlike(const CurveMapping *cumap, float
vecout[channel_offset[1]] = v1;
vecout[channel_offset[2]] = v2;
}
static float curvemapping_weighted_standard_triangle(float a, float b, float a1)
{
if (a != b)
{
float b1;
float a2 = a1 - a;
if (b < a)
{
b1 = b + a2 * b / a ;
}
else {
b1 = b + a2 * (65535.f - b) / (65535.f - a);
}
return b1;
}
return a1;
}
/** same as #curvemapping_evaluate_premulRGBF
* but black/bwmul are passed as args for the compositor
* where they can change per pixel.
@ -970,7 +992,8 @@ void curvemapping_evaluate_premulRGBF_ex(
const float g = (vecin[1] - black[1]) * bwmul[1];
const float b = (vecin[2] - black[2]) * bwmul[2];
switch (cumap->tone) {
switch (cumap->tone)
{
default:
case CURVE_TONE_STANDARD:
{
@ -979,6 +1002,25 @@ void curvemapping_evaluate_premulRGBF_ex(
vecout[2] = curvemap_evaluateF(&cumap->cm[2], b);
break;
}
case CURVE_TONE_WEIGHTED_STANDARD:
{
float r1 = curvemap_evaluateF(&cumap->cm[0], r);
float g1 = curvemapping_weighted_standard_triangle(r, r1, g);
float b1 = curvemapping_weighted_standard_triangle(r, r1, b);
float g2 = curvemap_evaluateF(&cumap->cm[1], g);
float r2 = curvemapping_weighted_standard_triangle(g, g2, r);
float b2 = curvemapping_weighted_standard_triangle(g, g2, b);
float b3 = curvemap_evaluateF(&cumap->cm[2], b);
float r3 = curvemapping_weighted_standard_triangle(b, b3, r);
float g3 = curvemapping_weighted_standard_triangle(b, b3, g);
vecout[0] = r1 * 0.50f + r2 * 0.25f + r3 * 0.25f;
vecout[1] = g1 * 0.25f + g2 * 0.50f + g3 * 0.25f;
vecout[2] = b1 * 0.25f + b2 * 0.25f + b3 * 0.50f;
break;
}
case CURVE_TONE_FILMLIKE:
{
if (r >= g) {

View File

@ -2965,7 +2965,7 @@ static void curvemap_buttons_layout(
if (tone) {
split = uiLayoutSplit(layout, 0.0f, false);
uiItemR(uiLayoutRow(split, false), ptr, "tone", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
uiItemR(uiLayoutRow(split, false), ptr, "tone", 0, NULL, ICON_NONE);
}
/* curve chooser */

View File

@ -107,8 +107,9 @@ typedef enum eCurveMappingPreset {
/* CurveMapping->tone */
typedef enum eCurveMappingTone {
CURVE_TONE_STANDARD = 0,
CURVE_TONE_FILMLIKE = 1,
CURVE_TONE_STANDARD = 0,
CURVE_TONE_WEIGHTED_STANDARD = 1,
CURVE_TONE_FILMLIKE = 2,
} eCurveMappingTone;
/* histogram->mode */

View File

@ -764,8 +764,9 @@ static void rna_def_curvemapping(BlenderRNA *brna)
FunctionRNA *func;
static const EnumPropertyItem tone_items[] = {
{CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""},
{CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""},
{CURVE_TONE_STANDARD, "STANDARD", 0, "Standard", ""},
{CURVE_TONE_WEIGHTED_STANDARD, "WEIGHTED", 0, "Weighted Standard", ""},
{CURVE_TONE_FILMLIKE, "FILMLIKE", 0, "Film like", ""},
{0, NULL, 0, NULL, NULL}
};