// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license

Texture2D<float4> Texture : register(t0);
sampler TextureSampler : register(s0);

uniform extern float4 DiffuseColor;
uniform extern float3 EmissiveColor;
uniform extern float3 SpecularColor;
uniform extern float  SpecularPower;

uniform extern float3 DirLight0Direction;
uniform extern float3 DirLight0DiffuseColor;
uniform extern float3 DirLight0SpecularColor;
uniform extern float3 DirLight1Direction;
uniform extern float3 DirLight1DiffuseColor;
uniform extern float3 DirLight1SpecularColor;
uniform extern float3 DirLight2Direction;
uniform extern float3 DirLight2DiffuseColor;
uniform extern float3 DirLight2SpecularColor;

uniform extern float3 EyePosition;

uniform extern float3 FogColor;
uniform extern float4 FogVector;

uniform extern float4x4 World;
uniform extern float3x3 WorldInverseTranspose;
uniform extern float4x4 WorldViewProj;

struct VSInput
{
    float4 Position : POSITION;
};

struct VSInputVc
{
    float4 Position : POSITION;
    float4 Color    : COLOR;
};

struct VSInputTx
{
    float4 Position : POSITION;
    float2 TexCoord : TEXCOORD0;
};

struct VSInputTxVc
{
    float4 Position : POSITION;
    float2 TexCoord : TEXCOORD0;
    float4 Color    : COLOR;
};

struct VSInputNm
{
    float4 Position : POSITION;
    float3 Normal   : NORMAL;
};

struct VSInputNmVc
{
    float4 Position : POSITION;
    float3 Normal   : NORMAL;
    float4 Color    : COLOR;
};

struct VSInputNmTx
{
    float4 Position : POSITION;
    float3 Normal   : NORMAL;
    float2 TexCoord : TEXCOORD0;
};

struct VSInputNmTxVc
{
    float4 Position : POSITION;
    float3 Normal   : NORMAL;
    float2 TexCoord : TEXCOORD0;
    float4 Color    : COLOR;
};

struct VSOutput
{
    float4 Diffuse    : COLOR0;
    float4 Specular   : COLOR1;
    float4 PositionPS : SV_Position;
};

struct VSOutputNoFog
{
    float4 Diffuse    : COLOR0;
    float4 PositionPS : SV_Position;
};

struct VSOutputTx
{
    float4 Diffuse    : COLOR0;
    float4 Specular   : COLOR1;
    float2 TexCoord   : TEXCOORD0;
    float4 PositionPS : SV_Position;
};

struct VSOutputTxNoFog
{
    float4 Diffuse    : COLOR0;
    float2 TexCoord   : TEXCOORD0;
    float4 PositionPS : SV_Position;
};

struct VSOutputPixelLighting
{
    float4 PositionWS : TEXCOORD0;
    float3 NormalWS   : TEXCOORD1;
    float4 Diffuse    : COLOR0;
    float4 PositionPS : SV_Position;
};

struct VSOutputPixelLightingTx
{
    float2 TexCoord   : TEXCOORD0;
    float4 PositionWS : TEXCOORD1;
    float3 NormalWS   : TEXCOORD2;
    float4 Diffuse    : COLOR0;
    float4 PositionPS : SV_Position;
};

struct PSInput
{
    float4 Diffuse  : COLOR0;
    float4 Specular : COLOR1;
};

struct PSInputNoFog
{
    float4 Diffuse : COLOR0;
};

struct PSInputTx
{
    float4 Diffuse  : COLOR0;
    float4 Specular : COLOR1;
    float2 TexCoord : TEXCOORD0;
};

struct PSInputTxNoFog
{
    float4 Diffuse  : COLOR0;
    float2 TexCoord : TEXCOORD0;
};

struct PSInputPixelLighting
{
    float4 PositionWS : TEXCOORD0;
    float3 NormalWS   : TEXCOORD1;
    float4 Diffuse    : COLOR0;
};

