////////////////////////////////////////////////////////////////////////////////////////////////////
// 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_Params;
	};

	// Previous lum texture
	Texture2D g_PreTexture   : register( t0 );
	SamplerState g_PreSamper : register( s0 );

	// Current lum texture
	Texture2D g_CurTexture   : register( t1 );
	SamplerState g_CurSamper : register( s1 );
	
#else //MIX_SM_HIGH

	float4 g_Params : register( c0 );

	sampler g_PreSamper  : register( s0 ); // Previous lum texture
	sampler g_CurSamper  : register( s1 ); // Current lum texture

#endif //MIX_SM_HIGH

////////////////////////////////////////////////////////////////////////////////////////////////////
// }N
////////////////////////////////////////////////////////////////////////////////////////////////////

#if MIX_SM_HIGH

	#define TEX_PRE( uv ) g_PreTexture.Sample( g_PreSamper, uv )
	#define TEX_CUR( uv ) g_CurTexture.Sample( g_CurSamper, uv )

#else //MIX_SM_HIGH

	#define TEX_PRE( uv ) tex2D( g_PreSamper, uv )
	#define TEX_CUR( uv ) tex2D( g_CurSamper, uv )

#endif //MIX_SM_HIGH

#define RODS g_Params.x // Light adaptation
#define CONES g_Params.y // Dark adaptation
#define DELTA_TIME g_Params.z  // Elapsed time

////////////////////////////////////////////////////////////////////////////////////////////////////
// C֐
////////////////////////////////////////////////////////////////////////////////////////////////////

float4 main( PS_INPUT input ) : MSV_TARGET0
{
	float lumPre = TEX_PRE( float2( 0.5, 0.5 ) ).r;
	float lumCur = TEX_CUR( float2( 0.5, 0.5 ) ).r;

//	float ratio = clamp( 0.4 / ( 0.04 + lumCur), 0.0, 1.0 );
	float tau = lerp( RODS, CONES, lumCur );

	float lumAdapted = max( 0.0, lumPre + ( lumCur - lumPre ) * ( 1.0 - exp( -tau * DELTA_TIME ) ) );
//	float lumAdapted = clamp( lumPre + ( lumCur - lumPre ) * ( 1.0 - exp( -tau * DELTA_TIME ) ), MIN_LUM, MAX_LUM );

	return float4( lumAdapted, lumAdapted, lumAdapted, 1.0 );
}
