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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
// Constant
////////////////////////////////////////////////////////////////////////////////////////////////////

static const float2 VI_TEX_CENTER = float2( 0.5, 0.5 );

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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
// Global values vignette
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

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

	Texture2D g_Texture : register( t0 );
	SamplerState g_Sampler : register( s0 );
	
#else //MIX_SM_HIGH

	float4 g_Params   : register( c0 );
	float4 g_Color    : register( c1 );

	sampler g_Sampler : register( s0 );

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH
	#define TEX_COLOR( uv ) g_Texture.Sample( g_Sampler, uv )
#else //MIX_SM_HIGH
	#define TEX_COLOR( uv ) tex2D( g_Sampler, uv )
#endif //MIX_SM_HIGH

#define VI_START g_Params.x
#define VI_INV_DIST g_Params.y
#define VI_COLOR g_Color.rgb
#define VI_INTENSITY g_Color.a

////////////////////////////////////////////////////////////////////////////////////////////////////
// Main methods
////////////////////////////////////////////////////////////////////////////////////////////////////

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float4 output = TEX_COLOR( input.tex );
	float2 vec = input.tex - VI_TEX_CENTER;
	float len = length( vec );

	if( VI_START <= len )
	{
		float ratio;

		ratio = ( len - VI_START ) * VI_INV_DIST;
		ratio = clamp( ratio, 0.0, 1.0 );
		ratio *= VI_INTENSITY;

		output.rgb = lerp( output.rgb, VI_COLOR, ratio );
		output.a = max( output.a, ratio );
	}
	
	return output;
}