struct PSInputPixelLightingTx
{
    float2 TexCoord   : TEXCOORD0;
    float4 PositionWS : TEXCOORD1;
    float3 NormalWS   : TEXCOORD2;
    float4 Diffuse    : COLOR0;
};

struct ColorPair
{
    float3 Diffuse;
    float3 Specular;
};

ColorPair ComputeLights(float3 eyeVector, float3 worldNormal, uniform int numLights)
{
    float3x3 lightDirections = 0;
    float3x3 lightDiffuse = 0;
    float3x3 lightSpecular = 0;
    float3x3 halfVectors = 0;
    
    [unroll]
    for (int i = 0; i < numLights; i++)
    {
        lightDirections[i] = float3x3(DirLight0Direction, DirLight1Direction, DirLight2Direction)[i];
        lightDiffuse[i] = float3x3(DirLight0DiffuseColor, DirLight1DiffuseColor, DirLight2DiffuseColor)[i];
        lightSpecular[i] = float3x3(DirLight0SpecularColor, DirLight1SpecularColor, DirLight2SpecularColor)[i];
        halfVectors[i] = normalize(eyeVector - lightDirections[i]);
    }

    float3 dotL = mul(-lightDirections, worldNormal);
    float3 dotH = mul(halfVectors, worldNormal);
    
    float3 zeroL = step(0, dotL);

    float3 diffuse  = zeroL * dotL;
    float3 specular = pow(max(dotH, 0) * zeroL, SpecularPower);

    ColorPair result;
    result.Diffuse = mul(diffuse, lightDiffuse) * DiffuseColor.rgb + EmissiveColor;
    result.Specular = mul(specular, lightSpecular) * SpecularColor;
    return result;
}

