matrix ViewMatrix		: register(c0);
vector Translation		: register(c4);
matrix RotationMatrix	: register(c5);
matrix RotationMatrix2	: register(c9);
matrix RotationMatrix3	: register(c13);
vector LightItensity	: register(c17);

vector LightStrength : register(c0);

struct VS_INPUT
{
vector Position	: POSITION;
vector Texture	: TEXCOORD0;
};

struct VS_OUTPUT
{
vector Position	: POSITION;
float2 Texture0	: TEXCOORD0;
vector Texture1 : TEXCOORD1;
vector Texture2 : TEXCOORD2;
vector Texture3 : TEXCOORD3;
};

VS_OUTPUT WeaponVertexShader(VS_INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;

output.Position = mul(RotationMatrix, input.Position);
output.Position.xyz += Translation.xyz;
output.Position = mul(ViewMatrix, output.Position);
output.Texture0 = input.Texture.xy;

vector OrangeLight = { -0.8f, 0.0f, 0.56f, 0.0f };
output.Texture1 = mul(RotationMatrix2, OrangeLight);
vector BlueLight = { 0.9f, 0.0f, 0.12f, 0.0f };
output.Texture2 = mul(RotationMatrix3, BlueLight);
vector WhiteLight = { 0.95f, 0.0f, -0.1f, 0.0f };
output.Texture3 = mul(RotationMatrix3, WhiteLight);

return output;
}

// -------------------------------------------------------------------------

// -------------------------------------------------------------------------

sampler BaseTex			: register(s0);
sampler BaseNormal		: register(s1);
sampler FullsNormal		: register(s2);

struct PS_OUTPUT
{
vector diffuse	: COLOR0;
};

PS_OUTPUT WeaponPixelShader(VS_OUTPUT input)
{
PS_OUTPUT output = (PS_OUTPUT)0;

float3 NormalTex = (tex2D(BaseNormal, input.Texture0) * 2.0f - 1.0f).xyz;

float3 Orange = { 1.5f, 0.95f, 0.5f };
float3 Blue = { 0.25f, 1.5f, 1.5f };

float3 Light = saturate(sin(NormalTex.z)) * 0.45f;

	// Orange light
Light += Orange * 0.8f * saturate(dot(NormalTex, input.Texture1));
Light += Orange * 1.2f * saturate(pow(dot(NormalTex, input.Texture1), 25));
	
Light *= LightItensity.x;

	// Blue light
Light += Blue * 0.75f * saturate(dot(NormalTex, input.Texture2));

	// White (rim) light
Light += 4.0f * pow(saturate(dot(NormalTex, input.Texture3)), 5);

vector RGBTex = tex2D(BaseTex, input.Texture0);

output.diffuse.xyz = (Light) * RGBTex.xyz;
output.diffuse.w = RGBTex.w;

return output;
}
