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

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

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

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

////////////////////////////////////////////////////////////////////////////////////////////////////
// Global values
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

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

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

	Texture2D g_DataTexture      : register( t1 );
	SamplerState g_DataSampler   : register( s1 );

	Texture2D g_NoiseTexture     : register( t2 );
	SamplerState g_NoiseSampler  : register( s2 );
	
#else //MIX_SM_HIGH

	float4 g_Params         : register( c0 );

	sampler g_ColorSampler  : register( s0 );
	sampler g_DataSampler   : register( s1 );
	sampler g_NoiseSampler  : register( s2 );

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH
	#define TEX_COLOR( uv ) g_ColorTexture.Sample( g_ColorSampler, uv )
	#define TEX_DATA( uv ) g_DataTexture.Sample( g_DataSampler, uv )
	#define TEX_NOISE( uv ) g_NoiseTexture.Sample( g_NoiseSampler, uv )
#else //MIX_SM_HIGH
	#define TEX_COLOR( uv ) tex2D( g_ColorSampler, uv )
	#define TEX_DATA( uv ) tex2D( g_DataSampler, uv )
	#define TEX_NOISE( uv ) tex2D( g_NoiseSampler, uv )
#endif //MIX_SM_HIGH

#define LS_WHITENESS g_Params.x
#define LS_NTEX_ASPECT g_Params.yz

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

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float white;
	float4 output;
	
	// Masking
	
	output.rgb = TEX_COLOR( input.tex ).rgb * max( 0.0, 1.0 - TEX_DATA( input.tex ).a );

	// White

	white = output.r;
	white = max( white, output.g );
	white = max( white, output.b );

	output.rgb = lerp( output.rgb, float3( white, white, white ), LS_WHITENESS );

	// Acuity
	
#if ENABLE_ACUITY_TEX
	output.rgb *= TEX_NOISE( input.tex * LS_NTEX_ASPECT ).rgb;
#endif //ENABLE_ACUITY_TEX

	output.a = 1.0;

	return output;
}
