//Copyright 2014 JogAmp Community. All rights reserved.

#if __VERSION__ >= 130
  #define attribute in
  #define varying out
#endif

uniform vec2    svr_EyeToSourceUVScale;
uniform vec2    svr_EyeToSourceUVOffset;
uniform mat4    svr_EyeRotationStart;
uniform mat4    svr_EyeRotationEnd;

attribute vec2  svr_Position;
attribute vec2  svr_Params;
attribute vec2  svr_TexCoordR;

varying vec3    svv_Fade;
varying vec2    svv_TexCoordR;

void main(void)
{
    gl_Position = vec4(svr_Position.xy, 0.0, 1.0);
    svv_Fade = vec3(svr_Params.r); // vignetteFade
    
    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
    // These are now "real world" vectors in direction (x,y,1) relative to the eye of the HMD.
    vec3 TanEyeAngle = vec3 ( svr_TexCoordR, 1.0 );
    
    // Accurate time warp lerp vs. faster
    // Apply the two 3x3 timewarp rotations to these vectors.
	vec3 TransformedStart = (svr_EyeRotationStart * vec4(TanEyeAngle, 0)).xyz;
	vec3 TransformedEnd   = (svr_EyeRotationEnd * vec4(TanEyeAngle, 0)).xyz;
    // And blend between them.
    vec3 Transformed = mix ( TransformedStart, TransformedEnd, svr_Params.g /* timewarpLerpFactor */ );
    
    // Project them back onto the Z=1 plane of the rendered images.
    float RecipZ = 1.0 / Transformed.z;
    vec2 Flattened = vec2 ( Transformed.x * RecipZ, Transformed.y * RecipZ );
    
    // These are now still in TanEyeAngle space.
    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)
    svv_TexCoordR = Flattened * svr_EyeToSourceUVScale + svr_EyeToSourceUVOffset;
    svv_TexCoordR.y = 1.0-svv_TexCoordR.y;
}
