/////////////////////////////////////////////////////////////////////////////////
//
// shadowcastervp.cg
//
// Hamilton Chong
// (c) 2006
//
// This is an example vertex shader for shadow caster 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 VertexOut
{
  float4 position   : POSITION;     // post projection position coordinates
  float4 pos  	    : TEXCOORD0;    // ditto. Not all hardware allows access values bound to POSITION in fp.
  float4 normal     : TEXCOORD1;    // normal in object space (to be interpolated)
  float4 modelPos   : TEXCOORD2;    // position in object space (to be interpolated) 
};

VertexOut main( VertexIn         In,                   // vertex to process
                uniform float4x4 uModelViewProjection  // model-view-projection matrix
              )
{
    VertexOut Out;   // output data
    
    // Transform vertex position into post projective (homogenous screen) space.
    Out.position = mul(uModelViewProjection, In.position);
    Out.pos      = mul(uModelViewProjection, In.position);

    // copy over data to interpolate using perspective correct interpolation
    Out.normal = float4(In.normal.x, In.normal.y, In.normal.z, 0.0);
    Out.modelPos = In.position;

    return Out;
}