float3 expand(float3 v)
{
	return (v - 0.5) * 2;
}

void main_vp (  in float4 Position	: POSITION,
		in float3 Normal	: NORMAL,
		in float2 UV		: TEXCOORD0,
		in float2 UV2		: TEXCOORD1,
		in float3 Tangent	: TEXCOORD2,
		out float4 oPosition	: POSITION,
		out float2 oUv		: TEXCOORD0,
		out float2 oUv2		: TEXCOORD1,
		out float3 oNormal	: TEXCOORD2,
		out float3 oTangent	: TEXCOORD3,
		out float3 oBiNormal	: TEXCOORD4,
		out float2 oClouds	: TEXCOORD5,
		out float3 oPos		: TEXCOORD6,
		uniform float4x4 WorldViewProj,
		uniform float4x4 World,
		uniform float CloudTime)
{
	oPosition = mul(WorldViewProj, Position);
	oUv = UV;
	oUv2 = UV2;
	oPos = Position;
	oNormal = normalize(Normal.xyz);
	oTangent = normalize(Tangent.xyz);
	oBiNormal = normalize(cross(oTangent,oNormal).xyz);
	//UV coordinates for the clouds
	float4 tmp = mul(World, Position);
	oClouds.x = (tmp.x+10000)/5000 + (CloudTime/320.0f);
	oClouds.y = (tmp.z+10000)/5000 + (CloudTime/160.0f);
}

float4 main_fp (
		in float4 iPosition	: POSITION,
		in float2 iUv		: TEXCOORD0,
		in float2 iUv2		: TEXCOORD1,
		in float3 iNormal	: TEXCOORD2,
		in float3 iTangent	: TEXCOORD3,
		in float3 iBiNormal	: TEXCOORD4,
		in float2 iClouds	: TEXCOORD5,
		in float3 iPos		: TEXCOORD6,

		uniform float3		lightDiffuse[3],
		uniform float3		lightSpec[3],
		uniform float4		lightAtt[3],
		uniform float4		LightPos[3],

		uniform float4		EyePos,
		uniform float4		ambient,
		uniform sampler2D	DiffuseMap : register(s0),
		uniform sampler2D	NormalMap : register(s1),
		uniform sampler2D	ScatMap : register(s2)
): COLOR0
{
	float4 diffusemap = tex2D(DiffuseMap, iUv);
	float3 bumpVec = expand(tex2D(NormalMap, iUv).xyz);
	float1 specmap = tex2D(NormalMap, iUv).w;
	float1 occlusion = tex2D(DiffuseMap, iUv2).a;
	float4 wolken = tex2D(ScatMap, iClouds);

	float3x3 invMatrix = transpose(float3x3(iTangent, iBiNormal, iNormal));

	float3 normal = normalize(mul(invMatrix, bumpVec));

	//ambient lighting
	float4 oColor = float4(diffusemap.rgb,1) * ambient;

	for (int j = 0; j < 3; j++)
	{
		if (any(lightDiffuse[j]))
		{
			//handle both directional and point lights
			float3 lightDir = LightPos[j].xyz -  (iPos * LightPos[j].w);

			float dist = length(lightDir);

			lightDir = normalize(lightDir);

			float3 eyeDir = normalize(EyePos - iPos.xyz);
			float3 halfAngle = normalize(eyeDir + lightDir);

			float specFactor = pow(dot(normal, halfAngle),32);

			float iD = dot(lightDir, normal);

			float att = 1 / (lightAtt[j].y + lightAtt[j].z * dist + lightAtt[j].w * dist * dist);
			oColor.rgb += att * ((diffusemap.rgb * lightDiffuse[j] * iD) + (diffusemap.rgb * lightSpec[j] * (specFactor * specmap)));
		}
	}
	//ambient occlusion mapping
	oColor.rgb *= float3(occlusion,occlusion,occlusion);
	oColor *= wolken;
	return saturate(oColor);
}