#version 330 core

layout(location = 0) in vec3 aPos;      // Vertex position
layout(location = 1) in vec2 aTexCoord; // Texture coordinate
layout(location = 2) in vec3 aNormal;   // Vertex normal

uniform mat4 uMVP;    // Model-View-Projection matrix
uniform mat4 uModel;  // Model matrix

out vec2 TexCoord;    // Passed to fragment shader
out vec3 Normal;      // Passed to fragment shader
out vec3 FragPos;     // Passed to fragment shader

void main()
{
    // Compute the fragment position in world space
    FragPos = vec3(uModel * vec4(aPos, 1.0));
    
    // Transform the normal vector
    Normal = mat3(transpose(inverse(uModel))) * aNormal;  
    
    // Pass through the texture coordinate
    TexCoord = aTexCoord;
    
    // Final vertex position
    gl_Position = uMVP * vec4(aPos, 1.0);
}