#version 330 core uniform mat4 u_mvp; layout (location = 0) in vec3 position; layout (location = 1) in vec3 normal; layout (location = 2) in vec2 texcoord; layout (location = 3) in vec3 tangent; layout (location = 4) in vec3 bitangent; layout (location = 5) in uvec4 bone_ids; // Skinning (experimental) layout (location = 6) in vec4 weights; out vec3 v_position; out vec3 v_normal; out vec3 v_proj_normal; out vec2 v_texcoord; out vec3 v_tangent; out vec3 v_bitangent; out float v_id; const int MAX_BONES = 48; uniform mat4 u_bones[MAX_BONES]; uniform int u_has_bones; void main() { v_position = position; v_normal = normal; v_proj_normal = vec4(u_mvp * vec4(normal, 1.0)).xyz; v_texcoord = vec2(texcoord.x, -texcoord.y); v_tangent = tangent; v_bitangent = bitangent; v_id = gl_VertexID; if (u_has_bones == 1) { mat4 bone_transform = u_bones[bone_ids[0]] * weights[0]; bone_transform += u_bones[bone_ids[1]] * weights[1]; bone_transform += u_bones[bone_ids[2]] * weights[2]; bone_transform += u_bones[bone_ids[3]] * weights[3]; gl_Position = u_mvp * (bone_transform * vec4(v_position, 1.0)); return; } gl_Position = u_mvp * vec4(v_position, 1.0); }