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

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

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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
// Global valus
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

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

	Texture2D g_ShadeTexture0     : register( t0 );
	SamplerState g_ShadeSampler0  : register( s0 );

	Texture2D g_ShadeTexture1     : register( t1 );
	SamplerState g_ShadeSampler1  : register( s1 );

	Texture2D g_DepthTexture      : register( t2 );
	SamplerState g_DepthSampler   : register( s2 );

	Texture2D g_ColorTexture      : register( t3 );
	SamplerState g_ColorSampler   : register( s3 );

	#if ENABLE_REFRACT
		Texture2D g_RefractTexture    : register( t4 );
		SamplerState g_RefractSampler : register( s4 );
	#endif //ENABLE_REFRACT
	
#else //MIX_SM_HIGH

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

	sampler g_ShaderSampler0 : register( s0 );
	sampler g_ShaderSampler1 : register( s1 );
	sampler g_DepthSampler   : register( s2 );
	sampler g_ColorSampler   : register( s3 );

	#if ENABLE_REFRACT
		sampler g_RefractSampler : register( s4 );
	#endif //ENABLE_REFRACT

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH

	#define SDW_TEX_SHADE0( uv ) g_ShadeTexture0.Sample( g_ShadeSampler0, uv )
	#define SDW_TEX_SHADE1( uv ) g_ShadeTexture1.Sample( g_ShadeSampler1, uv )
	#define SDW_TEX_DEPTH( uv )  g_DepthTexture.Sample( g_DepthSampler, uv )
	#define SDW_TEX_COLOR( uv )  g_ColorTexture.Sample( g_ColorSampler, uv )

	#if ENABLE_REFRACT
		#define SDW_TEX_REFRACT( uv ) g_RefractTexture.Sample( g_RefractSampler, uv )
	#endif //ENABLE_REFRACT

#else //MIX_SM_HIGH

	#define SDW_TEX_SHADE0( uv ) tex2D( g_ShaderSampler0, uv )
	#define SDW_TEX_SHADE1( uv ) tex2D( g_ShaderSampler1, uv )
	#define SDW_TEX_DEPTH( uv )  tex2D( g_DepthSampler, uv )
	#define SDW_TEX_COLOR( uv )  tex2D( g_ColorSampler, uv )

	#if ENABLE_REFRACT
		#define SDW_TEX_REFRACT( uv ) tex2D( g_RefractSampler, uv )
	#endif //ENABLE_REFRACT

#endif //MIX_SM_HIGH

#define SDW_FO_START g_Params.x
#define SDW_FO_INV_DIFF g_Params.y

#if ENABLE_REFRACT
	#define SDW_REFRACT_FACTOR g_Params.z // 0 or 1
#endif //ENABLE_REFRACT

#define SDW_COLOR g_Color.rgb
#define SDW_INTENSITY g_Color.a

////////////////////////////////////////////////////////////////////////////////////////////////////
// Main functions
////////////////////////////////////////////////////////////////////////////////////////////////////

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float4 color = SDW_TEX_COLOR( input.tex );
	float4 output;

#if ENABLE_REFRACT
	if( abs( SDW_TEX_REFRACT( input.tex ).a - SDW_REFRACT_FACTOR ) > 0.5 )
	{
#endif //ENABLE_REFRACT

		float depth = SDW_TEX_DEPTH( input.tex ).r;

	#if ENABLE_BOKEH
		float4 shade0 = SDW_TEX_SHADE0( input.tex );
		float4 shade1 = SDW_TEX_SHADE1( input.tex );
	#endif //ENABLE_BOKEH

		float ratio;

		////////////////////////////////////////////////////////////////////////////////////////////////////

	#if ENABLE_BOKEH
		ratio = ( shade0.g < 0.5 )? shade0.r : shade1.r;
	#else //ENABLE_BOKEH
		ratio = SDW_TEX_SHADE0( input.tex ).r;
	#endif //ENABLE_BOKEH

		ratio = ( 1.0 - ratio ) * SDW_INTENSITY;

		if( SDW_FO_START <= depth )
		{
			ratio *= 1.0 - clamp( ( depth - SDW_FO_START ) * SDW_FO_INV_DIFF, 0.0, 1.0 );
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////

		output.rgb = lerp( color.rgb, SDW_COLOR, ratio );
		output.a = color.a;

#if ENABLE_REFRACT
	}
	else
	{
		output = color;
	}
#endif //ENABLE_REFRACT

	return output;
}
