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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
// Constant valus
////////////////////////////////////////////////////////////////////////////////////////////////////

static const float2 CAI_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;
};

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

#if MIX_SM_HIGH

	cbuffer cbInput : register( b0 )
	{
		float4 g_Param0;
		float4 g_Param1;
	};

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

#else //MIX_SM_HIGH

	float4 g_Param0 : register( c0 );
	float4 g_Param1 : register( c1 );

	sampler g_ColorSampler : register( s0 );

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH
	#define TEX_COLOR( uv ) g_ColorTexture.Sample( g_ColorSampler, uv )
#else //MIX_SM_HIGH
	#define TEX_COLOR( uv ) tex2D( g_ColorSampler, uv )
#endif //MIX_SM_HIGH

#define CAI_K g_Param0.x

#if ENABLE_K_CUBE
	#define CAI_K_CUBE g_Param0.y
#endif //ENABLE_K_CUBE

#define CAI_SCALE g_Param0.z
#define CAI_COLOR_FACTOR g_Param1

////////////////////////////////////////////////////////////////////////////////////////////////////
// Main function
////////////////////////////////////////////////////////////////////////////////////////////////////

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float2 vec = input.tex - CAI_TEX_CENTER;
	float r2 = dot( vec, vec );

	float f;
	float2 smpTex;
	float4 defColor;
	float4 smpColor;
	float4 output;

#if ENABLE_K_CUBE
	f = 1.0 + r2 * ( CAI_K + CAI_K_CUBE * sqrt( r2 ) );
#else //ENABLE_K_CUBE
	f = 1.0 + r2 * CAI_K;
#endif //ENABLE_K_CUBE

	smpTex = vec * f * CAI_SCALE + CAI_TEX_CENTER;

	defColor = TEX_COLOR( input.tex );
	smpColor = TEX_COLOR( smpTex );

	output = lerp( defColor, smpColor, CAI_COLOR_FACTOR ) - defColor;
	output = output * 0.5 + 0.5; // To unsigned 8bit
	output = saturate( output );

	return output;
}