VSOutput VSBasic(VSInput input)
{
    VSOutput output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor;
    output.Specular = float4(0, 0, 0, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutputNoFog VSBasicNoFog(VSInput input)
{
    VSOutputNoFog output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor;
    return output;
}

VSOutput VSBasicVertexColor(VSInputVc input)
{
    VSOutput output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor * input.Color;
    output.Specular = float4(0, 0, 0, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutputNoFog VSBasicVertexColorNoFog(VSInputVc input)
{
    VSOutputNoFog output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor * input.Color;
    return output;
}

VSOutputTx VSBasicTexture(VSInputTx input)
{
    VSOutputTx output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor;
    output.Specular = float4(0, 0, 0, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputTxNoFog VSBasicTextureNoFog(VSInputTx input)
{
    VSOutputTxNoFog output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor;
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputTx VSBasicTextureVertexColor(VSInputTxVc input)
{
    VSOutputTx output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor * input.Color;
    output.Specular = float4(0, 0, 0, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputTxNoFog VSBasicTextureVertexColorNoFog(VSInputTxVc input)
{
    VSOutputTxNoFog output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = DiffuseColor * input.Color;
    output.TexCoord = input.TexCoord;
    return output;
}


// Vertex Shader - Vertex Lighting


VSOutput VSBasicVertexLighting(VSInputNm input)
{
    VSOutput output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a);
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutput VSBasicVertexLightingVertexColor(VSInputNmVc input)
{
    VSOutput output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a) * input.Color;
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutputTx VSBasicVertexLightingTexture(VSInputNmTx input)
{
    VSOutputTx output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a);
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputTx VSBasicVertexLightingTextureVertexColor(VSInputNmTxVc input)
{
    VSOutputTx output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a) * input.Color;
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutput VSBasicOneLight(VSInputNm input)
{
    VSOutput output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 1);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a);
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutput VSBasicOneLightVertexColor(VSInputNmVc input)
{
    VSOutput output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 1);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a) * input.Color;
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    return output;
}

VSOutputTx VSBasicOneLightTexture(VSInputNmTx input)
{
    VSOutputTx output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 1);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a);
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputTx VSBasicOneLightTextureVertexColor(VSInputNmTxVc input)
{
    VSOutputTx output;
    float4 pos_ws = mul(input.Position, World);
    float3 eyeVector = normalize(EyePosition - pos_ws.xyz);
    float3 worldNormal = normalize(mul(input.Normal, WorldInverseTranspose));

    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 1);
    
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.Diffuse = float4(lightResult.Diffuse, DiffuseColor.a) * input.Color;
    output.Specular = float4(lightResult.Specular, saturate(dot(input.Position, FogVector)));
    output.TexCoord = input.TexCoord;
    return output;
}


// Vertex Shader - Pixel Lighting


VSOutputPixelLighting VSBasicPixelLighting(VSInputNm input)
{
    VSOutputPixelLighting output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.PositionWS = float4(mul(input.Position, World).xyz, saturate(dot(input.Position, FogVector)));
    output.NormalWS = normalize(mul(input.Normal, WorldInverseTranspose));
    output.Diffuse = float4(1, 1, 1, DiffuseColor.a);
    return output;
}

VSOutputPixelLighting VSBasicPixelLightingVertexColor(VSInputNmVc input)
{
    VSOutputPixelLighting output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.PositionWS = float4(mul(input.Position, World).xyz, saturate(dot(input.Position, FogVector)));
    output.NormalWS = normalize(mul(input.Normal, WorldInverseTranspose));
    output.Diffuse.rgb = input.Color.rgb;
    output.Diffuse.a = input.Color.a * DiffuseColor.a;
    return output;
}

VSOutputPixelLightingTx VSBasicPixelLightingTexture(VSInputNmTx input)
{
    VSOutputPixelLightingTx output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.PositionWS = float4(mul(input.Position, World).xyz, saturate(dot(input.Position, FogVector)));
    output.NormalWS = normalize(mul(input.Normal, WorldInverseTranspose));
    output.Diffuse = float4(1, 1, 1, DiffuseColor.a);
    output.TexCoord = input.TexCoord;
    return output;
}

VSOutputPixelLightingTx VSBasicPixelLightingTextureVertexColor(VSInputNmTxVc input)
{
    VSOutputPixelLightingTx output;
    output.PositionPS = mul(input.Position, WorldViewProj);
    output.PositionWS = float4(mul(input.Position, World).xyz, saturate(dot(input.Position, FogVector)));
    output.NormalWS = normalize(mul(input.Normal, WorldInverseTranspose));
    output.Diffuse.rgb = input.Color.rgb;
    output.Diffuse.a = input.Color.a * DiffuseColor.a;
    output.TexCoord = input.TexCoord;
    return output;
}


// Pixel Shader


float4 PSBasic(PSInput input) : SV_Target0
{
    float4 color = input.Diffuse;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.Specular.w);
    return color;
}

float4 PSBasicNoFog(PSInputNoFog input) : SV_Target0
{
    return input.Diffuse;
}

float4 PSBasicTexture(PSInputTx input) : SV_Target0
{
    float4 color = Texture.Sample(TextureSampler, input.TexCoord) * input.Diffuse;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.Specular.w);
    return color;
}

float4 PSBasicTextureNoFog(PSInputTxNoFog input) : SV_Target0
{
    return Texture.Sample(TextureSampler, input.TexCoord) * input.Diffuse;
}

float4 PSBasicVertexLighting(PSInput input) : SV_Target0
{
    float4 color = input.Diffuse;
    color.rgb += input.Specular.rgb * color.a;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.Specular.w);
    return color;
}

float4 PSBasicVertexLightingNoFog(PSInput input) : SV_Target0
{
    float4 color = input.Diffuse;
    color.rgb += input.Specular.rgb * color.a;
    return color;
}

float4 PSBasicVertexLightingTexture(PSInputTx input) : SV_Target0
{
    float4 color = Texture.Sample(TextureSampler, input.TexCoord) * input.Diffuse;
    color.rgb += input.Specular.rgb * color.a;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.Specular.w);
    return color;
}

float4 PSBasicVertexLightingTextureNoFog(PSInputTx input) : SV_Target0
{
    float4 color = Texture.Sample(TextureSampler, input.TexCoord) * input.Diffuse;
    color.rgb += input.Specular.rgb * color.a;
    return color;
}

