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

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

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

struct PS_INPUT
{
#if MIX_SM_HIGH
	float4 pos  : SV_POSITION;
#endif //MIX_SM_HIGH
	float2 tex0 : TEXCOORD0;
	float2 tex1 : TEXCOORD1;
	float2 tex2 : TEXCOORD2;
	float2 tex3 : TEXCOORD3;
	float2 tex4 : TEXCOORD4;
	float2 tex5 : TEXCOORD5;
	float2 tex6 : TEXCOORD6;
	float2 tex7 : TEXCOORD7;
};

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

#if MIX_SM_HIGH

	cbuffer cbInput : register( b0 )
	{
		float4 g_Offset;
		float4 g_Weight0;
		float4 g_Weight1;
	}

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

	float4 g_Offset  : register( c0 );
	float4 g_Weight0 : register( c1 );
	float4 g_Weight1 : register( c2 );

	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

////////////////////////////////////////////////////////////////////////////////////////////////////
// C֐̒`
////////////////////////////////////////////////////////////////////////////////////////////////////

//pXP(wɃu[)
float4 mainX( PS_INPUT input ) : MSV_TARGET0
{
	float2 texOffset = float2( g_Offset.x, 0.0 );
	float4 output = 0.0;

	output += ( TEX_COLOR( input.tex0 ) + TEX_COLOR( input.tex7 + texOffset ) ) * g_Weight0.x;
	output += ( TEX_COLOR( input.tex1 ) + TEX_COLOR( input.tex6 + texOffset ) ) * g_Weight0.y;
	output += ( TEX_COLOR( input.tex2 ) + TEX_COLOR( input.tex5 + texOffset ) ) * g_Weight0.z;
	output += ( TEX_COLOR( input.tex3 ) + TEX_COLOR( input.tex4 + texOffset ) ) * g_Weight0.w;
	output += ( TEX_COLOR( input.tex4 ) + TEX_COLOR( input.tex3 + texOffset ) ) * g_Weight1.x;
	output += ( TEX_COLOR( input.tex5 ) + TEX_COLOR( input.tex2 + texOffset ) ) * g_Weight1.y;
	output += ( TEX_COLOR( input.tex6 ) + TEX_COLOR( input.tex1 + texOffset ) ) * g_Weight1.z;
	output += ( TEX_COLOR( input.tex7 ) + TEX_COLOR( input.tex0 + texOffset ) ) * g_Weight1.w;

	return output;
}

//pXQ(xɃu[)
float4 mainY( PS_INPUT input ) : MSV_TARGET0
{
	float2 texOffset = float2( 0.0, g_Offset.y );
	float4 output = 0.0;

	output += ( TEX_COLOR( input.tex0 ) + TEX_COLOR( input.tex7 + texOffset ) ) * g_Weight0.x;
	output += ( TEX_COLOR( input.tex1 ) + TEX_COLOR( input.tex6 + texOffset ) ) * g_Weight0.y;
	output += ( TEX_COLOR( input.tex2 ) + TEX_COLOR( input.tex5 + texOffset ) ) * g_Weight0.z;
	output += ( TEX_COLOR( input.tex3 ) + TEX_COLOR( input.tex4 + texOffset ) ) * g_Weight0.w;
	output += ( TEX_COLOR( input.tex4 ) + TEX_COLOR( input.tex3 + texOffset ) ) * g_Weight1.x;
	output += ( TEX_COLOR( input.tex5 ) + TEX_COLOR( input.tex2 + texOffset ) ) * g_Weight1.y;
	output += ( TEX_COLOR( input.tex6 ) + TEX_COLOR( input.tex1 + texOffset ) ) * g_Weight1.z;
	output += ( TEX_COLOR( input.tex7 ) + TEX_COLOR( input.tex0 + texOffset ) ) * g_Weight1.w;

	return output;
}
