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

#include "../../../types.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_Param;
		float4x4 g_CamMat;
	};

	Texture2D    g_FlareTexture : register( t0 );
	SamplerState g_FlareSampler : register( s0 );
	Texture2D    g_DirtTexture  : register( t1 );
	SamplerState g_DirtSampler  : register( s1 );
	Texture2D    g_BrustTexture : register( t2 );
	SamplerState g_BrustSampler : register( s2 );

#else //MIX_SM_HIGH

	float4 g_Param         : register( c0 );
	float4x4 g_CamMat      : register( c1 );

	sampler g_FlareSampler : register( s0 );
	sampler g_DirtSampler  : register( s1 );
	sampler g_BrustSampler : register( s2 );

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH
	#define TEX_FLARE( uv ) g_FlareTexture.Sample( g_FlareSampler, uv )
	#define TEX_DIRT( uv )  g_DirtTexture.Sample( g_DirtSampler, uv )
	#define TEX_BRUST( uv ) g_BrustTexture.Sample( g_BrustSampler, uv )
#else //MIX_SM_HIGH
	#define TEX_FLARE( uv ) tex2D( g_FlareSampler, uv )
	#define TEX_DIRT( uv )  tex2D( g_DirtSampler, uv )
	#define TEX_BRUST( uv ) tex2D( g_BrustSampler, uv )
#endif //MIX_SM_HIGH

#define LEF_DIRT_INTENSITY g_Param.x
#define LEF_DIRT_EXP g_Param.y

#define LEF_BRUST_INTENSITY g_Param.z
#define LEF_BRUST_EXP g_Param.w

#define LEF_CAM_MAT g_CamMat

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

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float4 mod;
	
#if ( ENABLE_DIRT || ENABLE_BRUST )
	mod = 0.0;
#else //( ENABLE_DIRT || ENABLE_BRUST )
	mod = 1.0;
#endif //( ENABLE_DIRT || ENABLE_BRUST )

#if ENABLE_DIRT
	float4 dirtColor = TEX_DIRT( input.tex );
	mod += pow( abs( dirtColor ), LEF_DIRT_INTENSITY ) * LEF_DIRT_EXP;
#endif //ENABLE_DIRT

#if ENABLE_BRUST
	float2 brustTex = mul( LEF_CAM_MAT, float4( input.tex.x, input.tex.y, 0.0, 1.0 ) ).xy;
	float4 brustColor = TEX_BRUST( brustTex );
	mod += pow( abs( brustColor ), LEF_BRUST_INTENSITY ) * LEF_BRUST_EXP;
#endif //ENABLE_BRUST

	return TEX_FLARE( input.tex ) * mod;
}