float4 PSBasicPixelLighting(PSInputPixelLighting input) : SV_Target0
{
    float4 color = input.Diffuse;

    float3 eyeVector = normalize(EyePosition - input.PositionWS.xyz);
    float3 worldNormal = normalize(input.NormalWS);
    
    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);

    color.rgb *= lightResult.Diffuse;
    color.rgb += lightResult.Specular * color.a;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.PositionWS.w);
    return color;
}

float4 PSBasicPixelLightingTexture(PSInputPixelLightingTx input) : SV_Target0
{
    float4 color = Texture.Sample(TextureSampler, input.TexCoord) * input.Diffuse;
    
    float3 eyeVector = normalize(EyePosition - input.PositionWS.xyz);
    float3 worldNormal = normalize(input.NormalWS);
    
    ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
    
    color.rgb *= lightResult.Diffuse;
    color.rgb += lightResult.Specular * color.a;
    color.rgb = lerp(color.rgb, FogColor * color.a, input.PositionWS.w);
    return color;
}

technique10 BasicEffect
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasic()));
		SetPixelShader(CompileShader(ps_4_0, PSBasic()));
	}
}

technique10 BasicEffectNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicNoFog()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicNoFog()));
	}
}

technique10 BasicEffectVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasic()));
	}
}

technique10 BasicEffectVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexColorNoFog()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicNoFog()));
	}
}

technique10 BasicEffectTexture
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicTexture()));
	}
}

technique10 BasicEffectTextureNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicTextureNoFog()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicTextureNoFog()));
	}
}

technique10 BasicEffectTextureVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicTexture()));
	}
}

technique10 BasicEffectTextureVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicTextureVertexColorNoFog()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicTextureNoFog()));
	}
}


// Vertex Lighting


technique10 BasicEffectVertexLighting
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLighting()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLighting()));
	}
}

technique10 BasicEffectVertexLightingNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLighting()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingNoFog()));
	}
}

technique10 BasicEffectVertexLightingVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLighting()));
	}
}

technique10 BasicEffectVertexLightingVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingNoFog()));
	}
}

technique10 BasicEffectVertexLightingTexture
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTexture()));
	}
}

technique10 BasicEffectVertexLightingTextureNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTextureNoFog()));
	}
}

technique10 BasicEffectVertexLightingTextureVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTexture()));
	}
}

technique10 BasicEffectVertexLightingTextureVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicVertexLightingTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTextureNoFog()));
	}
}


// One Light


technique10 BasicEffectOneLight
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLight()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLighting()));
	}
}

technique10 BasicEffectOneLightNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLight()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingNoFog()));
	}
}

technique10 BasicEffectOneLightVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLighting()));
	}
}

technique10 BasicEffectOneLightVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingNoFog()));
	}
}

technique10 BasicEffectOneLightTexture
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTexture()));
	}
}

technique10 BasicEffectOneLightTextureNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTextureNoFog()));
	}
}

technique10 BasicEffectOneLightTextureVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTexture()));
	}
}

technique10 BasicEffectOneLightTextureVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicOneLightTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicVertexLightingTextureNoFog()));
	}
}


// Pixel Lighting


technique10 BasicEffectPixelLighting
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLighting()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLighting()));
	}
}

technique10 BasicEffectPixelLightingNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLighting()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLighting()));
	}
}

technique10 BasicEffectPixelLightingVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLighting()));
	}
}

technique10 BasicEffectPixelLightingVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLighting()));
	}
}

technique10 BasicEffectPixelLightingTexture
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLightingTexture()));
	}
}

technique10 BasicEffectPixelLightingTextureNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingTexture()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLightingTexture()));
	}
}

technique10 BasicEffectPixelLightingTextureVertexColor
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLightingTexture()));
	}
}

technique10 BasicEffectPixelLightingTextureVertexColorNoFog
{
	pass Basic
	{
		SetVertexShader(CompileShader(vs_4_0, VSBasicPixelLightingTextureVertexColor()));
		SetPixelShader(CompileShader(ps_4_0, PSBasicPixelLightingTexture()));
	}
}