// This is C8E5v_bumpAny from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard.  See page 216.

// NOTE:  The version below corrects the book's version by computing
// the binormal using the formula B = N cross T (page 215) rather
// than T cross B.

void C8E5v_bumpAny(float3 position : POSITION,
                   float3 normal   : NORMAL,
                   float3 tangent  : TEXCOORD1,
                   float2 texCoord : TEXCOORD0,

               out float4 oPosition      : POSITION,
               out float2 normalMapCoord : TEXCOORD0,
               out float3 lightDirection : TEXCOORD1,

           uniform float3   lightPosition,  // Object-space
           uniform float3   eyePosition,    // Object-space
           uniform float4x4 modelViewProj)
{
  oPosition = mul(modelViewProj, float4(position, 1));

  // Compute the object-space light vector
  lightDirection = lightPosition - position;

  // Construct object space to texture space 3x3 matrix
  float3 binormal = cross(normal, tangent);
  float3x3 rotation = float3x3(tangent,
                               binormal,
                               normal);
  // Rotate the light vector using the matrix
  lightDirection = mul(rotation, lightDirection);

  normalMapCoord = texCoord;
}

