attribute highp vec3 position;
attribute mediump vec3 normal;
attribute mediump vec4 color;
attribute mediump vec2 uv;
 
varying highp vec3 posVarying;
varying mediump vec3 normalVarying;
varying mediump vec4 colorVarying;
varying mediump vec2 uvVarying;
varying mediump vec3 lightVarying;
varying mediump vec4 ShadowCoord;
 
uniform highp mat4 agk_World;
uniform highp mat4 agk_ViewProj;
uniform highp mat3 agk_WorldNormal;
uniform mediump vec4 uvBounds0;
uniform highp vec4 LightMVPVector[4];

mediump vec3 GetVSLighting( mediump vec3 normal, highp vec3 pos );

const mat4 biasMatrix = mat4(0.5, 0.0, 0.0, 0.0,
							 0.0, 0.5, 0.0, 0.0,
							 0.0, 0.0, 0.5, 0.0,
							 0.5, 0.5, 0.5, 1.0);
							
mat4 lightMVPMatrix = mat4(LightMVPVector[0],
						   LightMVPVector[1],
						   LightMVPVector[2],
						   LightMVPVector[3]);
void main()
{
    uvVarying = uv * uvBounds0.xy + uvBounds0.zw;
    highp vec4 pos = agk_World * vec4(position,1.0);
    mediump vec3 norm = normalize(agk_WorldNormal * normal);
    posVarying = pos.xyz;
    normalVarying = norm;
	colorVarying = color;
    lightVarying = GetVSLighting( norm, posVarying );

	gl_Position = agk_ViewProj * pos;
	ShadowCoord = biasMatrix * lightMVPMatrix * pos;
}