#version 450 #include layout(push_constant) uniform ProjectionData { mat4 mvp; mat3x4 normal_matrix; }; layout(location = 0) in vec3 position; layout(location = 1) in vec3 normal; layout(location = 2) in vec2 uv; layout(location = 3) in ivec4 affecting_bones_indices; layout(location = 4) in vec4 weights; layout(location = 0) out vec3 o_norm; layout(location = 1) out vec2 o_uv; layout(set = 2, binding = 0) buffer Bones { Bone bones[]; } bones; void main() { vec4 new_vertex = weights.x * transform_by_bone(vec4(position, 1.0), (bones.bones[affecting_bones_indices.x])) + weights.y * transform_by_bone(vec4(position, 1.0), (bones.bones[affecting_bones_indices.y])) + weights.z * transform_by_bone(vec4(position, 1.0), (bones.bones[affecting_bones_indices.z])) + weights.w * transform_by_bone(vec4(position, 1.0), (bones.bones[affecting_bones_indices.w])); o_norm = mat3(normal_matrix) * normal; o_norm = (weights.x * transform_normal_by_bone(vec4(o_norm, 0.0), (bones.bones[affecting_bones_indices.x])) + weights.y * transform_normal_by_bone(vec4(o_norm, 0.0), (bones.bones[affecting_bones_indices.y])) + weights.z * transform_normal_by_bone(vec4(o_norm, 0.0), (bones.bones[affecting_bones_indices.z])) + weights.w * transform_normal_by_bone(vec4(o_norm, 0.0), (bones.bones[affecting_bones_indices.w]))).xyz; o_uv = uv; gl_Position = mvp * vec4(new_vertex.xyz, 1.0); }