color-grade: Fix and improve advanced options

These new options allow further control over the Tint tool in Color grading.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-09-04 02:18:40 +02:00
parent 781307fbe6
commit 2e98c2e754
3 changed files with 65 additions and 40 deletions

View file

@ -7,7 +7,7 @@ uniform float4 pGain;
uniform float4 pOffset;
uniform int pTintDetection; // 0 = HSV, 1 = HSL, 2 = YUV HD SDR
uniform int pTintMode; // 0 = Linear, 1 = Exp, 2 = Exp2, 3 = Log, 4 = Log10
uniform float pTintLumaExponent;
uniform float pTintExponent;
uniform float3 pTintLow;
uniform float3 pTintMid;
uniform float3 pTintHig;
@ -182,21 +182,20 @@ float4 Tint(float4 v)
if (pTintMode == TINT_MODE_LINEAR) { // Linear
} else if (pTintMode == TINT_MODE_EXP) { // Exp
value = 1.0 - exp2(value * pTintLumaExponent * -C_log2_e);
value = 1.0 - exp2(value * pTintExponent * -C_log2_e);
} else if (pTintMode == TINT_MODE_EXP2) { // Exp2
value = 1.0 - exp2(value * value * pTintLumaExponent * pTintLumaExponent * -C_log2_e);
value = 1.0 - exp2(value * value * pTintExponent * pTintExponent * -C_log2_e);
} else if (pTintMode == TINT_MODE_LOG) { // Log
value = (log2(value) + 2.) / 2.333333;
} else if (pTintMode == TINT_MODE_LOG10) { // Log10
value = (log10(value) + 1.) / 2.;
}
float4 v1 = RGBtoHSV(v);
float3 tint = float3(0,0,0);
if (v1.b > 0.5) {
tint = lerp(pTintMid, pTintHig, v1.b * 2.0 - 1.0);
if (value > 0.5) {
tint = lerp(pTintMid, pTintHig, value * 2.0 - 1.0);
} else {
tint = lerp(pTintLow, pTintMid, v1.b * 2.0);
tint = lerp(pTintLow, pTintMid, value * 2.0);
}
v.rgb *= tint;
return v;

View file

@ -136,6 +136,17 @@ Filter.ColorGrade.Offset.Green="Green Offset"
Filter.ColorGrade.Offset.Blue="Blue Offset"
Filter.ColorGrade.Offset.All="All Offset"
Filter.ColorGrade.Tint="Tint"
Filter.ColorGrade.Tint.Detection="Tint Luma Detection Method"
Filter.ColorGrade.Tint.Detection.HSV="Hue Saturation Value"
Filter.ColorGrade.Tint.Detection.HSL="Hue Saturation Lightness"
Filter.ColorGrade.Tint.Detection.YUV.SDR="Luma Chroma (BT.709 SDR)"
Filter.ColorGrade.Tint.Mode="Tint Luma Mode"
Filter.ColorGrade.Tint.Mode.Linear="Linear"
Filter.ColorGrade.Tint.Mode.Exp="Exp"
Filter.ColorGrade.Tint.Mode.Exp2="Exp2"
Filter.ColorGrade.Tint.Mode.Log="Log"
Filter.ColorGrade.Tint.Mode.Log10="Log10"
Filter.ColorGrade.Tint.Exponent="Tint Luma Exponent"
Filter.ColorGrade.Tint.Shadow.Red="Shadow Red Tint"
Filter.ColorGrade.Tint.Shadow.Green="Shadow Green Tint"
Filter.ColorGrade.Tint.Shadow.Blue="Shadow Blue Tint"

View file

@ -71,7 +71,7 @@
#define MODE_EXP Exp
#define MODE_EXP2 Exp2
#define MODE_LOG Log
#define MODE_LOG10 Log2
#define MODE_LOG10 Log10
// Initializer & Finalizer
P_INITIALIZER(FilterColorGradeInit)
@ -104,9 +104,10 @@ void get_defaults(obs_data_t* data)
obs_data_set_default_double(data, ST_OFFSET_(GREEN), 0.0);
obs_data_set_default_double(data, ST_OFFSET_(BLUE), 0.0);
obs_data_set_default_double(data, ST_OFFSET_(ALL), 0.0);
obs_data_set_default_int(data, ST_TINT_MODE, static_cast<int64_t>(filter::color_grade::luma_mode::Exp2));
obs_data_set_default_int(data, ST_TINT_DETECTION, static_cast<int64_t>(filter::color_grade::detection_mode::HSL));
obs_data_set_default_double(data, ST_TINT_EXPONENT, 1.0);
obs_data_set_default_int(data, ST_TINT_MODE, static_cast<int64_t>(filter::color_grade::luma_mode::Linear));
obs_data_set_default_int(data, ST_TINT_DETECTION,
static_cast<int64_t>(filter::color_grade::detection_mode::YUV_SDR));
obs_data_set_default_double(data, ST_TINT_EXPONENT, 1.5);
obs_data_set_default_double(data, ST_TINT_(TONE_LOW, RED), 100.0);
obs_data_set_default_double(data, ST_TINT_(TONE_LOW, GREEN), 100.0);
obs_data_set_default_double(data, ST_TINT_(TONE_LOW, BLUE), 100.0);
@ -148,7 +149,12 @@ bool tool_modified(obs_properties_t* props, obs_property_t* property, obs_data_t
}},
{ST_CORRECTION,
{ST_CORRECTION_(HUE), ST_CORRECTION_(SATURATION), ST_CORRECTION_(LIGHTNESS), ST_CORRECTION_(CONTRAST)}},
};
{S_ADVANCED,
{
ST_TINT_MODE,
ST_TINT_DETECTION,
ST_TINT_EXPONENT,
}}};
for (auto kv : tool_to_property) {
if (mode == kv.first) {
@ -178,6 +184,7 @@ obs_properties_t* get_properties(void*)
obs_property_list_add_string(p, D_TRANSLATE(ST_OFFSET), ST_OFFSET);
obs_property_list_add_string(p, D_TRANSLATE(ST_TINT), ST_TINT);
obs_property_list_add_string(p, D_TRANSLATE(ST_CORRECTION), ST_CORRECTION);
obs_property_list_add_string(p, D_TRANSLATE(S_ADVANCED), S_ADVANCED);
obs_property_set_modified_callback(p, &tool_modified);
}
@ -240,34 +247,6 @@ obs_properties_t* get_properties(void*)
obs_properties_add_group(pr, ST_TINT, D_TRANSLATE(ST_TINT), OBS_GROUP_NORMAL, grp);
}
{
auto p = obs_properties_add_list(grp, ST_TINT_MODE, D_TRANSLATE(ST_TINT_MODE), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
std::pair<const char*, filter::color_grade::luma_mode> els[] = {
{ST_TINT_MODE_(MODE_LINEAR), filter::color_grade::luma_mode::Linear},
{ST_TINT_MODE_(MODE_EXP), filter::color_grade::luma_mode::Exp},
{ST_TINT_MODE_(MODE_EXP2), filter::color_grade::luma_mode::Exp2},
{ST_TINT_MODE_(MODE_LOG), filter::color_grade::luma_mode::Log},
{ST_TINT_MODE_(MODE_LOG10), filter::color_grade::luma_mode::Log10}};
for (auto kv : els) {
obs_property_list_add_int(p, D_TRANSLATE(kv.first), static_cast<int64_t>(kv.second));
}
}
{
auto p = obs_properties_add_list(grp, ST_TINT_DETECTION, D_TRANSLATE(ST_TINT_DETECTION),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
std::pair<const char*, filter::color_grade::detection_mode> els[] = {
{ST_TINT_DETECTION_(DETECTION_HSV), filter::color_grade::detection_mode::HSV},
{ST_TINT_DETECTION_(DETECTION_HSL), filter::color_grade::detection_mode::HSL},
{ST_TINT_DETECTION_(DETECTION_YUV_SDR), filter::color_grade::detection_mode::YUV_SDR}};
for (auto kv : els) {
obs_property_list_add_int(p, D_TRANSLATE(kv.first), static_cast<int64_t>(kv.second));
}
}
obs_properties_add_float_slider(grp, ST_TINT_EXPONENT, D_TRANSLATE(ST_TINT_EXPONENT), 0., 10., 0.01);
obs_properties_add_float_slider(grp, ST_TINT_(TONE_LOW, RED), D_TRANSLATE(ST_TINT_(TONE_LOW, RED)), 0, 1000.0,
0.01);
obs_properties_add_float_slider(grp, ST_TINT_(TONE_LOW, GREEN), D_TRANSLATE(ST_TINT_(TONE_LOW, GREEN)), 0,
@ -306,6 +285,42 @@ obs_properties_t* get_properties(void*)
1000.0, 0.01);
}
{
obs_properties_t* grp = pr;
if (!util::are_property_groups_broken()) {
grp = obs_properties_create();
obs_properties_add_group(pr, S_ADVANCED, D_TRANSLATE(S_ADVANCED), OBS_GROUP_NORMAL, grp);
}
{
auto p = obs_properties_add_list(grp, ST_TINT_MODE, D_TRANSLATE(ST_TINT_MODE), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
std::pair<const char*, filter::color_grade::luma_mode> els[] = {
{ST_TINT_MODE_(MODE_LINEAR), filter::color_grade::luma_mode::Linear},
{ST_TINT_MODE_(MODE_EXP), filter::color_grade::luma_mode::Exp},
{ST_TINT_MODE_(MODE_EXP2), filter::color_grade::luma_mode::Exp2},
{ST_TINT_MODE_(MODE_LOG), filter::color_grade::luma_mode::Log},
{ST_TINT_MODE_(MODE_LOG10), filter::color_grade::luma_mode::Log10}};
for (auto kv : els) {
obs_property_list_add_int(p, D_TRANSLATE(kv.first), static_cast<int64_t>(kv.second));
}
}
{
auto p = obs_properties_add_list(grp, ST_TINT_DETECTION, D_TRANSLATE(ST_TINT_DETECTION),
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
std::pair<const char*, filter::color_grade::detection_mode> els[] = {
{ST_TINT_DETECTION_(DETECTION_HSV), filter::color_grade::detection_mode::HSV},
{ST_TINT_DETECTION_(DETECTION_HSL), filter::color_grade::detection_mode::HSL},
{ST_TINT_DETECTION_(DETECTION_YUV_SDR), filter::color_grade::detection_mode::YUV_SDR}};
for (auto kv : els) {
obs_property_list_add_int(p, D_TRANSLATE(kv.first), static_cast<int64_t>(kv.second));
}
}
obs_properties_add_float_slider(grp, ST_TINT_EXPONENT, D_TRANSLATE(ST_TINT_EXPONENT), 0., 10., 0.01);
}
return pr;
}