#version 300 es

layout(std140) uniform vs_ub
{
    vec4 u_DirLightSourceDirection[1];
    vec4 u_SpotLightSourceDirection[1];
    vec4 u_PointLightSourcePosition[1];
    vec4 u_SpotLightSourcePosition[1];
    mat4 u_MVPMatrix;
    mat4 u_MVMatrix;
    mat4 u_PMatrix;
    mat3 u_NormalMatrix;
} _21;

layout(location = 0) in vec4 a_position;
layout(location = 8) in vec3 a_tangent;
layout(location = 9) in vec3 a_binormal;
layout(location = 1) in vec3 a_normal;
out vec3 v_dirLightDirection[1];
out vec3 v_vertexToPointLightDirection[1];
out vec3 v_vertexToSpotLightDirection[1];
out vec3 v_spotLightDirection[1];
out vec2 v_texCoord;
layout(location = 2) in vec2 a_texCoord;

void main()
{
    vec4 ePosition = _21.u_MVMatrix * a_position;
    vec3 eTangent = normalize(_21.u_NormalMatrix * a_tangent);
    vec3 eBinormal = normalize(_21.u_NormalMatrix * a_binormal);
    vec3 eNormal = normalize(_21.u_NormalMatrix * a_normal);
    for (int i = 0; i < 1; i++)
    {
        v_dirLightDirection[i].x = dot(eTangent, vec3(_21.u_DirLightSourceDirection[((i * 3) + 0) / 4][((i * 3) + 0) % 4], _21.u_DirLightSourceDirection[((i * 3) + 1) / 4][((i * 3) + 1) % 4], _21.u_DirLightSourceDirection[((i * 3) + 2) / 4][((i * 3) + 2) % 4]));
        v_dirLightDirection[i].y = dot(eBinormal, vec3(_21.u_DirLightSourceDirection[((i * 3) + 0) / 4][((i * 3) + 0) % 4], _21.u_DirLightSourceDirection[((i * 3) + 1) / 4][((i * 3) + 1) % 4], _21.u_DirLightSourceDirection[((i * 3) + 2) / 4][((i * 3) + 2) % 4]));
        v_dirLightDirection[i].z = dot(eNormal, vec3(_21.u_DirLightSourceDirection[((i * 3) + 0) / 4][((i * 3) + 0) % 4], _21.u_DirLightSourceDirection[((i * 3) + 1) / 4][((i * 3) + 1) % 4], _21.u_DirLightSourceDirection[((i * 3) + 2) / 4][((i * 3) + 2) % 4]));
    }
    for (int i_1 = 0; i_1 < 1; i_1++)
    {
        vec3 pointLightDir = vec3(_21.u_PointLightSourcePosition[((i_1 * 3) + 0) / 4][((i_1 * 3) + 0) % 4], _21.u_PointLightSourcePosition[((i_1 * 3) + 1) / 4][((i_1 * 3) + 1) % 4], _21.u_PointLightSourcePosition[((i_1 * 3) + 2) / 4][((i_1 * 3) + 2) % 4]) - ePosition.xyz;
        v_vertexToPointLightDirection[i_1].x = dot(eTangent, pointLightDir);
        v_vertexToPointLightDirection[i_1].y = dot(eBinormal, pointLightDir);
        v_vertexToPointLightDirection[i_1].z = dot(eNormal, pointLightDir);
    }
    for (int i_2 = 0; i_2 < 1; i_2++)
    {
        vec3 spotLightDir = vec3(_21.u_SpotLightSourcePosition[((i_2 * 3) + 0) / 4][((i_2 * 3) + 0) % 4], _21.u_SpotLightSourcePosition[((i_2 * 3) + 1) / 4][((i_2 * 3) + 1) % 4], _21.u_SpotLightSourcePosition[((i_2 * 3) + 2) / 4][((i_2 * 3) + 2) % 4]) - ePosition.xyz;
        v_vertexToSpotLightDirection[i_2].x = dot(eTangent, spotLightDir);
        v_vertexToSpotLightDirection[i_2].y = dot(eBinormal, spotLightDir);
        v_vertexToSpotLightDirection[i_2].z = dot(eNormal, spotLightDir);
        v_spotLightDirection[i_2].x = dot(eTangent, vec3(_21.u_SpotLightSourceDirection[((i_2 * 3) + 0) / 4][((i_2 * 3) + 0) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 1) / 4][((i_2 * 3) + 1) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 2) / 4][((i_2 * 3) + 2) % 4]));
        v_spotLightDirection[i_2].y = dot(eBinormal, vec3(_21.u_SpotLightSourceDirection[((i_2 * 3) + 0) / 4][((i_2 * 3) + 0) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 1) / 4][((i_2 * 3) + 1) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 2) / 4][((i_2 * 3) + 2) % 4]));
        v_spotLightDirection[i_2].z = dot(eNormal, vec3(_21.u_SpotLightSourceDirection[((i_2 * 3) + 0) / 4][((i_2 * 3) + 0) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 1) / 4][((i_2 * 3) + 1) % 4], _21.u_SpotLightSourceDirection[((i_2 * 3) + 2) / 4][((i_2 * 3) + 2) % 4]));
    }
    v_texCoord = a_texCoord;
    v_texCoord.y = 1.0 - v_texCoord.y;
    gl_Position = _21.u_PMatrix * ePosition;
}

