// STATIC: "CONVERT_TO_SRGB"				"0..1"	[ps20b] [= g_pHardwareConfig->NeedsShaderSRGBConversion()] [PC]
// STATIC: "CONVERT_TO_SRGB"				"0..0"	[= 0] [XBOX]
// STATIC: "BASETEXTURE"					"0..1"
// STATIC: "MULTITEXTURE"					"0..1"
// STATIC: "REFLECT"						"0..1"
// STATIC: "REFRACT"						"0..1"
// STATIC: "ABOVEWATER"						"0..1"
// STATIC: "BLURRY_REFRACT"					"0..1"	[ps20b]

// When we turn NORMAL_DECODE_MODE on, this shader only needs 0..1, not 0..2
// STATIC: "NORMAL_DECODE_MODE"				"0..0"	[XBOX]
// STATIC: "NORMAL_DECODE_MODE"				"0..0"	[PC]

// DYNAMIC: "PIXELFOGTYPE"					"0..1"
// DYNAMIC: "WRITE_DEPTH_TO_DESTALPHA"		"0..1"	[ps20b] [PC]
// DYNAMIC: "WRITE_DEPTH_TO_DESTALPHA"		"0..0"	[ps20b] [XBOX]

// SKIP: $MULTITEXTURE && $BASETEXTURE

#if defined(SHADER_MODEL_PS_2_0)
#	define BLURRY_REFRACT 0
#	define WRITE_DEPTH_TO_DESTALPHA 0
#endif

#include "water_ps2x_helper.h"


sampler RefractSampler			: register( s0 );
#if BASETEXTURE
sampler BaseTextureSampler		: register( s1 );
#endif
sampler ReflectSampler			: register( s2 );
#if BASETEXTURE
sampler LightmapSampler			: register( s3 );
#endif
sampler NormalSampler			: register( s4 );

const HALF4 vRefractTint			: register( c1 );
const HALF4 vReflectTint			: register( c4 );
const float4 g_ReflectRefractScale	: register( c5 ); // xy - reflect scale, zw - refract scale
const HALF4 g_WaterFogColor			: register( c6 );
const HALF4 g_WaterFogParams		: register( c7 );

const float4 g_PixelFogParams		: register( c8 );


#define g_WaterFogStart			g_WaterFogParams.x
#define g_WaterFogEndMinusStart	g_WaterFogParams.y
#define g_Reflect_OverBright	g_WaterFogParams.z

struct PS_INPUT
{
	float2 vBumpTexCoord			: TEXCOORD0;
	half3 vTangentEyeVect			: TEXCOORD1;
	float4 vReflectXY_vRefractYX	: TEXCOORD2;
	float W							: TEXCOORD3;
	float4 vProjPos					: TEXCOORD4;
	float screenCoord				: TEXCOORD5;
#if MULTITEXTURE
	float4 vExtraBumpTexCoord		: TEXCOORD6;
#endif
#if BASETEXTURE
// CENTROID: TEXCOORD6
	HALF4 lightmapTexCoord1And2		: TEXCOORD6;
// CENTROID: TEXCOORD7
	HALF4 lightmapTexCoord3			: TEXCOORD7;
#endif

	float4 fogFactorW				: COLOR1;
};

float4 main( PS_INPUT i ) : COLOR
{
	DrawWater_params_t params;

	params.vBumpTexCoord = i.vBumpTexCoord;
#if MULTITEXTURE
	params.vExtraBumpTexCoord = i.vExtraBumpTexCoord;
#endif
	params.vReflectXY_vRefractYX = i.vReflectXY_vRefractYX;
	params.w = i.W;
	params.vReflectRefractScale = g_ReflectRefractScale;
	params.fReflectOverbright = g_Reflect_OverBright;
	params.vReflectTint = vReflectTint;
	params.vRefractTint = vRefractTint;
	params.vTangentEyeVect = i.vTangentEyeVect;
	params.waterFogColor = g_WaterFogColor;
#if BASETEXTURE
	params.lightmapTexCoord1And2 = i.lightmapTexCoord1And2;
	params.lightmapTexCoord3 = i.lightmapTexCoord3;
#endif
	params.vProjPos = i.vProjPos;
	params.pixelFogParams = g_PixelFogParams;
	params.fWaterFogStart = g_WaterFogStart;
	params.fWaterFogEndMinusStart = g_WaterFogEndMinusStart;

	float4 result;
	float fogFactor;
	DrawWater( params, 
			   // yay. . can't put sampler in a struct.
#if BASETEXTURE
			   BaseTextureSampler, 
			   LightmapSampler, 
#endif
			   NormalSampler, RefractSampler, ReflectSampler,
			   result, fogFactor );

	return FinalOutput( float4( result.rgb, 1.0f ), fogFactor, PIXELFOGTYPE, TONEMAP_SCALE_NONE, (WRITE_DEPTH_TO_DESTALPHA != 0), i.vProjPos.z );
}