struct VS_INPUT
{
	float4 Position : POSITION;
	float3 Normal   : NORMAL;
	float4 Diffuse  : COLOR0;
	float4 Tex0     : TEXCOORD0;
};
struct VS_OUTPUT
{
	float4 Position : POSITION;
	float4 Diffuse  : COLOR0;
	float4 Tex0     : TEXCOORD0;
};


VS_OUTPUT main(VS_INPUT VertIn,                // Vertex reçu en entrée
               uniform float4x4 ModelViewProj, // Matrice de transformation espace modèle -> espace écran
               uniform float4x4 ModelView,     // Matrice de transformation espace modèle -> espace caméra
               uniform float3   LightDir,      // Direction de la lumière
               uniform float    Scale)         // Echelle d'étirement des vertices
{
	VS_OUTPUT VertOut;

	// Etirement des vertices
	float3 Pos = VertIn.Position + VertIn.Normal * Scale;

	// Transformation des normales dans l'espace caméra
	float3 Norm = normalize(mul(ModelView, float4(VertIn.Normal, 0)));

	// Calcul de l'angle entre la normale du vertex et la direction de la lumière
	float Lum = (dot(-LightDir, Norm) + 1.0) / 2;

	// Calcul de la position et couleur finale
	VertOut.Position = mul(ModelViewProj, float4(Pos, 1.0));
	VertOut.Diffuse  = Lum * VertIn.Diffuse;
	VertOut.Tex0     = VertIn.Tex0;

	return VertOut;
}
