/////////////////////////////////////////////////////////////////////////////////
//
// shadowreceivervp.cg
//
// Hamilton Chong
// (c) 2006
//
// This is an example vertex shader for shadow receiver objects.  
//
/////////////////////////////////////////////////////////////////////////////////

// Define inputs from application.
struct VertexIn
{
  float4 position       : POSITION;     // vertex position in object space
  float4 normal         : NORMAL;       // vertex normal in object space
};

// Define outputs from vertex shader.
struct Vertex
{
  float4 position       : POSITION;     // vertex position in post projective space
  float4 shadowCoord    : TEXCOORD0;    // vertex position in shadow map coordinates
  float  diffuse        : TEXCOORD1;    // diffuse shading value
};

Vertex main(VertexIn         In,
            uniform float4x4 uModelViewProjection,   // model-view-projection matrix
            uniform float4   uLightPosition,         // light position in object space
            uniform float4x4 uModel,                 // model matrix
            uniform float4x4 uTextureViewProjection  // shadow map's view projection matrix
            )
{
    Vertex Out;

    // compute diffuse shading
    float3 lightDirection = normalize(uLightPosition.xyz - In.position.xyz);
    Out.diffuse = dot(In.normal.xyz, lightDirection);

    // compute shadow map lookup coordinates
    Out.shadowCoord = mul(uTextureViewProjection, mul(uModel, In.position));

    // compute vertex's homogenous screen-space coordinates
    Out.position = mul(uModelViewProjection, In.position);

    return Out;
}