////////////////////////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////////////////////////

#include "../../../types.txt"
#include "../../colorSpace.txt"

////////////////////////////////////////////////////////////////////////////////////////////////////
// Structures
////////////////////////////////////////////////////////////////////////////////////////////////////

struct PS_INPUT
{
#if MIX_SM_HIGH
	float4 pos : SV_POSITION;
#endif //MIX_SM_HIGH
	float2 tex : TEXCOORD0;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
// Grobal values
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

	cbuffer cbInput : register( b0 )
	{
		float4 g_Params;
	};

	// Color
	Texture2D    g_ColorTexture   : register( t0 );
	SamplerState g_ColorSampler   : register( s0 );

	// Luminunse( Adapted )
	Texture2D    g_AdaptedTexture : register( t1 );
	SamplerState g_AdaptedSampler : register( s1 );
	
#else //MIX_SM_HIGH

	float4 g_Params : register( c0 );

	sampler g_ColorSampler   : register( s0 ); // Color
	sampler g_AdaptedSampler : register( s1 ); // Luminunse( Adapted )

#endif //MIX_SM_HIGH

////////////////////////////////////////////////////////////////////////////////////////////////////
// Macros
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

	#define TEX_COLOR( uv ) g_ColorTexture.Sample( g_ColorSampler, uv )
	#define TEX_ADAPTED( uv ) g_AdaptedTexture.Sample( g_AdaptedSampler, uv )

#else //MIX_SM_HIGH

	#define TEX_COLOR( uv ) tex2D( g_ColorSampler, uv )
	#define TEX_ADAPTED( uv ) tex2D( g_AdaptedSampler, uv )

#endif //MIX_SM_HIGH

#define MIDDLE_GRAY g_Params.x
#define WHITE2_INV g_Params.y

////////////////////////////////////////////////////////////////////////////////////////////////////
// Main Functions
////////////////////////////////////////////////////////////////////////////////////////////////////

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float4 color = TEX_COLOR( input.tex );
	float lumAdapted = TEX_ADAPTED( float2( 0.5, 0.5 ) ).r;
	float3 XYZ;
	float4 output;

	//RGB to XYZ
	XYZ = RGBToXYZ( color.rgb );

	//ToneMapping
#if ENABLE_TONEMAPPING
	float3 Yxy;
	float lumScaled;

	//XYZ to Yxy
	Yxy = XYZToYxy( XYZ );

	//Apply Luminance
	#if ENABLE_AUTO_MIDDLEGRAY

		float middleGray = 1.03 - ( 2.0 / ( 2.0 + log10( lumAdapted + 1.0 ) ) );

		Yxy.r = LumScaled( Yxy.r, middleGray, lumAdapted, WHITE2_INV );

	#else //ENABLE_AUTO_MIDDLEGRAY

		Yxy.r = LumScaled( Yxy.r, MIDDLE_GRAY, lumAdapted, WHITE2_INV );

	#endif //ENABLE_AUTO_MIDDLEGRAY

	//Yxy to XYZ
	XYZ = YxyToXYZ( Yxy );
#endif //ENABLE_TONE_MAPPING

	//BlueShift
#if ENABLE_BLUESHIFT
	XYZ = BlueShift( XYZ );
#endif //ENABLE_BLUESHIFT

	//XYZ to RGB
	output.rgb = XYZToRGB( XYZ );
	output.a = color.a;

	return output;
}
