#version 450

layout (constant_id = 0) const bool IQMDepthOnly = false;

layout (set = 0, binding = 0) uniform Matrices {
	mat4 Projection3d;
	mat4 View;
	mat4 Sky;
	mat4 Projection2d;
};

layout (set = 2, binding = 0) buffer Bones {
	// NOTE these are transposed, so v * m
	mat3x4      bones[];
};

layout (push_constant) uniform PushConstants {
	mat4 Model;
	float blend;
};

layout (location = 0) in vec3 vposition;
layout (location = 1) in uvec4 vbones;
layout (location = 2) in vec4 vweights;
layout (location = 3) in vec2 vtexcoord;
layout (location = 4) in vec3 vnormal;
layout (location = 5) in vec4 vtangent;
layout (location = 6) in vec4 vcolor;

layout (location = 0) out vec2 texcoord;
layout (location = 1) out vec4 position;
layout (location = 2) out vec3 normal;
layout (location = 3) out vec3 tangent;
layout (location = 4) out vec3 bitangent;
layout (location = 5) out vec4 color;

void
main (void)
{
	mat3x4      m = bones[vbones.x] * vweights.x;
	m += bones[vbones.y] * vweights.y;
	m += bones[vbones.z] * vweights.z;
	m += bones[vbones.w] * vweights.w;
	vec4        pos = Model * vec4 (vec4(vposition, 1) * m, 1);
	gl_Position = Projection3d * (View * pos);

	if (!IQMDepthOnly) {
		position = pos;
		mat3 adjTrans = mat3 (cross(m[1].xyz, m[2].xyz),
							  cross(m[2].xyz, m[0].xyz),
							  cross(m[0].xyz, m[1].xyz));
		normal = normalize (mat3 (Model) * vnormal * adjTrans);
		tangent = mat3 (Model) * vtangent.xyz * adjTrans;
		tangent = normalize (tangent - dot (tangent, normal) * normal);
		bitangent = cross (normal, tangent) * vtangent.w;
		texcoord = vtexcoord;
		color = vcolor;
	}
}