//version 330 core

layout(location = 0) in vec3 in_pos;
layout(location = 1) in vec2 in_texcoord;
layout(location = 2) in vec3 in_normal;
layout(location = 3) in vec4 in_tangent; // vec3 + bi sign
//in vec3 in_binormal;

out vec3 out_normal;
out vec3 out_tangent;
out vec3 out_binormal;
out vec2 out_texcoord;
out vec3 out_worldpos;
out vec3 out_viewpos;
out vec3 out_to_camera;

uniform mat4x4 mat_projection;
uniform mat4x4 mat_view;
uniform mat4x4 mat_view_inverse;
uniform mat4x4 mat_world;

void main()
{
  vec4 o = vec4( in_pos.x, in_pos.y, in_pos.z, 1.0 );
  o = mat_world * o;
  out_worldpos = o.xyz;
  o = mat_view * o;
  out_viewpos = o.xyz;

  vec3 to_camera = normalize( -o.xyz );
  out_to_camera = mat3( mat_view_inverse ) * to_camera;

  o = mat_projection * o;
  gl_Position = o;


#if 0
      // compute tangent T and bitangent B
      vec3 Q1 = dFdx(in_pos);
      vec3 Q2 = dFdy(in_pos);
      vec2 st1 = dFdx(in_texcoord);
      vec2 st2 = dFdy(in_texcoord);

      vec3 T = normalize(Q1*st2.t - Q2*st1.t);
      vec3 B = normalize(-Q1*st2.s + Q2*st1.s);
      vec3 in_binormal = B;
#else
      vec3 in_binormal = cross(in_normal, in_tangent.xyz) * in_tangent.w;
#endif


  out_normal = normalize( mat3( mat_world ) * in_normal );
  out_tangent = normalize( mat3( mat_world ) * in_tangent.xyz );
  out_binormal = normalize( mat3( mat_world ) * in_binormal );
  out_texcoord = in_texcoord;
}