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

#include "../../../types.txt"
#include "common.ps.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_BaseColor;
		float4 g_BaseTexParam;
		float4 g_CloudColor;
		float4 g_CloudLayer[2];
	};

	#if ENABLE_BASE_TEXTURE
		Texture2D    g_BaseTexture : register( t0 );
		SamplerState g_BaseSampler : register( s0 );
	#endif //ENABLE_BASE_TEXTURE

	#if ENABLE_CLOUD_TEXTURE
		Texture2D    g_CloudTexture0 : register( t1 );
		SamplerState g_CloudSampler0 : register( s1 );
		Texture2D    g_CloudTexture1 : register( t2 );
		SamplerState g_CloudSampler1 : register( s2 );
	#endif //ENABLE_CLOUD_TEXTURE
	
#else //MIX_SM_HIGH

	float4 g_BaseColor     : register( c0 );
	float4 g_BaseTexParam  : register( c1 );
	float4 g_CloudColor    : register( c2 );
	float4 g_CloudLayer[2] : register( c3 );

	#if ENABLE_BASE_TEXTURE
		sampler g_BaseSampler   : register( s0 );
	#endif //ENABLE_BASE_TEXTURE

	#if ENABLE_CLOUD_TEXTURE
		sampler g_CloudSampler0 : register( s1 );
		sampler g_CloudSampler1 : register( s2 );
	#endif //ENABLE_CLOUD_TEXTURE

#endif //MIX_SM_HIGH

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

#if MIX_SM_HIGH
	#define TEX_BASE( uv ) g_BaseTexture.Sample( g_BaseSampler, uv )
	#define TEX_CLOUD_0( uv ) g_CloudTexture0.Sample( g_CloudSampler0, uv )
	#define TEX_CLOUD_1( uv ) g_CloudTexture1.Sample( g_CloudSampler1, uv )
#else //MIX_SM_HIGH
	#define TEX_BASE( uv ) tex2D( g_BaseSampler, uv )
	#define TEX_CLOUD_0( uv ) tex2D( g_CloudSampler0, uv )
	#define TEX_CLOUD_1( uv ) tex2D( g_CloudSampler1, uv )
#endif //MIX_SM_HIGH

#define TEX_BASE_SCALE   ( g_BaseTexParam.x )
#define TEX_BASE_OPACITY ( g_BaseTexParam.y )

#define TEX_CLOUD_UV_OFFSET( index ) ( g_CloudLayer[index].xy )
#define TEX_CLOUD_SCALE( index ) ( g_CloudLayer[index].z )
#define TEX_CLOUD_OPACITY( index ) ( g_CloudLayer[index].w )

#define CLOUD_COLOR g_CloudColor

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

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float3 baseColor;
	float4 output = 0.0;

#if ( ENABLE_BASE_TEXTURE || ENABLE_CLOUD_TEXTURE )
	float2 tex;
	float4 texColor;
#endif //( ENABLE_BASE_TEXTURE || ENABLE_CLOUD_TEXTURE )

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Base
	////////////////////////////////////////////////////////////////////////////////////////////////////

#if ENABLE_BASE_TEXTURE

	tex = ( input.tex - float2( 0.5, 0.5 ) ) * TEX_BASE_SCALE + float2( 0.5, 0.5 );

	texColor = TEX_BASE( tex );

	output.rgb = lerp( g_BaseColor.rgb, texColor.rgb, texColor.a * TEX_BASE_OPACITY );
	output.a = g_BaseColor.a;

	baseColor = output.rgb;
	
#else //ENABLE_BASE_TEXTURE

	output = g_BaseColor;
	baseColor = g_BaseColor.rgb;

#endif //ENABLE_BASE_TEXTURE

	////////////////////////////////////////////////////////////////////////////////////////////////////
	// Cloud
	////////////////////////////////////////////////////////////////////////////////////////////////////

#if ENABLE_CLOUD_TEXTURE

	tex = ApplyTexScale( input.tex, TEX_CLOUD_SCALE( 0 ) );
	texColor = TEX_CLOUD_0( tex + TEX_CLOUD_UV_OFFSET( 0 ) );
	texColor.a *= TEX_CLOUD_OPACITY( 0 );

	#if ENABLE_CLOUD_LAYER
		float4 tmpColor;

		tex = ApplyTexScale( input.tex, TEX_CLOUD_SCALE( 1 ) );
		tmpColor = TEX_CLOUD_1( tex + TEX_CLOUD_UV_OFFSET( 1 ) );
		tmpColor.a *= TEX_CLOUD_OPACITY( 1 );

		texColor.rgb = lerp( texColor.rgb, tmpColor.rgb, tmpColor.a );
		texColor.a = min( texColor.a + tmpColor.a, 1.0 );
	#endif //ENABLE_CLOUD_LAYER

	texColor *= CLOUD_COLOR;

	output.rgb = lerp( output.rgb, texColor.rgb, texColor.a );

#endif //ENABLE_CLOUD_TEXTURE

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

	return output;
}
