#version 330
layout(location = 0) in vec3 aPosition;
layout(location = 1) in vec3 aNormal;

// Solid color input from application
uniform vec3 uColor;

// Color to output to fragment shader
out vec4 vColor;
out vec3 vPosition;
out vec3 vNormal;

// Additional uniform to allow CPU to provide mat3(transpose(inverse(uModel)))
// + Makes a big difference in quality of diffuse shading
// + QMatrix4x4.normalMatrix() returns a mat3 that can be used as a uniform
uniform mat3 uModelInverseTransposed;
// Model View Projection matrix found by P * V * M
uniform mat4 uModel;
uniform mat4 uView;
uniform mat4 uProjection;

void main()
{
  mat4 mvp = uProjection * uView * uModel;

  gl_Position = mvp * vec4(aPosition, 1.0);

  vPosition = vec3(uModel * vec4(aPosition, 1.0f));
  vColor = vec4(uColor, 1.0f);

  vNormal = uModelInverseTransposed * aNormal;
  //  vNormal = aNormal; // This is possible without the additional uniform
  // Or you could find this on the GPU using the uModel matrix
  //  vNormal = mat3(transpose(inverse(uModel))) * aNormal;
}