#include "crDevPostProcess.h"

#include <imgui.h>

#include "crApp.h"
#include "crGraphics.h"
#include "crPostProcess.h"

void crDevPostProcess::Init( crApp* app )
{
    _app = app;
}
void crDevPostProcess::Cleanup()
{
    _app = nullptr;
}

void crDevPostProcess::TryRenderPanel()
{
    if( enabled == false )
        return;

    crPostProcess* pp = _app->graphics->PostProcess();

    ImGui::PushStyleVar( ImGuiStyleVar_FramePadding, ImVec2( 4.0f, 0.0f ) );
    ImGui::PushStyleVar( ImGuiStyleVar_ItemSpacing, ImVec2( 8.0f, 2.0f ) );

    ImGui::SetNextWindowPos( ImVec2( 10.0f, 10.0f ), ImGuiCond_FirstUseEver );
    ImGui::SetNextWindowSize( ImVec2( 480.0f, 640.0f ), ImGuiCond_FirstUseEver );
    ImGui::SetNextWindowCollapsed( true, ImGuiCond_FirstUseEver );

    if( ImGui::Begin( "PostProcess", nullptr, ImGuiWindowFlags_NoSavedSettings ) )
    {
        ImGui::Checkbox( "Enabled (master)", &pp->enabled );

        ImGui::BeginDisabled( pp->enabled == false );

        if( ImGui::CollapsingHeader( "Bloom" ) )
        {
            ImGui::Checkbox( "Enabled##bloom", &pp->bloom.enabled );
            ImGui::SliderFloat( "Threshold", &pp->bloom.threshold, 0.0f, 3.0f );
            ImGui::SliderFloat( "Knee", &pp->bloom.knee, 0.0f, 0.5f );
            ImGui::SliderFloat( "Intensity##bloom", &pp->bloom.intensity, 0.0f, 3.0f );
            ImGui::SliderFloat( "Chroma bias", &pp->bloom.chromaBias, 0.0f, 1.0f );
        }
        if( ImGui::CollapsingHeader( "Tonemap" ) )
        {
            ImGui::Checkbox( "Enabled##tonemap", &pp->tonemap.enabled );
            ImGui::SliderFloat( "Exposure", &pp->tonemap.exposure, 0.0f, 4.0f );

            const char* modes[] = { "Reinhard", "ACES" };
            int mode = pp->tonemap.mode;
            if( ImGui::Combo( "Mode", &mode, modes, static_cast<int>( SDL_arraysize( modes ) ) ) )
                pp->tonemap.mode = mode;
        }
        if( ImGui::CollapsingHeader( "Color Grade" ) )
        {
            ImGui::Checkbox( "Enabled##grade", &pp->colorGrade.enabled );
            ImGui::SliderFloat3( "Lift", &pp->colorGrade.lift.x, -1.0f, 1.0f );
            ImGui::SliderFloat3( "Gamma", &pp->colorGrade.gamma.x, 0.1f, 3.0f );
            ImGui::SliderFloat3( "Gain", &pp->colorGrade.gain.x, 0.0f, 3.0f );
        }
        if( ImGui::CollapsingHeader( "Radial Blur" ) )
        {
            ImGui::Checkbox( "Enabled##radial", &pp->radialBlur.enabled );
            ImGui::SliderFloat2( "Center", &pp->radialBlur.center.x, 0.0f, 1.0f );
            ImGui::SliderFloat( "Strength##radial", &pp->radialBlur.strength, 0.0f, 0.5f );

            int samples = pp->radialBlur.samples;
            if( ImGui::SliderInt( "Samples", &samples, 2, 16 ) )
                pp->radialBlur.samples = samples;
        }
        if( ImGui::CollapsingHeader( "Chromatic Aberration" ) )
        {
            ImGui::Checkbox( "Enabled##ca", &pp->chromatic.enabled );
            ImGui::SliderFloat( "Strength##ca", &pp->chromatic.strength, 0.0f, 0.02f, "%.4f" );
        }
        if( ImGui::CollapsingHeader( "Vignette" ) )
        {
            ImGui::Checkbox( "Enabled##vignette", &pp->vignette.enabled );
            ImGui::SliderFloat( "Radius", &pp->vignette.radius, 0.0f, 1.0f );
            ImGui::SliderFloat( "Softness", &pp->vignette.softness, 0.0f, 1.0f );
            ImGui::SliderFloat( "Intensity##vignette", &pp->vignette.intensity, 0.0f, 1.0f );
        }
        if( ImGui::CollapsingHeader( "SMAA" ) )
        {
            ImGui::Checkbox( "Enabled##smaa", &pp->smaa.enabled );

            const char* views[] = { "off", "edges", "weights" };
            int view = pp->smaa.debugView;
            if( ImGui::Combo( "Debug View", &view, views, static_cast<int>( SDL_arraysize( views ) ) ) )
                pp->smaa.debugView = view;
        }
        if( ImGui::CollapsingHeader( "Fog" ) )
        {
            ImGui::Checkbox( "Enabled##fog", &pp->fog.enabled );
            ImGui::ColorEdit3( "Color##fog", &pp->fog.color.x, ImGuiColorEditFlags_NoInputs );
            ImGui::SliderFloat( "Start", &pp->fog.start, 0.0f, 200.0f, "%.0f m" );
            ImGui::SliderFloat( "End", &pp->fog.end, 0.0f, 200.0f, "%.0f m" );
        }

        ImGui::EndDisabled();
    }
    ImGui::End();

    ImGui::PopStyleVar( 2 );
}
