#version 330 core

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec2 vertexTexCoord;
// TODO: Put rest of vertex attributes here.
layout(location = 5) in vec4 boneWeights;
layout(location = 6) in vec4 boneIndices;

uniform mat4 worldViewProjection;
uniform bool useSkeletalAnimation;
uniform mat4 boneMatrices[60];

out vec3 position;
out vec2 texCoord;

void main()
{
    vec4 localPosition = vec4(0);
    if (useSkeletalAnimation)
    {
        vec4 vertex = vec4(vertexPosition, 1.0);

        int i0 = int(boneIndices.x);
        int i1 = int(boneIndices.y);
        int i2 = int(boneIndices.z);
        int i3 = int(boneIndices.w);

        localPosition += boneMatrices[i0] * vertex * boneWeights.x;
        localPosition += boneMatrices[i1] * vertex * boneWeights.y;
        localPosition += boneMatrices[i2] * vertex * boneWeights.z;
        localPosition += boneMatrices[i3] * vertex * boneWeights.w;
    }
    else
    {
        localPosition = vec4(vertexPosition, 1.0);
    }
    gl_Position = worldViewProjection * localPosition;
    texCoord = vertexTexCoord;
}