// lib/Post/ColorStyle.glsl
// Выбор тонемапа по слайдеру color_style
// 0 = SEUS (SEUSTonemap)
// 1 = Complementary / Solar (на базе ACES/Academy + теплый сдвиг)

// Защита от множественного включения
#ifndef COLOR_STYLE_GLSL
#define COLOR_STYLE_GLSL

// Если параметр не задан где-то ещё — подстрахуем (не забудь настроить в shaders.properties)
#ifndef color_style
    #define color_style 0
#endif

// Вспомогательные: если у тебя есть GetLuminance, curve, oneMinus и т.д. — они уже в проекте.
// Если нет — можно использовать простую яркость:

// ---------- Complementary (Solar-like) helper ----------
vec3 ComplementaryPostAdjust(in vec3 c) {
    // Небольшая тональная коррекция: теплее, чуть контраста и насыщения
    // Подогнать яркость/контраст аккуратно (используем уже имеющуюся функцию Contrast если есть)
    #ifdef CONTRAST
        c = Contrast(c);
    #endif

    // Теплое смещение: чуть поднять красный и зелёный, убрать синий
    c *= vec3(1.03, 1.015, 0.98);

    // Небольшой подъём насыщенности
    float lum = GetLuminance(c);
    c = mix(vec3(lum), c, 1.0 + 0.04 * (1.0)); // +4% saturation approx

    // Немного тонового сдвига к «солнечному» — лёгкий перекос в каналах
    c = pow(c, vec3(1.0 / 1.02)); // лёгкая гамма-коррекция (мягче тени)

    return saturate(c);
}

// ---------- Основные тонемаперы (используем функции, которые уже есть в проекте) ----------
// Предполагается, что файлы ACES.glsl и Tonemapping.glsl / AgX.glsl определяют:
//    vec3 SEUSTonemap(in vec3);
//    vec3 ACESTonemap(in vec3);
//    vec3 AcademyCustom(in vec3);
// (Если каких-то нет — подкорректируй вызовы: замени на доступные.)

// Вариант Complementary: используем AcademyCustom/ACES тонамэп как базу, затем лёгкая подкраска.
vec3 ComplementaryTonemap(in vec3 color) {
    // Базовый тонемап — пробуем AcademyCustom (если он есть), иначе ACES/AgX
    #ifdef AcademyCustom
        vec3 outc = AcademyCustom(color);
    #else
        // fallback: если нет AcademyCustom, применять ACESTonemap если есть
        #ifdef ACESTonemap
            vec3 outc = ACESTonemap(color);
        #else
            vec3 outc = color;
        #endif
    #endif

    // Добавим комплементарный/солярный эффект:
    // немножко смешаем с "комплементарным" вариантом каналов для стилизации
    vec3 comp = vec3(outc.b, outc.r, outc.g);
    outc = mix(outc, comp, 0.12); // 12% комплементарного смешения

    // Тонкая посткоррекция (теплее, насыщеннее, мягче)
    outc = ComplementaryPostAdjust(outc);

    return saturate(outc);
}

// ---------- SEUS Tonemap wrapper ----------
vec3 SEUSTonemapWrapper(in vec3 color) {
    // SEUS-стиль: используем функцию SEUSTonemap если она есть.
    #ifdef SEUSTonemap
        return SEUSTonemap(color);
    #else
        // fallback на простой Hable / ACES если SEUS недоступен
        #ifdef HableTonemap
            return HableTonemap(color);
        #elif defined(ACESTonemap)
            return ACESTonemap(color);
        #else
            return color;
        #endif
    #endif
}

// ---------- Dispatcher: ApplySelectedTonemap ----------
vec3 ApplySelectedTonemap(in vec3 color) {
    #if color_style == 0
        return SEUSTonemapWrapper(color);
    #elif color_style == 1
        return ComplementaryTonemap(color);
    #else
        // default fallback — SEUS
        return SEUSTonemapWrapper(color);
    #endif
}

#endif // COLOR_STYLE_GLSL
