#version 140

// Positions can be world or local space, since world and normal
// matrices are identity for world vertex space materials.
// If world vertex space is selected, you can remove the
// normal matrix multiplication for optimal performance.

in highp vec4 position;
in mediump vec2 texcoord0;
in mediump vec3 normal;

// When 'mtx_world' and 'mtx_normal' is specified as attributes,
// instanced rendering is automatically triggered.
// To read more about instancing in Defold, navigate to
// https://defold.com/manuals/material/#instancing
in mediump mat4 mtx_world;
in mediump mat4 mtx_normal;

out highp vec4 var_position;
out mediump vec3 var_normal;
out mediump vec2 var_texcoord0;

uniform vs_uniforms {
  mediump mat4 mtx_view;
  mediump mat4 mtx_proj;
};

void main() {
  vec4 p = mtx_view * mtx_world * vec4(position.xyz, 1.0);
  var_position = p;
  var_texcoord0 = texcoord0;
  var_normal = normalize((mtx_normal * vec4(normal, 0.0)).xyz);
  gl_Position = mtx_proj * p;
}
