const int MAX_JOINTS = 60;
//const int MAX_WEIGHTS = 3;

// MVP matrices
uniform mat4 u_MMatrix;
uniform mat4 u_VMatrix;
uniform mat4 u_PMatrix;

// mesh
attribute vec4 a_Position;

// textures
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;

// animation
attribute vec3 in_jointIndices;
attribute vec3 in_weights;
uniform mat4 u_BindShapeMatrix;
uniform mat4 jointTransforms[MAX_JOINTS];

void main(){

    vec4 bindPos = u_BindShapeMatrix * a_Position;

    vec4 totalLocalPos = vec4(0.0);

    mat4 jointTransform = jointTransforms[int(in_jointIndices[0])];
    vec4 posePosition = jointTransform * bindPos;
    totalLocalPos += posePosition * in_weights[0];

    jointTransform = jointTransforms[int(in_jointIndices[1])];
    posePosition = jointTransform * bindPos;
    totalLocalPos += posePosition * in_weights[1];

    jointTransform = jointTransforms[int(in_jointIndices[2])];
    posePosition = jointTransform * bindPos;
    totalLocalPos += posePosition * in_weights[2];

    // calculate MVP matrix
    mat4 u_MVMatrix = u_VMatrix * u_MMatrix;
    mat4 u_MVPMatrix = u_PMatrix * u_MVMatrix;

    // calculate rendered position
    gl_Position = u_MVPMatrix * totalLocalPos;

    // pass texture to fragment shader
    v_TexCoordinate = a_TexCoordinate;
}