#version 120
const int nLightCount = 2;
attribute vec4 in_vertex;
attribute vec3 in_normal;
attribute vec2 in_uv;
attribute vec4 in_color;
attribute vec4 in_uv2;
 
uniform float time;
//uniform vec3 wsPos;
uniform vec4 wsRot;
 
varying vec4 uvNoise;
varying vec3 normal, v, vertCol;
varying vec2 uv, uv2, uv3, uvB[4];
varying float pulse;
varying vec3 light[nLightCount];
varying vec3 origo;
 
const vec2 fractions = vec2(0.984375, 0.0078125);
 
float square(float x) {
    return x*x;
}
 
vec3 wsAllign(vec3 x){
    return x + 2.0 * cross(wsRot.xyz, cross(wsRot.xyz, x) + wsRot.w * x);
}
 
vec2 invertBlurEdge(vec2 uvB){
    return abs(fract((uvB + 1.0) * 0.5) - 0.5) * 2.0;
}
 
void main()
{
    origo = in_vertex.xyz;
    pulse = abs(time  * 2.0 - 1.0);
    vec4 pos = gl_ModelViewMatrix * in_vertex;
   
    // convert view, normal and light vectors to world space and quaternion correct for model rotation
    mat3 tcamrot = transpose(mat3x3(gl_ModelViewMatrix));
    v = normalize(wsAllign(normalize(tcamrot * -pos.xyz)));
   
    // special view vector to correct just for cubemap reflections
    normal = normalize(tcamrot * (gl_NormalMatrix * wsAllign(normalize(in_normal))));
    for (int i = 0; i < nLightCount; i++) {
        light[i] = wsAllign(((tcamrot * (((gl_LightSource[i].position)).xyz - pos.xyz))));
    }
   
    uv = in_uv;//gridUV.xy * 3.0; // still 1/3rd to compensate for vert precision
    uv2 = in_uv2.xy;
    uv3 = in_uv2.zw;
 
    uv3.x = 1.0 - uv3.x;
   
    vertCol = in_color.rgb;
   
    gl_Position = gl_ProjectionMatrix * pos;
}
